【发布时间】:2017-03-16 14:06:10
【问题描述】:
我知道 stackoverflow 中有很多文章/问题描述了 Java 中的向上转换和向下转换。我知道什么是向上和向下。但我的问题并不具体。
Upcasting - 从子级转换为父级 - 编译器负责。无需演员表
向下转换 - 从父级转换为子级 - 需要显式转换
public class Animal {
public void getAnimalName(){
System.out.println("Parent Animal");
}
}
public class Dog extends Animal{
public void getDogName(){
System.out.println("Dog");
}
}
public static void main(String[] args) {
Dog d = new Dog();
Animal a = d; // Upcasting
a.getAnimalName();
Animal vv = new Dog();
Dog cc = (Dog)vv;//DownCasting
cc.getAnimalName();
cc.getDogName();
如果您查看Animal 和Dog 类,每个类都有自己的方法,例如getAnimalName() 和getDogName()。因此Dog extends Animal(is-a relationship),所以我们可以在派生类(子类)中使用基类(超类)方法
现在考虑 Main 方法中的以下代码,
所以在这里我创建了一个Dog 对象w.rt Animal。所以我只能访问Animal 属性(方法)
Dog d = new Dog();
Animal a = d; // Upcasting
a.getAnimalName();<br>
O/P : Parent Animal<br><br>
现在假设,我想将基类方法覆盖到派生类中
public class Dog extends Animal{
@Override
public void getAnimalName(){
System.out.println("Parent Animal overridden here");
}
public void getDogName(){
System.out.println("Dog");
}
}<br>
在主方法中,
Dog d = new Dog();
Animal a = d; // Upcasting
a.getAnimalName();<br>
O/P : Parent Animal overridden here<br><br>
即使我正在创建一个 Dog 对象 w.r.t Animal,但这里它正在打印在派生类中被覆盖的基类方法。
O/P : Parent Animal overridden here<br>
想知道它为什么会这样。这是因为override吗?
请提供您宝贵的意见。
【问题讨论】:
-
实例方法是根据引用的类型而不是引用变量来调用的基类。
-
“但是这里打印的是基类方法”——这读起来好像你相信基类方法正在被调用,但显然不是这样。请注意措辞并澄清您的意思。
标签: java inheritance overriding downcast upcasting