目录
继承执行顺序
类中的资源分类:
在子类中创建main方法
在无关类中创建main方法
拓展
代码块
权限修饰符
继承执行顺序
类中的资源分类:
静态成员变量,
静态代码块,
静态方法,
非静态成员变量,
非静态代码块。
非静态方法,
构造方法
main方法
其中 静态资源和main() 执行顺序固定:
1,静态资源:静态成员变量和静态代码块按书写顺序执行,
一般在加载类文件时执行
2,main方法
其他资源的执行时间:
new对象时,构造方法和非静态成员方法和非静态代码块
1,先执行非静态成员变量和非静态代码块:按书写顺序执行
2,构造方法
2.1,先执行父类的非静态代码块,再执行构造方法
2.2,之后执行子类的静态代码块,在执行构造方法
静态成员方法和非静态成员方法,调用的时候才执行
在子类中创建main方法
1,先加载类文件:
1.1,先加载父类的类文件,再加载子类的类文件
1.2,类中类文件加载顺序
1.2.1,先加载声明
只加载静态成员变量的声明,不加载静态成员方法的声明
只加载声明不加载值,无论其声明是否赋值
不加载静态代码块中的变量,因为其相当于局部变量,用完就销毁
静态代码块 和 非静态代码块 相当于方法,{ }里面的内容相当于方法体代码,
其中声明的变量是局部变量,执行完代码块就会销毁
1.2.2,静态代码块和静态变量的执行顺序,是按照书写顺序来的
此处,静态变量的执行 就是 为静态变量赋值
2,执行main方法
2.1,main方法中的代码块,按顺序执行
2.2,执行new对象时,
2.2.1,先访问父类的构造方法,再访问子类的构造方法
2.2.2,访问构造方法时,先访问类中的非静态代码块,然后执行构造方法的方法体代码
详细步骤:执行new子类对象时,
1,先跳转到子类的构造方法的声明上,
2,什么也不执行,跳转到父类的构造方法声明上,
3,什么也不执行,先执行父类的非静态代码,按书写顺序执行,
此时,会初始化成员变量
4,执行完毕父类的非静态代码后,才开始执行构造方法的方法体代码,
此时,会使用 传入的参数 为变量 赋值
5,执行完后跳转到子类的构造方法上,
6,什么也不执行,先执行子类的非静态代码,
此时,会初始化成员变量
7,执行完毕父类的非静态代码之后,才执行子类的构造方法
此时,会使用 传入的参数 为变量 赋值
在无关类中创建main方法
1,先加载main()所在类的类文件,
如果该类静态资源中有与其它类相关的调用,就加载其他类
2,执行main()
2.1,按书写顺序执行代码
2.2,new子类对象时,具体参照上面:
2.2.1,先加载父类的类文件,再加载子类的类文件
2.2.2,先执行父类的非静态代码,再执行父类的构造方法
2.2.3,先执行子类的非静态代码,再执行子类的构造方法
拓展
代码块
代码块相当于一个方法,{ }定义的变量相当于局部变量, 因此
1,代码块中的声明的变量用完即毁
2,代码块中变量不能用权限修饰符修饰
3,使用 静态/非静态代码块 时,最好 先在外面声明变量,然后再在代码块中给变量赋值
权限修饰符
权限修饰符,针对的是访问的位置
public: 所有地方都能访问
protected: 包修饰符,可以在同个包下的任意位置访问
子类修饰符,可以被所有子类访问到
default: 包修饰符,可以在同个包下的任意位置访问
private: 只能被本类访问
因此在不同的类中,类对象能够访问到的字段内容不一样
特例:protected比较特殊
protected修饰的内容,在同个包下和其他修饰符一样,但在不同包下的子类中,想要访问就需要特定的方式:
错误方式:
在不同包下的子类中,通过创建父类对象baseClass,访问protected修饰的内容,编译器会报错,无法解析该字段
正确方式:
通过 创建子类的对象,通过子类对象访问 父类protected修饰的内容
protected修饰符 特例原因 讲解: 为什么子类中不能访问另一个包中父类中的protected方法?_Yang Special的博客-CSDN博客_protected不同包的子类能不能访问父类



