补疑(初始化和静态成员变量)

今天在java咖啡屋看到一道有趣的题目,说有趣,因为它不但包含了关于初始化的知识点,还包括了静态变量,实力变量的概念。下面是代码:
class Bowl{
 Bowl(int marker){
  System.out.println("Bowl("+marker+")");//3
 }
 
 void f(int marker){
  System.out.println("f("+marker+")");
 }
}


class Table{
 static Bowl b1 = new Bowl(1);//2
 Table(){
  System.out.println("Table()");
  b2.f(1);
 }
 
 void f2(int marker){
  System.out.println("f2("+marker+")");
 }
 
 static Bowl b2 = new Bowl(2);//4
}


class Cupboard{
 Bowl b3 = new Bowl(3);
 static Bowl b4 = new Bowl(4);

 Cupboard(){
  System.out.println("Cupboard()");
  b4.f(2);
 }
 void f3(int marker){
  System.out.println("f3("+marker+")");
 }
 static Bowl b5 = new Bowl(5);
}

public class StaticInitialization{
 public static void main(String[] args){
  System.out.println("Creating new Cupboard() in main");
  new Cupboard();
  System.out.println("Creating new Cupboard() in main");
  new Cupboard();
  t2.f2(1);
  t3.f3(1);
 }
   
 static Table t2 = new Table();
 static Cupboard t3 = new Cupboard();
 
}

当编译成功后,因为StaticInitialization类是public修饰的,所以首先载入StaticInitaialization类,首先要做的是初始化成员变量,给static t2和t3赋值,方法是初始化Table现在载入Table类,和上面一步一样,首先是初始化该类的成员变量,首先是静态变量b1和b2,那么这里又has a了Bowl,那么因为要给b1,b2赋值,所以又要载入Bowl类,所以首先要Bowl(1),Bowl(2),这里对于类成员变量的初始化动作就结束了,加载Table类的构造函数,输出Table(),调用b2.f(1)的结果是输出f(1),StaticInitialization类的第一个成员变量t2的初始化动作就结束了,下一个是t3的初始化,同样的,首先载入Cupboard类,首先要做的是对于两个静态成员变量的初始化,所以输出Bowl(4),Bowl(5),之后为实例变量b3初始化得到Bowl(3),对于该类的成员初始化做完了,下面就是载入该类的构造函数了,则输出Cupboard(),f(2),StaticInitialization的成员变量初始化就完成了,因为要执行程序,所以进入main函数首先要输出的是Creating new Cupboard() in main,然后实例一个Cupboard,因为在这个程序里,已经存在了类Cupboard的静态成员变量b4,b5了,所以这里虽然是一个新的类成员初始化,也不做静态成员变量的初始化,所以只需要初始化实例变量b3,就会输出Bowl(3),然后调用构造函数得到输出Cupboard(),f(2),回到主函数,继续执行,下面两行和上面是一样的,这里就不再表述,下面就执行调用静态成员变量t2的方法f2得到输出f2(1),同样得到f3(1),完成主函数线程,结束该程序。所以得到最终的输出是
Bowl(1)
Bowl(2)
Table()
f(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
f2(1)
f3(1) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值