子类向上转型后如何调用父类方法

穆侠 2012-06-14 02:29:41

public class Wangwang extends Dog {
int age = 50;
public void say() {
System.out.print("I'm the children");
}
public static void main(String[] args) {
Dog a =new Wangwang();
a.say();
}
}

class Dog {
public void say() {
System.out.println(" I'm the father!");
}
}

显然,输出"I'm the children"
向上转型后 实例不能访问子类特有的属性与方法,但这个“父类”调用自己的方法时,调用到的却还是子类overrided的.
问1:有什么方法能让向上转型后的类调用没被重写过的方法?//即在不修改类的构造情况 下使输出 为" I'm the father!"
问2:重写到底是什么一回事,是在父类方法对应的 内存上写入新内容,还是在另一块新内存上写入新方法,即父类方法还在吗?
...全文
664 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
安特矮油 2012-06-14
  • 打赏
  • 举报
回复
原因是不管你是否造型成父类,但是你的对象确是是子类的,所以方法在调用的时候会先在子类中查找,如果子类中有该方法,那么就调用子类的,如果没有那么就会调用父类中的方法了。

至于你说的重写,那么当然是新写的一个了,因为这个方法已然属于子类了。
未来纪元 2012-06-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
楼主想多了:

一般来说,如果不希望子类重写父类的方法,将他声明为final即可。
显然 a.say(),要么是父类的方法,要么是被覆盖的子类的方法,如果你需要的是父类的行为,应该调用父类对象的实例。如果你希望子类有父类一样的行为,就不应该覆盖此方法。
[/Quote]
+1
a395885670 2012-06-14
  • 打赏
  • 举报
回复
Dog a =new Wangwang(); 关键还是这句 你父类的引用指向的子类实例 所以你只能调用子类的say方法 要想输出I'm the father! 只能修改子类方法 用super来钓
五哥 2012-06-14
  • 打赏
  • 举报
回复
继承关系 ,如果方法重写了 ,无论你定义的变量引用是什么类型,调用方法是根据你实例化这个引用的实际对象来的
无名老僧 2012-06-14
  • 打赏
  • 举报
回复
楼主想多了:

一般来说,如果不希望子类重写父类的方法,将他声明为final即可。
显然 a.say(),要么是父类的方法,要么是被覆盖的子类的方法,如果你需要的是父类的行为,应该调用父类对象的实例。如果你希望子类有父类一样的行为,就不应该覆盖此方法。
猴子滴救兵 2012-06-14
  • 打赏
  • 举报
回复
Dog a =new Wangwang();
你这个地方实例化的是 Wangwang() 这个类
要想输出 I'm the father
把这句改成 Dog a =new Dog();就可以了

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧