本帖最后由 杨国祯 于 2012-4-25 17:35 编辑
这个问题看到,兄弟们很纠结啊!!
不同的看法实际上很正常,真理就是一个讨论的过程才出来的,说实话大家的解释我没怎么看,因为思路不一样!
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
这几天实际上大家搜搜这一类的我有几个回答,加起来会综合的理解,今天的这个不仅仅是执行顺序的问题,还有子类父类的问题,可能部分比较复杂!这里简单的简述下:- 这里简单谈谈我的看法!我们要理解程序中代码的加载顺序 :静态块——>静态变量——>成员变量——>构造方法——>静态方法(执行到才加载)
- 一个完整执行过程都是这样的,本例中没有任何的静态变量,静态方法;当前过程中的变量,比如i只有执行到了才会加载,所以就是一个正常的执行过程
复制代码 所以执行顺序是:- A、执行new Dog();
- B、执行Dog()无参构造方法,执行里面默认的super(),为什么会这样说,看我的其他回复,解释的很详细!
- C、到super()这了,当然要去看看父类有什么指示,跳转至Animal()无参构造函数,由于父类重写了系统默认提供的无参的构造函数,所以要先执行父类构造函数里面的语句!
- D、继续执行,这里的this注意是指代的谁,记得这句话谁调用就指代谁,这里可以用 this.getlass()检测 , 看结果,这里肯定是Dog,所以this指代Dog
- E、这是一个容易搞糊涂的地方,注意了 this既然是Dog类,这里注意子类的方法是不是跟父类的方法同名,这是什么呢,是不是重写啊, 子类的方法对于父类的方法重写了,你说执行谁的方法!
- F、最后执行子类重写的方法,子类的变量加载了没,还没有,但是系统会给赋初值,i是多少当然是0,所以结果就出来了
复制代码- 王明(1988)童鞋,debug模式写的很好,我不知道他的是不是跟我的一样,但是他用的方法很好值得推广
复制代码 扩展:- 这里如果把,两个变量都变成static的猜猜结果会怎么样
- private static int a = 2
- private static int a = 22
- 注意:你会发现结果不是0了, 是22了,为什么现在知道了吧,因为执行顺序,静态变量先加载了,才执行的new Dog()!!
复制代码 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
这里是综合的知识点,对于基本的东西一定深挖,这样才能理解透彻!!
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
最后用代码给你们标注请代码执行过程:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
public classMyTest { public static void main(String[] args) { new Dog(); //第一步 } } class Animal { private int i = 2; public Animal() //第四步,跳过来发现父类重写了系统默认的无参构造方法,于是执行里面语句 { this.display(); // 第五步,发现this是代表Dog,知道为什么吗! 因为谁调用就代表谁,这个忘了没,上面刚提到了!不信?自己getClass。 } public void display() { System.out.println(i); } } class Dog extends Animal { private int i = 22; public Dog() // 第二步 { //super // 第三步,这里系统默认提供了一个super(),为什么,记住一句话,子类要去请示父类,是系统默认的 i = 222; } public void display() // 第六步 为什么是这,毕老师要敲你了啊,方法名一样,参数一样是什么,是不是重写,重写怎么执行! { System.out.println(i); // 第七步,给 i 赋值的代码块执行到了没,没有吧,i的值是多少,是不是系统默认提供的! } }
这样的话是不是清晰了呢,执行过程有时候就是比较复杂,但是我们知道了之后发现过程应该按照语法来,是不是!
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
还有两种增补情况,帖子太长,不让发,只好另外书写,请看下一贴!!
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|