1.查询“你已经创建了多少个对象?”
源代码:
1 public class How { 2 public static void main(String[] args) { 3 a1 b1 = new a1(); 4 a1 b2 = new a1(); 5 a1 b3 = new a1(); 6 //我已经创建了3个对象,接下来调用a1类的静态变量查询创建了多少对象 7 System.out.println("我已经创建的对象个数为: "+a1.value); 8 } 9 } 10 class a1 { 11 public static int value=0; 12 a1() { 13 //构造函数,每创建一个实例value就增加1 14 value=value+1; 15 } 16 }
结果截图:
2、以下代码为何无法通过编译?哪儿出错了?
解释:
因为Foo没有定义。如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。
2、使用上页幻灯片中定义的类,以下代码输出结果是什么?
总结:
(1)执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。
(2)类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。
4、请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。
代码:
1 package demo; 2 class Root 3 { 4 static{ 5 System.out.println("Root的静态初始化块"); 6 } 7 { 8 System.out.println("Root的普通初始化块"); 9 } 10 public Root() 11 { 12 System.out.println("Root的无参数的构造器"); 13 } 14 } 15 class Mid extends Root 16 { 17 static{ 18 System.out.println("Mid的静态初始化块"); 19 } 20 { 21 System.out.println("Mid的普通初始化块"); 22 } 23 public Mid() 24 { 25 System.out.println("Mid的无参数的构造器"); 26 } 27 public Mid(String msg) 28 { 29 //通过this调用同一类中重载的构造器 30 this(); 31 System.out.println("Mid的带参数构造器,其参数值:" + msg); 32 } 33 } 34 class Leaf extends Mid 35 { 36 static{ 37 System.out.println("Leaf的静态初始化块"); 38 } 39 { 40 System.out.println("Leaf的普通初始化块"); 41 } 42 public Leaf() 43 { 44 //通过super调用父类中有一个字符串参数的构造器 45 super("Java初始化顺序演示"); 46 System.out.println("执行Leaf的构造器"); 47 } 48 49 } 50 51 public class TestStaticInitializeBlock 52 { 53 public static void main(String[] args) 54 { 55 new Leaf(); 56 57 58 }
结果截图:
总结:静态初始化块只执行一次。创建子类型的对象时,也会导致父类型的静态初始化块的执行。