【问题标题】:Java - Upcasting and DowncastingJava - 向上转换和向下转换
【发布时间】: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();



如果您查看AnimalDog 类,每个类都有自己的方法,例如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


【解决方案1】:

当你用父类引用你的子类时,引用指针上的方法调用调用子类方法。

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

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

但附带说明的是,基类引用不能调用子类上未定义在基类中的方法。

【讨论】:

    【解决方案2】:
    Animal a = d; 
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多