一:构造函数:
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Foo objl=new Foo();//应该改为:Foo objl=new Foo(家一个整数) } } class Foo{ int value; public Foo(int initValue) { value=initValue; } }
在定义objl的时候没有正确利用构造函数,构造函数有参数时,必须赋予初值。
二:类的成员的初始化
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Foo objl=new Foo(); System.out.println(objl.value); Foo obj=new Foo(300); System.out.println(objl.value); } } class Foo{ { value=200; }//初始化块 public int value=100;//字段的初始化 public Foo(int initValue) { this.value=initValue; }//构造函数 public Foo() { } }
从上面的程序中可以看到,类的成员初始化有很多,但是具体遵循哪一种,谁说了算?我们来看结果
我们可以看到是字段的初始化说了算,因此在同一个类中对成员的初始化有很多时,我们只看字段的初始化。
三:静态初始化块的执行顺序
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(); } }
运行结果为:
可以看出在类中静态初始块的顺序为:先调用静态初始块,其他初始化则是同时调用,静态初始化块只执行一次,创建子类型的对象时,也会导致父类型的静态初始化块的执行。
四:利用静态使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。
public class Chaxun { public static void main(String[] args) { // TODO Auto-generated method stub Kehou m1=new Kehou();//定义1次 Kehou m2=new Kehou();//定义2次 Kehou m3=new Kehou();//定义3次 } } class Kehou{ static int a=0; public Kehou() { a++; System.out.println("你已经创建了"+a+"个对象"); }//每定义一个对象就让a+1,就是定义的对象的个数 }