首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java -向上和向下转换

Java -向上和向下转换
EN

Stack Overflow用户
提问于 2016-11-03 12:27:15
回答 2查看 3.9K关注 0票数 1

我知道在stackoverflow中有很多文章/问题描述了Java中的向上转换和向下转换。我知道什么是向上和向下。但我的问题并不具体到这一点。

向上转换-从子对象到父对象的转换-编译器负责处理。不需要强制转换

向下转换-从父级到子级的转换-需要显式转换

代码语言:javascript
复制
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(是一个关系),所以我们可以在派生类(子类)中使用基类(超类)方法。

现在考虑Main方法中的下面这段代码,

所以这里我要创建一个Dog object w.rt Animal。因此,我只能访问Animal属性(方法)

代码语言:javascript
复制
Dog d = new Dog();
Animal a = d; // Upcasting
a.getAnimalName();<br>
O/P : Parent Animal<br><br>

现在假设,我想将基类方法覆盖到派生类中

代码语言:javascript
复制
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方法中,

代码语言:javascript
复制
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类中被覆盖。

代码语言:javascript
复制
 O/P : Parent Animal overridden here<br>

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

请提供您的宝贵意见。

EN

回答 2

Stack Overflow用户

发布于 2016-11-03 13:01:12

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

代码语言:javascript
复制
Dog d = new Dog();
Animal a = d; // Upcasting
a.getAnimalName();

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

但需要注意的是,基类引用不能调用子类上的方法,这些方法不是在基类中定义的。

票数 0
EN

Stack Overflow用户

发布于 2016-11-03 13:12:52

代码语言:javascript
复制
Animal a = d; 

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40393875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档