权限修饰符
用权限修饰符修饰的属性、方法等、需要视权限修饰符的权限(适用范围)来使用
以后的编程中,将封装好的例如属性类,方法类分别封装到一起,养成习惯。
- 在属性类中,首先提供一个无参的构造方法,以便创建该类的对象。(同时也可以提供一个有参的构造方法,方便在声明对象同时赋值的需求)
- 将所有属性的权限规范为private,然后 提供对应的公开的(get,set)方法,从而使我们可以在属性类之外,通过调用属性所对应的方法来控制属性。该方法。
在测试类中,我们可以通过在属性类中的无参或有参构造,声明对象,但是通过有参构造声明,需要同时给属性赋值。同时声明get方法,专门用来获取属性的值,和set专门用来给属性赋值。
在JAVA中,方法应做到“各司其职”
property属性
指的是 geter/seter 方法
去掉get 或者 set 然后首字母 变小写,这样的属性称为 property属性
重写toString方法
JAVA中,打印对象就是打印这个对象的toString方法,所以我们将其重写成更易读的形式。
public String toString(){
return String.format("Person{name = %s,age = %d,sex = %s,"张三",22,"男"}")
}
重写equals方法
public boolean equals(Object obj) {
/*
* 自己编译一段代码,用来比较两个对象是否内容相等
*/
// 如果 传入的对象 和 this 地址相等
if (this == obj) return true;
// 如果 两个对象地址不相等, 判断 obj 是否 为空
if (obj == null) return false;
// 比较两个对象的 类型是否 相等
// 获取 一个 对象的 类型,通过 对象的 getClass() 方法
if (this.getClass() != obj.getClass()) return false;
// 如果 两个对象是同种类型, 那么 进行属性值的比较
Person p = (Person) obj;
// 比较两个人的 名字 是否相等
// Objects.equals(a, b) ; // 比较两个对象的内容是否相同的工具类,解决了可能会产生空指针的问题
if (!Objects.equals(this.name, p.name)) return false;
// 如果名字相同, 继续比较 年龄
if (this.age != p.age) return false;
// 如果年龄 也相等, 继续比较 性别
if (!Objects.equals(this.sex, p.sex)) return false;
// 如果 性别 相等, 继续比较 手机号
if (!Objects.equals(this.tel, p.tel)) return false;
return true;
}
static
static(静态)修饰符
static可以修饰 属性、方法、代码块、内部类、构造器
1.static修饰属性
属性是否使用static修饰,又分为:静态属性、非静态属性(实例变量)
实例变量:创建了类的多个对象,每个对象都独立的拥一套 类中的非静态属性。当修改其中一个对象
中的非静态属性时,不会导致其他对象中同样的属性值的修改。
静态变量:创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的。
static修饰属性的其他说明:
静态变量随着类的加载而加载。可以通过 “类. 静态变量” 的方式进行调用
静态变量的加载 早于 对象的创建(详情见类加载过程 知识点)
由于类只加载一次,所以静态变量在内存中也只会存在一份在方法区的静态域中。
类变量 | 实例变量 | |
---|---|---|
类 | yes | no |
对象 | yes | yes |
静态变量在内存中的解析:
图片转自bilibili up主:尚硅谷
静态属性举例: System.out、Math.PI
2.static修饰方法
静态方法随着类的加载,被压入方法区,可以通过"类.静态方法"调用
静态方法 | 非静态方法 | |
---|---|---|
类 | yes | no |
对象 | yes | yes |
静态方法中,只能调用静态的方法或属性
非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性
因为静态方法的产生发生在类加载的过程中,此时还没有对象产生。而成员方法和属性,需要通过对象来调用。
所以静态方法只能调用静态方法,(此时只有静态方法)而非静态方法可以调静态和非静态方法(此时两种方法都有)
- 注意:
静态方法内,不能使用this和super关键字
关于静态属性和静态方法的使用,需要从生命周期的角度去理解
3.判断 属性和方法 什么时候应该用static关键字:
属性:
属性可以被多个对象共享,不会随着对象的不同而不同
类中的常量也常常声明为static
方法:
操作静态属性的方法,通常设置为static的
工具类中的方法,习惯上声明为static。例如;Math,Arrays等
★类加载:
JVM‘第一次’ 读取一个类的时候,会将 .class(字节码文件)读入到内存,这个过程称为 类加载
一个 类 最多只能发生 一次 类加载,类加载的产物是 类对象,用Class类型来表示(不同于 类的对象 不要将二者混淆)
类加载的过程
1.分配空间
2.加载 静态属性 , 如果有赋值语句,同时完成赋值操作
3.加载 静态代码块, 并执行代码块中的语句
4.如果有 静态属性 没有赋值,此时 完成对静态属性的赋值(JVM给他们赋初值)
5.将 类中的 静态方法,全部压入内存(此时方法是不会执行的)
- 类加载中不能使用this关键字,因为this既对象的属性,在类加载时,对象还未产生。
静态属性:
静态属性 被类的 所有对象 共享,任何一个对象如果对静态属性进行修改,那么所有的对象看到的都是 修改过后的数据。一般统计网站的访问量
os:把静态属性类比成一个房子,类的对象 若对静态属性进行修改,类的其他对象再调用时,等到的就是修改过后的房子
而成员属性,是对象声明时,自己就有了一个属于自己的房子,每个对象在使用时,都是自己的房子。(比如:张三的"房子",李四的"房子",房子不同,房子是你的房子,但是这些房子的都是"房子",通俗意义上的"房子",这个"房子"相当于静态属性,张三李四各自的房子,是成员属性)
静态方法:
static修饰的方法 多用于工具类的编写
静态代码块:
做数据的 一次性初始化工作
静态属性、方法:
可以使用 类 or 对象 来调用,但推荐使用 类 来调用
空对象引用:
可以调用 静态方法 和 静态属性,而不产生 空指针异常
而 null 不能调用静态属性和静态方法