java学习总结2:静态代码构造代码继承成员变量等问题的总结

 

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

 

/*
  今天我在黑马论坛看到了一个问题。源代码如下:
*/

class MyBook{
MyBook(int maker){
System.out.println("MyBook("+maker+")");
}
void foo(int maker){
System.out.println("foo("+maker+")");
}
}

class MyPackage{
static MyBook b1 = new MyBook(1);
MyPackage(){
System.out.println("MyPackage()");
b2.foo(1);
}
void foo2(int maker){
System.out.println("foo2("+maker+")");
}
static MyBook b2 = new MyBook(2);
}

class MyRoom{
MyBook b3 = new MyBook(3);
static MyBook b4 = new MyBook(4);
MyRoom(){
System.out.println("MyRoom()");
b4.foo(2);
}
void foo3(int maker){
System.out.println("foo3("+maker+")");
}
static MyBook b5 = new MyBook(5);
}


public class StaticIni{
public static void main(String[] args){
System.out.println("Creating new MyRoom() in main");
new MyRoom();
System.out.println("Creating new MyRoom() in main");
new MyRoom();
t2.foo2(1);
t3.foo3(1);
}
static MyPackage t2 = new MyPackage();
static MyRoom t3 = new MyRoom();
}
/*
运行结果:
MyBook(1)
MyBook(2)
MyPackage()
foo(1)
MyBook(4)
MyBook(5)
MyBook(3)
MyRoom()
foo(2)
Creating new MyRoom() in main
MyBook(3)
MyRoom()
foo(2)
Creating new MyRoom() in main
MyBook(3)
MyRoom()
foo(2)
foo2(1)
foo3(1)
*/
   代码执行顺序:

     程序加载class文件,加载了这个public class StaticIni 类后,立刻进行静态代码块的部分
static MyPackage t2 = new MyPackage();
static MyRoom t3 = new MyRoom();
先读  static MyPackage t2 = new MyPackage();
加载 MyPackage 这个类,同样的先执行静态代码块一:static MyBook b1 = new MyBook(1); 二:static MyBook b2 = new MyBook(2);
对一:同样的加载MyBook 这个类,先执行静态代码块,这MyBook 类中没有静态代码块,因此进行实例对象初始化,执行
 MyBook(int maker){ System.out.println("MyBook("+maker+")"); }这句,打印出MyBook(1);
对二:因为在一中已经给类MyBook 加载了,因此二的代码直接进行实例对象初始化,打印出MyBook(2)
现在,到了对MyPackage 这个类进行实例对象初始化了,相应的打印出MyPackage(),再执行里面构造函数的下一条语句b2.foo(1);
相应的去调用这个方法,执行MyBook类中的void foo(int maker){System.out.println("foo("+maker+")"); },打印出foo(1);


到此,执行完static MyPackage t2 = new MyPackage(); 后,接桌执行tatic MyRoom t3 = new MyRoom()
先加载MyRoom 这个类,成员变量默认初始化,即MyBook b3=null,然后静态代码的执行 一 :static MyBook b4 = new MyBook(4);

 二: static MyBook b5 = new MyBook(5);
对一:因为在上面已经给这个类加载了,同理的直接进行实例对象初始化,打印出MyBook(4)
对二:和上面的一  一样,打印出MyBook(5)
现在,来到了对new MyRoom()实例对象初始化,相应的执行构造函数的语句MyRoom(){ System.out.println("MyRoom()"); b4.foo(2); },先打印出MyRoom(),再执行里面构造函数的下一条语句b4.foo(2),打印出foo(2)

好了,到此,进入主函数main()里面了,先执行System.out.println("Creating new MyRoom() in main"); ,打印出
Creating new MyRoom() in main
然后执行new MyRoom();
这个类MyRoom已经加载了,因此只执行实例对象初始化,先显示成元变量MyBook b3,即b3=new MyBook (),那这样就要访问了MyBook 这个类,这个类已经加载了,因此只执行实例对象初始化,即执行MyBook(int maker){System.out.println("MyBook("+maker+")");
},打印出Mybook(3)  .再执行new MyRoom()对应的构造函数语句,得到打印出MyRoom(),调用b4.foo(2)语句时,得到打印出foo(2)

继续,执行System.out.println("Creating new MyRoom() in main"); 打印出Creating new MyRoom() in main
继续执行下面的new MyRoom();
这和上面的一样,得到打印的结果: MyBook(3)  MyRoom() foo(2)
最后执行 t2.foo2(1); t3.foo3(1); 这两句
得到打印结果foo2(1)和foo3(1)
   最后总结:
          1 看到这题,必须要冷静分析,一步一步的走
    2 最好画图,让思维清晰
    3 执行顺序: 虚拟机加载class文件-------->加载该类的静态代码块 同时默认成员变量(谁在前谁就先)----->执行main()方法。。。。。
     

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值