public static void main(String[] args) {
Animal b = new Bulldog();
b.syaHi();
}
class Dog implements Animal
{
public String getName()
{
return "Bob";
}
private String bark()
{
return "wang-wang";
}
public void syaHi()
{
System.out.println("I am " + getName() + "." + bark());
}
}
class Bulldog extends Dog
{
@Override
public String getName() {
return "Mike";
}
private String bark() {
return "WOO-WOO";
}
}
为什么输出
I am Mike.wang-wang
而不是
I am Mike.WOO-WOO
怎么可能访问到父类的私有函数呢???
这已经是IT历史上一个鲜为人知的传奇故事,儿时的梦想是做个科学家,曾经在一本科学家故事书中读到了Dr. An Wang和王安电脑公司的故事,一直到现在我的意识中依然有很深的印象。中午,我进入了英文维基百科,忽然又想起了Dr. An Wang和Wang Laboratories,搜索之后知道原来这段历史美国人依然没有忘记,毕竟IBM PC时代的到来之前,Dr. An Wang 和Wang ......
答案就在这里:Dr. An Wang and Wang Laboratories (An legend in IT history)
----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。
private String bark()
public方法不能被重写,定义成protected
可能是你把b的类型定义为Animal了。
楼主请注意,你的Bulldog类没有重载syaHi()方法,也就是说,虽然你的对象是Bulldog,但他调用的仍然是父类的syaHi()方法,而你父类的syaHi()方法中是直接调用bark()方法,所以,这时候的bark()也是父类的方法。
如果你想输出 WOO-WOO,重写syaHi方法即可。
private方法被重写
多态情况下,父类引用指向子类对象,子类就继承了父类功能。该子类对象,在调用sayHi()后,从左到右执行,这条输出语句:打印I am;后执行子类getName(),输出Mike,因子类覆盖了该方法;后执行父类中的bark(),输出wang wang,为啥?没覆盖!子类中,该方法是private,为子类特有。既然子类被提升到了父类,自然就执行不到子类特有方法了。
你应该重写sayHi,否则的话,即使继承了这个方法,但是编译成class文件的时候会把bark指向父类的bark
Implements和extenda应该不是同一个吧!