动手动脑
当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行
程序代码
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()
{
}
}
Public class TestStaticInitializeBlock
{
Public static void main (String[] args)
{
New Leaf();
}
}
原因分析是因为当多个类之间有继承关系时,创建的子类对象会导致父类初始化块的执行。具体的执行顺序是先初始化父类的静态初始化块,父类的无参构造器,在进行子类的静态初始化块,子类的无参构造器;然后是父类的普通初始化块,子类的普通初始化块;父类的带参构造器;子类的带参构造器。
动手动脑2
程序截图
静态初始化块具体的执行顺序是先初始化父类的静态初始化块,父类的无参构造器,在进行子类的静态初始化块,子类的无参构造器;然后是父类的普通初始化块,子类的普通初始化块;父类的带参构造器;子类的带参构造器。
试验
程序截图
课后作业
使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。
public class Count { private static int n; public Count() { n++;//次new一个对象的时候都可以给n加1 } public static int getNum() { return n;//返回n值 } public static void main(String[] args) { // TODO 自动生成的方法存根 Count t1=new Tongji(); Count t2=new Tongji(); Count t3=new Tongji();//创建对象 System.out.println("共有对象个数为:"+Count.getNum()); } }
程序截图