Java 静态数据的初始化

发布时间:2018-08-04作者:laosun阅读(2119)

Java

无论创建多少个对象,静态数据都只占用一份存储区域。static关键字不能应用于局部变量,因此它只能作用于域。如果一个域是静态的基本类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初始值;如果它是一个对象引用,那么它的默认初始值就是null

    class Bowl {
    	public Bowl(int marker) {
    		System.out.println("Bowl(" + marker + ")");
    	}
    
    	void f1(int marker) {
    		System.out.println("f1(" + marker + ")");
    	}
    }
    
    class Table {
    	static Bowl bowl = new Bowl(1);
    
    	public 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);
    
    	public Cupboard() {
    		System.out.println("Cupboard()");
    	}
    
    	void f3(int marker) {
    		System.out.println("f3(" + marker + ")");
    	}
    
    	static Bowl bowl5 = new Bowl(5);
    }
    
    public class StaticInit {
    
    	public static void main(String[] args) {
    		//第三步
    		System.out.println("Creating new Cupboard in main");
    		//第四步
    		//因为Cupboard内的静态变量已经初始化完成,所以不再初始化(无论创建多少个对象,静态数据都是只占用一份存储区域)
    		//但是里边的类成员变量 bowl3 还是需要进行二次初始化的,因为你这是new对象,所以打印 Bowl(3)
    		//然后调用该对象的无参构造函数,打印 Cupboard()
    		new Cupboard();
    		//第五步
    		System.out.println("Creating new Cupboard in main");
    		//第六步
    		//和第四步一样,执行初始化,打印 Bowl(3),然后调用无参构造函数,打印 Cupboard()
    		new Cupboard();
    		//第七步
    		table.f2(111);
    		//第八步
    		cupboard.f3(111);
    
    	}
            //Java 数据类型、对象引用 和 构造器 之间的初始化顺序  https://www.sunjs.com/article/detail/debedcef327c4872933e0b2f1ac7cb71.html
    	//第1步:
    	//先初始化静态代码块、
    	//Table 类中也含有静态引用变量,所以先去执行bowl引用指向的对象的创建,所以先打印 Bowl(1)
    	//然后该类中还有一个静态对象,所以立即去初始化这个静态对象,然后打印 Bowl(2)
    	//执行完成以后,正式创建对象,执行Table类的默认无参构造函数,打印 Table()
    	//构造函数内 又使用静态变量bowl2 调用了其对象内的方法,所以打印 f1(1)
    	//到此这一行代码执行的初始化全部执行完毕
    	static Table table = new Table();
    	//第2步:
    	//初始化 Cupboard 类,因为 Cupboard 类中也含有两个静态对象,所以依次执行  Bowl(4) 和 Bowl(5)
    	//在执行Cupboard构造函数之前先执行变量初始化的规则,所以 bowl3 先执行,打印 Bolw(3)
    	//然后执行无参构造函数,打印 Cupboard()
    	//到此,这行代码的初始化全部执行完毕
    	static Cupboard cupboard = new Cupboard();
    	
    }

    执行结果:

    Bowl(1)
    Bowl(2)
    Table()
    f1(1)
    Bowl(4)
    Bowl(5)
    Bowl(3)
    Cupboard()
    Creating new Cupboard in main
    Bowl(3)
    Cupboard()
    Creating new Cupboard in main
    Bowl(3)
    Cupboard()
    f2(111)
    f3(111)


0 +1

版权声明

 Java  源码

 请文明留言

0 条评论