有关类的初始化问题

首先下面的部分摘抄于Thinking in Java

在这里有必要总结一下对象的创建过程。请考虑一个名为Dog的类:
(1) 类型为Dog的一个对象     首次    创建时,或者Dog类的static方法/static字段    首次    访问时,Java解释器必须找到Dog.class(在事先设好的类路径里搜索)。
(2) 找到Dog.class后(它会创建一个Class对象,这将在后面学到),它的所有static初始化模块都会运行。因此,static初始化仅发生一次——在Class对象首次载入的时候
(3) 创建一个new Dog()时,Dog对象的构建进程首先会在内存堆(Heap)里为一个Dog对象分配足够多的存储空间。
(4) 这种存储空间会清为零,将Dog中的所有基本类型设为它们的默认值(零用于数字,以及boolean和char的等价设定)。
(5) 进行字段定义时发生的所有初始化都会执行(很重要)
(6) 执行构建器。这实际可能要求进行相当多的操作,特别是在涉及继承的时候。

当然还有一个静态初始化块:static{这里面是赋值的动作}
与其他static初始化一样,这段代码仅执行一次——首次生成那个类的一个对象时,或者首次访问属于那个类的一个static成员时(即便从未生成过那个类的对象

 

 

其次要说明的,子类构造函数调用时发生的事件

看下面第一个例子:
//打印结果        BoardGame constructor ,no argument
//Chess constructor

class BoardGame
 {
  BoardGame()
  {
   System.out.println("BoardGame constructor ,no argument");
  }
  
  BoardGame(int i)
  {
       System.out.println("BoardGame constructor,int argument");
  }
 }

 public class ConstructIni extends BoardGame
 {
   ConstructIni()
   {
  
     System.out.println("Chess constructor");
   }
   public static void main(String[] args)
   {
    ConstructIni x = new ConstructIni();
   }
 } 

 

如果更改Constructlni构造函数实现:
 ConstructIni()
   {
      super(11);
     System.out.println("Chess constructor");
   }
则输出为:BoardGame constructor,int argument
Chess constructor

 

个人试验结果

super(...)的某种方式你没有调用,则会隐含调用super()
也就是没有参数的构造函数

最后看一个例子:

public class ConstructIni
{
 public static final ConstructIni INSTANCE = new ConstructIni();
 private final int beltSize;
 private static final int CURRENT_YEAR =Calendar.getInstance().get(Calendar.YEAR);
 private ConstructIni()
 {
 beltSize = CURRENT_YEAR - 1930;
 }
 public int beltSize()
 {
 return beltSize;
 }
 public static void main(String[] args)
 {
  System.out.println("Elvis wears a size " +INSTANCE.beltSize() + " belt.");
 }
}

注意,需要说明的是INSTANCE被实例话的时候,CURRENT_YEAR还没有来得及实例话,所以CURRENT_YEAR此时还是0,故 beltSize =-1930

而后CURRENT_YEAR被实例为2007(我写这个blog的时候是2007),但是此时已经晚了,beltSize不能在更新,而且也不会主动更新

运行结果:
Elvis wears a size -1930 belt.


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值