Java – 向上转发和向下转发

我知道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 and Dog类,每个类都有自己的方法,比如getAnimalName()getDogName() 。 因此Dog extends Animal (is-a relationship),因此我们可以在派生类(Subclass)中使用基类(Super Class)方法

现在考虑主方法中的下面一段代码,
所以我在这里创建一个Dog对象w.rt Animal 。 所以我只能访问Animal属性(方法)

 Dog d = new Dog(); Animal a = d; // Upcasting a.getAnimalName();
O/P : Parent Animal

现在让我们说,我想将基类方法覆盖到派生类中

 public class Dog extends Animal{ @Override public void getAnimalName(){ System.out.println("Parent Animal overridden here"); } public void getDogName(){ System.out.println("Dog"); } }

在主方法中,

 Dog d = new Dog(); Animal a = d; // Upcasting a.getAnimalName();
O/P : Parent Animal overridden here

即使我正在创建一个Dog对象wrt Animal ,但是这里它正在打印基类方法,该方法在dervied类中被重写。

  O/P : Parent Animal overridden here

想知道它为什么会这样。 这是因为override吗?

请提供您宝贵的意见。

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

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

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

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

 Animal a = d; 

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

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