• 子类的构造函数第一行也可手动指定this语句来访问本类中的构造函数;
• 子类中至少会有一个构造函数会访问父类中的构造函数。
一个类(假设没有父类,不包括Object)创建对象时优先级:static 修饰的代码块、成员>构造代码块、显示初始化>构造函数 注:当在同等的优先级时,1、在同一个类中是按照声明的顺序初始化的。2、若有子父类关系的,则按先父后子。
总结: 单个类首次创建对象的执行例程:加载main所在的类》main入栈》执行到new fu()时,加载fu类》 在堆内存分配空间new 类名.()且给成员变量赋默认值(如:null,0,0.0,\u000)》先调用super()后会返回来执行构造block或对属性显示初始化(实际上之前会先调用super()>Object的构造函数)》构造函数。
注意:
1、如果有在类定义时就给成员变量赋初始值的语句,语句最好写在structure block之前,否则(当block有使用该成员变量时)编译 (JDK1.7)不通过,提示非法向前引用。(解决方法:在block的成员变量前加上this.)
2、如果加载到static block 或static成员有定义对象(如:Fu类的对象)时(不会继续往下加载),则会先加载Fu类,然后创建一个对象给成员使用后再返回继续加载或运行。
3、如果structure block或非static成员有定义对象时,也会同上。
4、如果.class已被加载,则创建对象时不会再加载(即static修饰的内容只执行一次,在类加载的时候),直接给成员变量显示初始化或执行structure block,然后再执行构造器。
子类创建对象时的执行顺序(与单个类有所不同):加载main所在的test类》main入栈》当执行到new zi()时,
会先加载zi类的父类fu,然后再返回来加载zi类》zi()入栈,但会先调用super()入栈即fu类的构造函数》同理,
fu类的super()也会入栈即Object类》剩下的就是弹栈的过程。
注意:当每次super()弹栈完毕后会先执行子类的构造block!!!,而后再往下执行弹栈……。
五、final关键字
作用:
1、可以修饰类、函数、变量
2、被final修饰的类不可被继承。
3、被final修饰的方法不可被复写。
4、被final修饰的(成员或局部)变量是一个常量且只能赋值一次。
当在描述事物时,一些数据的出现时固定的,那么这时为了增强阅读性,都给这些值起个名字。
方便于阅读。而这个值不需要改变,所以加上final修饰。
5、内部类定义在类中的局部位置上时,只能访问局部被final修饰的局部变量。
总结static和final的区别 :
final可以修饰类、类成员和局部变量。
static不可以修饰类 、局部变量。
被static修饰后仍是变量。
被final修饰后是常量
final不可修饰构造函数
六、抽象类
|
|