《Java编程思想》笔记之第五章——5.6 -5.7成员初始化,构造器初始化

初始化

    初始化顺序:(查阅于:https://www.cnblogs.com/luanpeng/p/6649463.html

父类静态变量 父类静态代码块 子类静态变量 子类静态代码块 父类非静态变量 父类非静态代码块 父类构造器 子类非静态变量 子类非静态代码块 子类构造器

在类的内部,变量定义顺序决定了初始化顺序。变量如果没有初始化,编译器会默认给与一个初始值。基本数据类型为标准初始值。对象引用则是null。

总结:父类优先与子类,变量优先于代码块。

无父类示例:

class Window {
    Window(int mark){
        System.out.println("window("+mark+")");
    }
}

class House {
    Window w1 = new Window(1);          
    House(){
        System.out.println("House()");  
        w3 = new Window(33);            
    }
    Window w2 = new Window(2);          
    void f(){
        System.out.println("f()");
    }
    Window w3 = new Window(3);          
}

public class JavaBCSX{
    public static void main(String[] args) {
        House h = new House();
        h.f();
    }
}
/*      打印结果:
window(1)
window(2)
window(3)
House()
window(33)
f()
*/
父类静态变量父类静态代码块子类静态变量子类静态代码块父类非静态变量父类非静态代码块父类构造器子类非静态变量子类非静态代码块子类构造器
父类静态变量父类静态代码块子类静态变量子类静态代码块父类非静态变量父类非静态代码块父类构造器子类非静态变量子类非静态代码块子类构造器

--------------------------------------------------------------------------------------------------------------------------------

静态数据初始化:

无论创建多少个对象,静态数据都只占用一分存储区域。且静态变量不能应用于局部变量。

class Bowl{
    Bowl(int marker){
        System.out.println("Bowl("+marker+")");
    }
    void f1(int marker){
        System.out.println("f1("+marker+")");
    }
}

class Table{
    static Bowl bowl1 = new Bowl(1);
    Table(){
        System.out.println("Table()");
        bowl2.f1(1);
    }
    void f2(int marker){
        System.out.println("f2(" + marker + ")");
    }
    static Bowl bowl2 = new Bowl(2);
}
class Cupboard{
    Bowl bowl3 = new Bowl(3);
    static Bowl bowl4 = new Bowl(4);
    Cupboard(){
        System.out.println("Cupboard()");
        bowl4.f1(2);
    }
    void f3(int marker){
        System.out.println("f3("+ marker +")");
    }
    static Bowl bowl5 = new Bowl(5);
}

public class JavaBCSX{
    public static void main(String[] args) {
        System.out.println("Creating new Cupboard() in main");
        new Cupboard();
        System.out.println("Creating new Cupboard() in main");
        new Cupboard();
        table.f2(1);
        cupboard.f3(1);
    }
    static Table table = new Table();
    static Cupboard cupboard = new Cupboard();
}
/* 打印结果
Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
f2(1)
f3(1)
*/


书中总结: 假设有个名为Dog的类(静态代码块同理)

  1. 即时没有显式地使用static关键字,构造器实际上也是静态方法。因此,当首次创建类型为Dog的对象时(构造器可以看成静态方法),或者Dog类的静态方法/静态域首次被访问时,Java解释器必须查找理解,以定位Dog.class
  2. 然后载入Dog.class,有关静态初始化的所以动作都会执行。因此静态初始化只在Class对象首次加载的时候进行一次。
  3. 当用new Dog()创建对象的时候,首先将堆上为Dog对象分配足够的空间。
  4. 这块存储空间会被清零,这就自动地将Dog对象中的所有基本类型数据都设置成了默认值(对数字来说是0,对布尔和字符型也相同),而引用则被设置成了NULL.
  5. 执行所有出现于字段定义处的初始化动作。
  6. 执行构造器。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值