Java编程基础(六)
static 修饰属性
含义:该属性属于类属性
字节码文件加载到方法区,JVM会扫描该类的静态属性并把静态属性加载到静态区中
静态区中的数据必须等待项目结束时才会被收回
成员变量:每个对象独享一份
静态变量:属于类变量,每个对象共享一份
class 对象是对应的字节码文件的访问入口
想要操作该类,都必须找到class 对象,再利用对象找到class 文件
this – 本对象
理解:方法中的this 表示调用该方法的对象
作用:
1.this.属性:调用本对象的成员变量
2.this.方法:调用本对象的成员方法
3.this():调用构造方法(在一个构造方法中的第一句调用另外一个构造方法)
面试题:静态方法中为什么不可以使用this去调用
静态方法属于类的方法,不需要对象去调用,this表示调用该方法的对象,那么静态方法中如果有this就概念冲突了
深入类加载过程
类的完整生命周期:加载、连接、使用、卸载
加载
1、通过一个类的全限定名来获取其定义的二进制字节流
2、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
3、在堆中生成一个代表这个类的class对象,作为方法区中这些数据的访问入口
4、注意:相对于类加载过程的其他阶段而言,加载阶段是可控性最强的阶段因为程序员可以使用系统的类加载器加载,还可以使用自己的类加载器加载,在这里我们只需要知道类加载器的作用就是上面虚拟机需要完成的三件事
连接
1、验证:文件格式、元数据、字节码、符号引用
2、准备:准备阶段主要为类变量分配内存并设置初始值。这些内存都在方法区分配
类变量:会分配内存,但不会对应的分配值,其次实例变量不会分配空间,因为实例变量主要随着对象的实例化一块分配到Java堆内存中
初始值:这里的初始值指的是数据类型默认值,而不是代码中被显示赋予的值
3、解析:解析阶段主要是虚拟机将常量池中的符号引用转化为直接引用的过程
补充:解析作用主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号引用进行
4、初始化
声明类变量是指定初始值
使用静态代码为类变量指定初始值
使用
当JVM完成初始化阶段之后,JVM便开始从入口方法开始执行用户的程序代码
卸载
当用户程序代码执行完毕后,JVM便开始销毁创建的class对象,最后负责运行的JVM也退出内存
继承的应用
继承格式:
<修饰符>class<子类名>extends<父类名>{
[<成员变量定义>]...
[<方法定义>]...
}
含义:子类继承父类的属性和方法
好处:减少代码的冗余
在需求分析时,分析出多个类有共同属性和方法时,就将共同的属性和方法抽取到父类里
super
含义:父类的
作用:1、super.属性:在子类中调用父类的非私有化的成员变量
2、super.属性:在子类中调用父类的私有化的成员方法
3、super():在子类中调用父类的非私有化的构造方法
重写/复写
含义:在子类中重写父类的方法
应用场景:父类的方法不能改动时并且父类方法不满足子类需求,可以考虑使用重写
条件:1、在子类中重写父类的方法
2、返回值类型、方法名、参数列表必须和父类重写的方法一模一样
3、访问修饰符不能比父类的更严格
访问修饰符
含义:设置访问权限
注意:只能使用默认的、public修饰类名
使用private、默认的、protected、public修饰属性和方法
经验:
1、属性一般使用private私有化,再考虑是否封装(添加get/set方法)
2、考虑父类中的属性和方法要在子类中使用时,就用protected修饰
3、考虑该类中的属性和方法没有访问限制,就用public修饰
了解Object的方法
含义:所有类的超类/基类
理解:如果一个类没有明确继承的父类,默认继承Object
equals():比较的是两个对象的内存地址是否相同
底层:
public boolean equals(Object obj){
Return this == obj;
}
getClass():获取到该类的class对象
hashCode():获取对象的hash值(hash值不是内存地址,hash值是内存地址+散列算法获取到的一个数值)
toString():获取对象的字符串表示
底层:
public String toString(){
//Integer.toHexString(hashCode()) - 将十进制的数字转换为16进制的数字
Return getClass().getName() + “@” + Integer.toString(hashCode())
}
深入Object-equals()
Object - equals():比较两个对象的地址
标杆作用:比较两个对象是否相等,不同的子类有不同的属性(信息),比较规则也不一样,子类重写即可
Object - getClass():获取到类的class对象
标杆作用:class对象作为字节码文件的访问入口,得到该对象意味着该类对于我们来说都是透明的,我们可以为所欲为
Object - toString():获取对象的字符串表示
标杆作用:不同的子类有不同的属性(信息),子类重写该方法返回数据
Object知识点的延申 – String的底层原理
String的底层原理:将字符串转化为字符数组取存储
String类型比较两个字符串是否相同的原理:把字符串转化为字符数组,再逐一比较
final – 最终的
作用:
1、修饰类:该类不能有子类
2、修饰方法:该方法不能被子类重写,可以重载
3、修饰变量:该变量变成常量
通过final修饰后,我们能将其修饰的类、方法和变量表示成不可改变的状态
注意:常量存储在常量池中,是强引用,直到项目结束时才会被回收
抽象类及抽象方法
应用场景:程序设计中该方法应该存在在该类中,但又不好实现,就将该方法设置成抽象方法,交给非抽象的子类去实现
注意:抽象方法必须在抽象类中