【JavaSE】类和对象(中)
类和对象(中)
- 4. this引用
- 4.1 为什么要有this引用
- 4.2 什么是this引用
- 4.3 this引用的特性
- 5. 对象的构造及初始化
- 5.1 如何初始化对象
- 5.2 构造方法(构造器)
- 5.2.1 概念
- 5.2.2 特性
- 5.3 默认初始化
- 5.4 就地初始化
- 6. 封装
- 6.1 封装的概念
- 6.2 访问限定符
- 6.3 封装扩展之包
- 6.3.1 包的概念
- 6.3.2 导入包中的类
- 6.3.3 自定义包
- 6.3.5 常见的包
- 6.3.6 封装操作举例
4. this引用
4.1 为什么要有this引用
先看一个日期类的例子:
public class Date {public int year;public int month;public int day;public void setDay(int y, int m, int d){year = y;month = m;day = d;}public void printDate(){System.out.println(year + "/" + month + "/" + day);}public static void main(String[] args) {// 构造三个日期类型的对象 d1 d2 d3Date d1 = new Date();Date d2 = new Date();Date d3 = new Date();// 对d1,d2,d3的日期设置d1.setDay(2020,9,15);d2.setDay(2020,9,16);d3.setDay(2020,9,17);// 打印日期中的内容d1.printDate();d2.printDate();d3.printDate();}
}
//----------------
//打印
2020/9/15
2020/9/16
2020/9/17
但是三个对象都在调用setDate和printDate函数,但是这两个函数中没有任何有关对象的说明,setDate和printDate函数如何知道打印的是那个对象的数据呢
其实在成员方法的第一个形参中默认隐藏了一个this,this引用的是调用成员方法的对象。
4.2 什么是this引用
**this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。**只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
public class Date {public int year;public int month;public int day;public void setDay(int year, int month, int day){this.year = year;this.month = month;this.day = day;}public void printDate(){System.out.println(this.year + "/" + this.month + "/" + this.day);}
}
注意:this引用代表的是的是调用成员方法的对象。
每个成员方法括号中的第一个参数默认是this
注意,我们要习惯使用this。
4.3 this引用的特性
-
this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
-
this只能在"成员方法"中使用
-
在"成员方法"中,this只能引用当前对象,不能再引用其他对象
-
this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法
对象的引用传递给该成员方法,this负责接收
5. 对象的构造及初始化
5.1 如何初始化对象
通过前面知识点的学习知道,在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败。
public static void main(String[] args) {int a;System.out.println(a);
}
// Error:(26, 28) java: 可能尚未初始化变量a
要让上述代码通过编译,非常简单,只需在正式使用a之前,给a设置一个初始值即可。如果是对象:
public class Date {public int year;public int month;public int day;public void setDay(int y, int m, int d){this.year = y;this.month = m;this.day = d;}public void printDate(){System.out.println(year + "/" + month + "/" + day);}
}
public static void main(String[] args) {Date d = new Date();d.printDate();d.setDate(2021,6,9);d.printDate();
}
// 代码可以正常通过编译
需要调用之前写的SetDate方法才可以将具体的日期设置到对象中。通过上述例子发现两个问题:
- 每次对象创建好后调用SetDate方法设置具体日期,比较麻烦,那对象如何快捷进行初始化呢?
- 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?
这两个问题就涉及到了构造方法和默认初始化的问题。
5.2 构造方法(构造器)
5.2.1 概念
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
什么是构造方法?
构造方法非常特殊:这个方法没有返回值,方法名和类名是一样的。
如果我们没有在类中写任何的构造方法,那么Java会帮我们提供一个默认的不带参数的构造方法。
public class Date {public int year;public int month;public int day;public void setDay(int y, int m, int d){year = y;month = m;day = d;}public void printDate(){System.out.println(year + "/" + month + "/" + day);}Date() {System.out.println("这个是构造方法,在实例化对象的时候就会进行调用");}////public static void main(String[] args) {Date date1 = new Date();}
}
//--------------
//编译器运行结果为
//这个是构造方法,在实例化对象的时候就会进行调用
当然在一个类中没有写构造方法的话,Java会默认提供。
但是一个类当中写了构造方法的话,java就不会提供了。
看看效果
public class Date {public int year;public int month;public int day;public void setDay(int y, int m, int d){year = y;month = m;day = d;}public void printDate(){System.out.println(year + "/" + month + "/" + day);}public Date() {System.out.println("这个是构造方法,在实例化对象的时候就会进行调用");}public Date(int year ,int month ,int day) {this.year = year;this.month = month;this.day = day;}////public static void main(String[] args) {Date date1 = new Date(11,11,11);date1.printDate();}
}
//--------------
//编译器运行结果为
//11/11/11
这样我们就可以通过构造方法在进行对象实例化的过程中进行成员变量的初始化。
至于我们写了两个Date函数,那么这两个函数就属于重载关系
public Date() {System.out.println("这个是构造方法,在实例化对象的时候就会进行调用");
}
public Date(int year ,int month ,int day) {this.year = year;this.month = month;this.day = day;
}
重载:方法名相同,参数列表不同,与返回值无关。
我们可以说当一个对象调用完构造函数,那么这个对象就生成了。
因为生成一个对象分为两步1. 为对象分配内存 2. 调用合适的构造方法
补充:
-
对于构造方法,我们不能进行添加
void
因为如果添加了返回值的话,那么就不属于我们的构造方法了。 -
如果自己没有写构造函数,那么编译器会提供一个默认的不带任何参数的构造方法。
5.2.2 特性
-
名字必须与类名相同
-
没有返回值类型,设置为void也不行
-
创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
-
构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
-
如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。一旦用户定义,编译器则不再生成。
如果生成了一个带有参数的构造方法,那么一定要在对象实例化的过程中进行传参,否则会报错。
- 构造方法中,可以通过this调用其他构造方法来简化代码
在这个过程中this代表的是调用当前对象的其他构造方法。
public class Date {public int year;public int month;public int day;public void printDate(){System.out.println(year + "/" + month + "/" + day);}public Date() {this(11,11,11);}public Date(int year ,int month ,int day) {this.year = year;this.month = month;this.day = day;}public static void main(String[] args) {Date date1 = new Date();date1.printDate();}
}
//------------
//编译器运行结果为
//11/11/11
但是在调用其他构造方法的时候有一定的要求:
- 那么就是this语句一定要放在构造方法中作为第一条语句。不然会报错。
-
只能在构造方法内部才能使用,不能在其他方法中使用。
-
不能形成环,否则进行反复调用构造函数,形成封闭循环
- 绝大多数情况下构造函数使用public来修饰,特殊场景下会被private修饰。
至于这个我们先不管,以后会讲。
总结
this.date 访问当前对象的成员变量
this.func() 访问当前对象的成员方法
this() 调用当前对象的其他构造方法
this不能调用静态static修饰的成员方法和变量这个后面我们再说
5.3 默认初始化
为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?
要搞清楚这个过程,就需要知道 new 关键字背后所发生的一些事情:
Date d = new Date(2021,6,9);
在程序层面只是简单的一条语句,在JVM层面需要做好多事情,下面简单介绍下:
-
检测对象对应的类是否加载了,如果没有加载则加载
-
为对象分配内存空间
-
处理并发安全问题
比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突 -
初始化所分配的空间
即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:
数据类型 | 默认值 |
---|---|
byte | 0 |
char | ‘\u0000’ |
short | 0 |
int | 0 |
long | 0L |
boolean | false |
float | 0.0f |
double | 0.0 |
reference | null |
- 设置对象头信息(关于对象内存模型后面会介绍)
- 调用构造方法,给对象中各个成员赋值
所以在调用构造函数进行初始化之前,我们就会进行赋值为默认值。
补充
public只是权限的问题。(只提一下)
局部变量:定义在方法内部的变量。
成员变量:定义在类的内部的变量,定义在成员方法的外部。
定义在成员方法内部的变量就叫做局部变量。
5.4 就地初始化
在声明成员变量时,就对成员变量设置初始值。
public class Date {public int year = 1900;public int month = 1;public int day = 1;//进行就地初始化public Date(){}public Date(int year, int month, int day) {}public static void main(String[] args) {Date d1 = new Date(2021,6,9);Date d2 = new Date();}
}
当然这个除非是业务需求,不然没有提别大的意义,如果成员变量会进行修改,那么就地初始化相当于进行了一个默认值的定义。
6. 封装
6.1 封装的概念
**面向对象程序三大特性:封装、继承、多态。**而类和对象阶段,主要研究的就是封装特性。
何为封装呢?
简单来说就是套壳屏蔽细节。把类的实现细节进行隐藏,对外只提供一些交互的接口。
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互
比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器,USB插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU、显卡、内存等一些硬件元件。
然而要进行封装就涉及到了访问限定符。
6.2 访问限定符
Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符:
private 默认权限 protected public
默认权限就是我们什么都没加的时候的使用默认权限访问限定符。
public class Date {int year;
}
private
权限非常小,被修饰之后只能在自己的类中进行使用。
class Student {public String name;public void show() {System.out.println("姓名" + name);}
}
默认权限default
只能在自己的包中进行使用
这就涉及到了包的概念,如果不懂包是什么,可以先跳过这块继续看下一块的内容。
protect和public以后再讲,因为涉及到了子类的知识
6.3 封装扩展之包
6.3.1 包的概念
要了解封装就要了解权限,要了解权限,就要了解包。
在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组,称为软件包。有点类似于目录。比如:为了更好的管理电脑中的歌曲,一种好的方式就是将相同属性的歌曲放在相同文件下,也可以对某个文件夹下的音乐进行更详细的分类。
包就像文件夹一样,一个文件夹当中不能有相同的文件名,不同文件夹下可以有相同的文件名。
在Java中也引入了包,包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如:一个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在
不同的包中即可。
6.3.2 导入包中的类
Java 中已经提供了很多现成的类供我们使用. 例如Date类:可以使用java.util.Arrays
导入java.util
这个包中的Arrays
类.
public class Test {public static void main(String[] args) {int[] arr = {1,2,3};java.util.Arrays.toString(arr);}
}
但是这种方法比较麻烦,我们可以使用import语句导入包
import java.util.Arrays; // 导包public class Test {public static void main(String[] args) {int[] arr = {1,2,3};Arrays.toString(arr); }
}
如果需要使用java.util
中的其他类, 可以使用import java.util.*
import java.util.*;
public class Test {public static void main(String[] args) {int[] arr = {1,2,3};Arrays.toString(arr);}
}
import java.util.*
不是把里面的所有的类都导进来,是随取随用。用到哪个类,就会导哪个类。
但是我们更建议显式的指定要导入的类名. 否则还是容易出现冲突的情况.
import java.util.*;
import java.sql.*;
public class Test {public static void main(String[] args) {
// util 和 sql 中都存在一个 Date 这样的类, 此时就会出现歧义, 这个时候编译器就不知道该导入哪个包了,毕竟两个包中都有Date类,所以编译出错Date date = new Date();System.out.println(date.getTime());}
}
//--------------
// 编译出错
Error:(5, 9) java: 对Date的引用不明确java.sql 中的类 java.sql.Date 和 java.util 中的类 java.util.Date 都匹配
在这种情况下需要使用完整的类名
import java.util.*;
import java.sql.*;
public class Test {public static void main(String[] args) {java.util.Date date = new java.util.Date();System.out.println(date.getTime());}
}
使用import static
可以导入包中静态的方法和字段
pow方法就是Math
中的一个静态方法,我们使用import static
就可以进行简写,在调用的时候只需要写方法名。
没有import static
修饰过的
import java.lang.Math;
public class Test {public static void main(String[] args) {double x = 10;double result = Math.pow(x,2);}
}
import static
修饰过的
import static java.lang.Math.*;
public class Test {public static void main(String[] args) {double x = 10;double result = pow(x,2);}
}
至于这个import static
不建议大家使用
6.3.3 自定义包
包就是所谓的文件夹
操作步骤
- 在 IDEA 中先新建一个包: 右键 src -> 新建 -> 包
- 在弹出的对话框中输入包名,,通常会用公司的域名的颠倒形式,例利于域名是
www.bit.com
,那么包的名字就是com.bit.www
- 在包中创建类, 右键包名 -> 新建 -> 类, 然后输入类名即可.
- 此时可以看到我们的磁盘上的目录结构已经被 IDEA 自动创建出来了
- 同时我们也看到了, 在新创建的 Test.java 文件的最上方, 就出现了一个 package 语句
package
是声明当前类是在哪个包底下。
package com.bite.demo1;
6.3.5 常见的包
- java.lang:系统常用基础类(String、Object),此包从JDK1.1后自动导入。
- java.lang.reflect:java 反射编程包;
- java.net:进行网络编程开发包。
- java.sql:进行数据库开发的支持包。
- java.util:是java提供的工具程序包。(集合类等) 非常重要
- java.io:I/O编程开发包。
除了JDK自动导入的,剩下的都需要我们用import
自己导入
10.Java类和对象完+作业+继承
回顾
什么是类?什么是对象?什么是面向对象?什么是面向过程
如何定义一个类
如何实例化一个对象
如果通过对象访问对象的成员属性、成员方法
通过(对象.)进行访问
this引用?代表的是当前对象的引用
构造方法中的this引用可以访问成员变量,可以访问成员方法,也可以访问当前对象的其他构造方法
引用指向null代表什么?代表这个引用不指向任何对象
引用不能指向引用,但是引用能指向引用所指向的对象。
一个引用只能指向一个对象,不能指向多个对象。
封装:根据业务需求,对类的细节进行隐藏,提供公开的接口,来和数据进行交互。
6.3.6 封装操作举例
class Person {private String name;public int age;private void eat() {System.out.println("吃饭");}public void show() {System.out.println(name + " " + age);}
}
我们通过private关键字进行对成员变量和成员方法进行封装,private封装后的只能在类中使用。
name成员变量、eat成员方法都已经封装起来了
使用private关键字进行了封装。此时,name的权限就变小了,只能在当前类当中才能进行访问。
补充
public哪里都能访问
private只能在当前类访问
default只能在包中进行访问
在Java编译器当中我们对构造函数创建有快捷方法。
第一步右键选择Generate、或者快捷键Alt+Insert
第二步:选择Constructor
第三步选择构造函数的形参(多选按住CTRL)
这样就可以在封装的情况下,通过构造函数在对象实例化的过程中进行初始化成员变量。
但是,如果想要更改姓名的话却无法更改,除非再次进行实例化一个对象,所以我们可以通过创建成员方法作为接口那么我们就创建了成员方法setName
进行姓名的更改getName
进行名字的查询
class Person {private String name;public int age;private void ear() {System.out.println("吃饭");}public void show() {System.out.println(name + " " + age);}public Person(String name, int age) {this.name = name;this.age = age;}public Person(String name) {this.name = name;}public String getName() {return this.name;}public void setName(String name) {this.name = name;}
}
public class Test {public static void main(String[] args) {Person person = new Person("mengdehong",20);person.setName("meng");System.out.println(person.getName());person.show();}
}
//--------------
//编译器运行结果为
//meng
//meng 20
但是我们有多个成员变量进行封装的时候,我们都要对每个成员变量进行set变量、get变量的方法吗?
实际上我们也有快捷操作。
第一步左键选择Generate
第二部选择Getter and Setter
第三步进行选择所需要创建成员方法的成员变量
这样就创建好了成员方法作为接口
今天我们讲了类和对象的一部分,剩下的内容我们会在下一篇博客中讲完。
相关文章:

【JavaSE】类和对象(中)
类和对象(中)4. this引用4.1 为什么要有this引用4.2 什么是this引用4.3 this引用的特性5. 对象的构造及初始化5.1 如何初始化对象5.2 构造方法(构造器)5.2.1 概念5.2.2 特性5.3 默认初始化5.4 就地初始化6. 封装6.1 封装的概念6.2…...

C语言例程:学生成绩管理程序
学生成绩管理程序 实例说明 编制一个统计存储在文件中的学生考试分数的管理程序。设学生成绩以一个学生一条记录的 形式存储在文件中,每个学生记录包含的信息有姓名、学号和各门功课的成绩。要求编制具有以 下几项功能的程序:求出各门课程的总分&#…...

完美日记母公司再度携手中国妇基会,以“创美人生”助力女性成长
撰稿 | 多客 来源 | 贝多财经 当春时节,梦想花开。和煦的三月暖阳,唤醒的不止是满城春意,更有逸仙电商“创美人生”公益项目播撒的一份希望。 3月8日“国际妇女节”当日,为积极响应我国促进共同富裕的政策倡导,助力相…...

【JaveEE】线程的创建及常见方法解析(Tread类)
目录 1.Tread类介绍 2线程的构造方法——创建线程 1.继承Thread类,重写run()方法 2.使用Runnbable接口创建线程 3.继承 Thread, 重写 run, 使用匿名内部类 4.实现 Runnable, 重写 run, 使用匿名内部类 5.使用 lambda 表达式(重点掌握)…...

Linux的诞生过程
个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。个人主页:小李会科技的…...

面部表情识别1:表情识别数据集(含下载链接)
面部表情识别1:表情识别数据集(含下载链接) 目录 面部表情识别1:表情识别数据集(含下载链接) 1.前言 2.表情识别数据集介绍 1.JAFFE数据集 2.KDEF(Karolinska Directed Emotional Faces)数据集 3.GENKI数据集 4.RaFD数据集…...

CSS实现文字凹凸效果
使用两个div分别用来实现凹凸效果;text-shadow语法 text-shadow: h-shadow v-shadow blur color; h-shadow:必需。水平阴影的位置。允许负值。 v-shadow :必需。垂直阴影的位置。允许负值。 blur:可选,模糊的距离。 co…...
嵌入式常使用的库函数
自己创建简单的mcu中常用的库函数 文章目录自己创建简单的mcu中常用的库函数1. 自己编写库函数的意义2. 计算字符串长度.以\0作为结束符3. 复制字符串4. 字符串比较5. 将整数转换为ASCII数组6. 将ASCII码字符串转换成整数7. 将字节数组转换为16位整数8.计算CRC,用于Modbus协议9…...

【业务安全-02】业务逻辑漏洞之越权操作
越权越权即越权查看被人的信息,又分为水平越权和垂直越权,但是两者的本质都是一样的,只是越权的身份权限不一样而已水平越权:相同级别的用户,如用户A访问用户B垂直越权:普通用户到管理员,普通用…...

完全小白的pycharm深度学习调试+for循环断点条件设置
完全小白的pycharm深度学习调试for循环断点条件设置写在最前面基础方法pycharm断点调试控制台输入代码中循环的debug方法pycharm中图标的介绍常见的BugDebug经验1. 检查激活函数的输入值2. 检查梯度3. 消融实验4. 使用最短的时间5. 静下心来写在最前面 之前把seq2seqattention…...

直方图及其应用
直方图定义直方图是一种描述数据的分布通过将连续变量划分成一系列区间,统计区间频率,并用来表示,以表征其统计特征在图像处理中,直方图可以用来表示图像中像素值的分布状况,描述不同灰度级的像素在图像中的占比直方图…...

《SpringBoot篇》26.SpringBoot整合Jackson超详细教程(附Jackson工具类)
陈老老老板🦸👨💻本文专栏:SpringBoot篇(主要讲一些与springboot整合相关的内容)👨💻本文简述:本文讲一下Jackson常见用法,超级详细。👨&am…...

Redis 如何实现库存扣减操作和防止被超卖?
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址:https://github.com/…...
(Linux)Ubuntu查看系统版本
uname -a : 查看操作系统的发行版号和操作系统版本 Command: uname -aResult: Linux SERVER 5.19.0-35-generic #36-Ubuntu SMP PREEMPT_DYNAMIC Fri Feb 3 18:36:56 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux uname -v : 查看版本号 Command: uname -vResult: #36-Ubuntu …...
VxWorkds 内存管理(3)
虚拟内存管理 对于带MMU的目标板,VxWorks提供虚拟内存的支持,VxWorks提供了两种虚拟内存管理单元(MMU)的支持: 基本MMU和VxVMI 基本MMU邦定于VxWorks中,可以通过config.h中宏定义INCLUDE MMU BASIC或Tornado工程配置中包含基本MMU组件 VxV…...

单元测试、反射、注解、动态代理
🏡个人主页 : 守夜人st 🚀系列专栏:Java …持续更新中敬请关注… 🙉博主简介:软件工程专业,在校学生,写博客是为了总结回顾一些所学知识点 目录单元测试、反射、注解、动态代理单元测…...

【数据结构】夯实基础|线性表刷题01
作者:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:算法、数据结构、Java等相关知识。博主主页: 是瑶瑶子啦所属专栏: 【数据结构|刷题专栏】:该专栏专注于数据结构知识,持续更新&a…...

Java怎么实现几十万条数据插入(30万条数据插入MySQL仅需13秒)
本文主要讲述通过MyBatis、JDBC等做大数据量数据插入的案例和结果。 30万条数据插入插入数据库验证实体类、mapper和配置文件定义User实体mapper接口mapper.xml文件jdbc.propertiessqlMapConfig.xml不分批次直接梭哈循环逐条插入MyBatis实现插入30万条数据JDBC实现插入30万条数…...

java多线程之线程的六种状态
线程的六种状态(1) NEW(初始状态)(2) TERMINATED(终止状态 / 死亡状态)(3) RUNNABLE(运行时状态)(4) TIMED_WAITING(超时等待状态)(5) WAITING(等待状态)(6) BLOCK(阻塞状态)sleep和wait的区别:操作系统里的线程自身是有一个状态的,但是java Thread 是对系统线程的封装,把这里的…...

UnixBench----x86架构openEuler操作系统上进行性能测试
【原文链接】UnixBench----x86架构openEuler操作系统上进行性能测试 (1)打开github上 UnixBench 地址,找到发布的tag (2)找到tar.gz包,右键复制链接 比如这里是 https://github.com/kdlucas/byte-unix…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...