我知道在stackoverflow中有很多文章/问题描述了Java中的向上转换和向下转换。我知道什么是向上和向下。但我的问题并不具体到这一点。
向上转换-从子对象到父对象的转换-编译器负责处理。不需要强制转换
向下转换-从父级到子级的转换-需要显式转换
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(是一个关系),所以我们可以在派生类(子类)中使用基类(超类)方法。
现在考虑Main方法中的下面这段代码,
所以这里我要创建一个Dog object 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>在Main方法中,
Dog d = new Dog();
Animal a = d; // Upcasting
a.getAnimalName();<br>
O/P : Parent Animal overridden here<br><br>尽管我正在创建一个Dog对象w.r.t Animal,但在这里它打印的是基类方法,该方法在dervied类中被覆盖。
O/P : Parent Animal overridden here<br>想知道为什么它会这样。这是因为override
请提供您的宝贵意见。
发布于 2016-11-03 13:01:12
当您使用父类引用子类时,引用指针上的方法调用将调用子类方法。
Dog d = new Dog();
Animal a = d; // Upcasting
a.getAnimalName();这里a.getAnimalName();调用子类的getAnimalName()方法,因为它是从基类继承的,所以调用父类的方法。它不是直接在基类上调用,而是通过子类的继承来调用。当你重写时,它会立即从子类中被调用,它不需要去父类来检查方法的存在。
但需要注意的是,基类引用不能调用子类上的方法,这些方法不是在基类中定义的。
发布于 2016-11-03 13:12:52
Animal a = d; 这一行将使Animal对象'a‘指向Dog类的实例(Dog d= new Dog();)。因此,当您调用该函数时,它将调用dog类中的函数。
您实际上创建了Dog Dog d = new Dog();类的一个实例。然后创建一个Animal类的对象,并使其指向Dog Animal a = d;类的实例
https://stackoverflow.com/questions/40393875
复制相似问题