class Base  {
public void display() {
System.out.println("在父类中输出");
}
}class Child extends Base { public void display() {
System.out.println("在子类中输出");
super.display();
}

public void sysHi() {
System.out.println("你好");
}
}public class Test {
public static void main(String[] args) {
Base b = new Child();
b.sysHi(); //编译出错
b.display();
}
}
程序运行在b.sysHi()这行报错。
将出错的代码注释,程序运行的时候打印了"在子类中输出 在父类中输出"这两句话,那说明调用的是子类的display方法,那就表示b是子类对象,那如果是子类对象,为什么不能调用子类本身中的sysHi方法呢?
在main方法中创建的b对象,到底是父类(Base)对象还是子类(Child)对象呀?
求各位大虾指点迷津

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【hnxt_hwj】截止到2008-08-03 23:47:22的历史汇总数据(不包括此帖):
    发帖的总数量:2                        发帖的总分数:10                       每贴平均分数:5                        
    回帖的总数量:2                        得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:1                        结贴的总分数:0                        
    无满意结贴数:1                        无满意结贴分:20                       
    未结的帖子数:1                        未结的总分数:10                       
    结贴的百分比:50.00 %               结分的百分比:0.00  %                  
    无满意结贴率:100.00%               无满意结分率:---------------------
    楼主加油

    取消马甲机器人,请点这里:http://www.java2000.net/mycsdn/robotStop.jsp?usern=hnxt_hwj
      

  2.   

    main方法中创建的b是Child(子类)对象,但是你用一个父类的引用指向它,那么使用这个引用使用对象b的时候,只知道Base(父类)的成员方法。display方法在子类中被重写了,所以b.display调用的是子类的方法。如果你这样写:
       Base b = new Child();
       Child c = (Child)b;  //强制类型转换
       c.sysHi(); //这里就不会错了
      
    当然,以上代码只有神经病才会在实际中写,我主要就是想表达实际你创建的是Child的对象,但是由于你用的是Base的引用,所以只知道Base中定义的方法,而且实际调用的是Child中实现的方法。不知道我说得是不是混乱不堪 
      

  3.   

    内存中存放的对象实际上是Child类型的对象,而你声明的reference b是Base类型的引用,所以:
    b.display():
       编译的时候,发现Base类型有display方法,编译成功.
       运行的时候,发现引用b实际上指向的内存中的对象是Child类型的,就会调用Child的dispaly方法.
    b.sysHi():
       编译的时候,发现Base类型没有sysHi方法,编译失败.