码迷,mamicode.com
首页 > 其他好文 > 详细

继承的内存分析

时间:2015-08-03 20:34:26      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:

首先了解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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!