第五章 初始化与清理
第六章 访问权限控制
类的初始化和实例化
(一个对象在可以被使用之前必须要被正确地初始化)
类的初始化是指类加载过程中的初始化阶段对类变量按照程序意图进行赋值的过程;而类的实例化是指在类完全加载到内存后创建对象的过程。
类实例化不一定在类初始化结束之后才开始
public class Test {
public static void main(String[] args) {
method();
}
static Test test = new Test();
static {
System.out.println("1");
}
public Test() {
System.out.println("2");
}
public static void method() {
System.out.println("3");
}
}
/* Output:
2
1
3
*/
父类的类构造器<clinit>() -> 子类的类构造器<clinit>() -> 父类的成员变量和实例代码块 -> 父类的构造函数 -> 子类的成员变量和实例代码块 -> 子类的构造函数
虚拟机规范指明有且只有五种情况必须立即对类进行初始化:
1) 遇到new、getstatic、putstatic或invokestatic这四条字节码指令;
2) 使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化;
3) 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化;
4) 当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类;
5) 当使用jdk1.7动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getstatic,REF_putstatic,REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行初始化,则需要先出触发其初始化。(´`;) ?
构造器
(与类名相同、无返回值、可重载)
只有无显式定义的构造器时,编译器才自动创建默认构造器(无参)
this关键字只能在方法内部使用,表示"调用方法的那个对象"的引用;可在构造函数中利用this调用其他构造器(this调用语句位于构造器最起始处)
父子类中的两种情况:
1、子类自动调用父类的构造器——父类不存在显式构造器或父类存在无参构造器
2、子类必须手动调用父类构造器——父类只有有参构造器(利用super调用父类构造器,并位于子类构造器最起始处)
垃圾清理
垃圾回收器——回收内存
gcRoot、标记-清除算法、标记-整理算法、复制算法、年轻代、老年代、方法区、串行、并行、Serial、Parallel、CMS、G1
访问权限
1、类的访问权限
public:公共类
default(默认缺省):包访问权限
2、成员变量的访问权限
private<default<protected<public
default: 包访问权限
protected: 同一个包或子类具有访问权限
Reference