Java - 向上转发和向下转发

时间:2016-11-03 04:27:15

标签: java inheritance override downcast upcasting

我知道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();



如果您查看AnimalDog类,则每个类都有自己的方法,例如getAnimalName()getDogName()。因此Dog extends Animal(is-a relationship),所以我们可以在派生类(Subclass)中使用基类(超类)方法

现在考虑主要方法中的下面一段代码,
所以我在这里创建一个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

请提供您宝贵的意见。

2 个答案:

答案 0 :(得分:0)

当您使用父类引用子类时,对引用指针的方法调用将调用子类方法。

Dog d = new Dog();
Animal a = d; // Upcasting
a.getAnimalName();

这里a.getAnimalName();调用子类的getAnimalName()方法,因为它是从基类继承的,因此调用父类的方法。它不是直接在基类上调用,而是通过子类的继承调用。当你重写时,它会立即从子类调用,它不需要去父类来检查方法是否存在。

但附注是基类引用不能调用子类上的方法,这些方法没有在基类中定义。

答案 1 :(得分:0)

Animal a = d; 

此行将使您的Animal对象'a'指向Dog类的实例(Dog d = new Dog();)。因此,当您调用该函数时,它将调用类dog中的函数。

您实际创建了一个类Dog Dog d = new Dog();的实例。然后,您正在创建类Animal的对象,并使其指向类Dog Animal a = d;

的实例