A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© liqudely 中级黑马   /  2015-1-13 13:54  /  1474 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面这个程序运行的结果让人不理解。
运行结果为:
Parent is creating..//不理解
Son is eat: 0//不理解
Son is creating..
Son is eat: 1
主要是前2句不理解。请高手详细说明之。谢谢
Java code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
*Parent.java
*/
public class Parent {
    private int eatID=0;
    public Parent(){
        System.out.println("Parent is creating..");
        eat();
    }
    public void eat(){
        System.out.println("Parent is eat: "+eatID);
    }

}

Java code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
*Son.java
*/
public class Son extends Parent {
    private int eatID=1;
    public Son(){
        System.out.println("Son is creating..");
        eat();
    }
    public void eat(){
        System.out.println("Son is eat: "+eatID);
    }
    @SuppressWarnings(value={"unused"})
    public static void main(String[] args){
        Parent p=new Son();
    }

}
更多 0

1 个回复

倒序浏览
这是多态中常见的问题,父类的声明 拿到子类的引用。
当父类中的方法,子类中重写了,则会调用子类的方法,如果子类没有重写,则使用父类的方法。

从内存上理解,在子类实例化时候,都会有一个隐藏的super指向一个父类对象,所以会首先调用父类的构造函数,就打印了你不理解的第一行,而构造函数中的eat,由于子类重写了eat函数,所以调用子类的eat,打印Son is eat:至于打印0,是因为成员变量仍旧使用父类的私有变量0
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马