(1)动手动脑
这段代码无法运行的原因是:类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。而定义Foo时没有参数,所以编译器报错。
(2)自找麻烦
如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?
执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。如果有构造方法,则以构造方法为准。
(3)动手动脑
当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。
public class Extend { public static void main(String[] args){ Son s=new Son(); s.show(); } } class Father{ String name; int age; { name="baba"; age=51; } } class Son extends Father{ String school="TD"; void show() { System.out.println("name:"+name+" age:"+age+" school:"+school); } }
运行结果:
(4)动手动脑
请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。
静态初始化块只执行一次。 创建子类型的对象时,也会导致父类型的静态初始化块的执行。
(5)有趣的问题
静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?
public class Test2 { public static void main(String[] args) { Test t=new Test(); int a=t.getyear(); t.input1(); Test.input(a); t.input(a); } } class Test { int year = 100; public int getyear() { return year; } public static void input(int a) { System.out.println("静态"+a); } public void input1() { System.out.println("实例"); } }
(6)神奇代码
因为它们调用的Interger类的方法不同,所以结果不同。
(7)课后作业
public class Test3 { public static void main(String[] args) { Testyu t=new Testyu(); Testyu s=new Testyu(); Testyu r=new Testyu(); System.out.println(s.getcount()); } } class Testyu{ private static int count=0;//静态初始化 { count++;//统计调用次数 } public int getcount() { return count; } }
运行结果: