Java中的初始化与继承的流程

2010.07.14 / 标签: , / 分类: Java技术

想知道流程是怎样的,最简单的方法就是在每一个必要的地方输出一下,类似下断点去debug一样。 阅读全文>>

java继承问题

2008.06.20 / 标签: / 分类: Java技术
Sofa

 
  1. class Depend { 
  2. int i = 10
  3.  
  4. public Depend() { 
  5. print(); 
  6. i = 20
  7.  
  8. void print() { 
  9. System.out.println("Depend=> " + this.i); 
  10.  
  11. class Test1 extends Depend { 
  12. int i = 30
  13.  
  14. public Test1() { 
  15. print(); 
  16. super.print(); 
  17. i = 40
  18.  
  19. void print() { 
  20. System.out.println("Target=> " + i); 
  21.  
  22. public class Test{ 
  23.  public static void main(String[] args) { 
  24.  new Test1(); 
  25.  
  26. }

输出结果是什么?请不要运行,自己用脑子想想想。牛人详解(转自百度贴吧):我们顺着初始化的顺序来说 首先程序从main方法开始执行,new Test1(),这句话就是要new一个Test1的对象,根据对象初始化的顺序,初始化子类之前必须要初始化父类,所以此时一系列的调用开始了 1,调用Test1的父类Depend类的构造函数,在调用构造函数之前,成员变量是先于构造函数初始化的,这个时候Depend里面的i已经有值了,它的值就是10,在Depend构造函数里面,我们看到的第一句是:print方法,这个print方法我们要注意,它在Depend的子类也定义了,并且此次初始化是由子类Test1发起的,所以实际上这个print方法调用的是Test1里面定义的print,而这个时候有意思的事情就出现了,此时子类还没有出生呢,因为这个时候父类才正在构造之中,所以子类中此时的i还是0,而print正好打印出的是子类的i,所以第一次输出是0; 2,父类调用完子类的print后,把父类的i赋了值20,此时父类已经完全被构造出来了,马上就要开始构造子类了. 3,同理,在调用子类的构造函数之前,子类的i被赋了初值30,然后进入子类的构造函数,此时调用的也是print,这个就非常好理解了,这个print肯定是子类自己的print方法了,此时i已经构造好,当然,此时输出的值是30; 4,下一句super.print(),这句话显示的调用了父类的print方法,而此时父类的i已经在父类的构造函数里面改为20了,所以此次调用输出20. 5,然后再把子类的i的值设为40. 在以上过程中,如果掌握好了类的初始化顺序,是比较容易知道输出结果的.还有一点要记住,JAVA里面的方法是动态绑定的,而成员却是静态绑定的.父类里面调用的print之所以会输出0,就是因为print实际上调用的是子类的print,因为整个这场调用都是由new Test1()这句话产生的.

无觅相关文章插件,快速提升流量