1.代码找错(动手动脑)
package DaiMaZhaoCuo; public abstract class Test { public static void main(String []args) { Foo obj1=new Foo(); } } public class Foo { int value; public Foo(int initvalue) { value=initvalue; } }
Foo类中定义带参的构造函数,而Foo类定义了构造函数系统就不会自动生成构造函数,所以Foo类就没有无参的构造函数,所以初始化会出错。
2.Java字段初始化规律
package InitializeBlockClass; public class InitializeBlockClass { { field=200; } public int field=100; public InitializeBlockClass(int value) { this.field=value; } public InitializeBlockClass() { } public static void main(String[] args) { InitializeBlockClass obj=new InitializeBlockClass(); System.out.println(obj.field); obj=new InitializeBlockClass(300); System.out.println(obj.field); } }
运行结果:
从运行结果得出,初始化规律为:初始化块和字段的初始值谁排在前面先执行谁,最后执行构造函数。
3.静态初始化块的执行顺序
class Root { static{ System.out.println("Root的静态初始化块"); } { System.out.println("Root的普通初始化块"); } public Root() { System.out.println("Root的无参数的构造器"); } } class Mid extends Root { static{ System.out.println("Mid的静态初始化块"); } { System.out.println("Mid的普通初始化块"); } public Mid() { System.out.println("Mid的无参数的构造器"); } public Mid(String msg) { //通过this调用同一类中重载的构造器 this(); System.out.println("Mid的带参数构造器,其参数值:" + msg); } } class Leaf extends Mid { static{ System.out.println("Leaf的静态初始化块"); } { System.out.println("Leaf的普通初始化块"); } public Leaf() { //通过super调用父类中有一个字符串参数的构造器 super("Java初始化顺序演示"); System.out.println("执行Leaf的构造器"); } } public class TestStaticInitializeBlock { public static void main(String[] args) { new Leaf(); } }
运行结果:
执行顺序为,由父类到子类先执行静态初始化块,而后是普通,无参数和有参构造器。
4.静态方法访问类的实例成员
package num; public class Num { public int i=5; public static void main(String []args) { Num j=new Num(); System.out.println(j.i); } }
运行结果:
可以在静态方法中定义类的对象,这样就可以调用实例成员了。