标签:
首先了解java中this和super关键字,this来引用当前对象,super来引用直接父类,并且在每个方法中都隐藏了this和super变量。super()方法都会出现在子类构造方法的第一行,如果不写,编译器会自动帮我们隐藏添加。现在我们来分析下面的代码:
package generic; public class Animal { public Animal(){ super(); System.out.println("Animal.Animal()"); } public void run(){ System.out.println("Animal.run()"); } public void voice(){ System.out.println("Animal.voice()"); } public static void main(String[] args) { Bird a = new Bird(); a.run(); } } class Bird extends Animal{ public Bird(){ super(); System.out.println("Bird.Bird()"); } public void run(){ System.out.println("Bird.run()"); } }
分析任何程序都是从main方法的第一句话开始,所以首先分析main的第一句话
Animal a = new Bird();
这句话运行后,会在栈空间里面产生一个a变量,具体值还不确定(要等到new Bird()运行完后才能确定),运行new Bird()时,因为new Bird方法的第一句有super()方法,会去调用它的直接父类,所以会去Animal类中调用Animal(),同理Animal又会去调用它的直接父类Object。调用的过程如下图所示
在Object()方法运行完后,就会在堆区间中生成Object对象,并且继续执行Animal()方法后面的代码(这过程相当于递归),生成Animal对象,最后才生成Bird对象,并且将地址赋给a变量a。通过这个分析也能说明为什么是Animal.Animal()先输出来。内存分配图如下:
这时a指向的是bird对象,在调用第二句时,所以会在bird对象中找是否会有run这个方法,如果找到就不再去父类中查找。
标签:
原文地址:http://www.cnblogs.com/duoluomengxing/p/4700141.html