Thinking in Java (2)

第五章 初始化与清理

第六章 访问权限控制

类的初始化和实例化

(一个对象在可以被使用之前必须要被正确地初始化)

类的初始化是指类加载过程中的初始化阶段对类变量按照程序意图进行赋值的过程;而类的实例化是指在类完全加载到内存后创建对象的过程。

类实例化不一定在类初始化结束之后才开始

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

JVM类生命周期概述:加载时机与加载过程

深入理解Java对象的创建过程:类的初始化与实例化

Java对象初始化详解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值