gpt4 book ai didi

java - Java 中的向上转型/向下转型

转载 作者:行者123 更新时间:2023-12-01 07:43:58 25 4
gpt4 key购买 nike

我试图理解 Java 中的向上转型和向下转型,但我对以下场景感到困惑(关于我的代码,如下):

首先 - 为什么当我包含行 myAnimal.bark();,

时代码无法编译

第二个 - (假设我注释掉 myAnimal.bark();)为什么调用 myAnimal.move() 打印 "moveDog" 而不是“moveAnimal”myAnimal 是否仅限于 Animal 类中的方法,因为我们已将其类型声明为 Animal,即使我们将其设置为的类型?

非常感谢任何帮助!这是代码:

    public class Animal {
public void move() {
System.out.println("moveAnimal");
}

public static void main(String[] args) {
Dog myDog = new Dog();
Animal myAnimal = myDog;
myAnimal.move();
//myAnimal.bark();
}
}

class Dog extends Animal {
@Override
public void move() {
System.out.println("moveDog");
}

public void bark() {
System.out.println("bark");
}
}


最佳答案

在这一行隐式向上转换:

Animal myAnimal = myDog;

您没有执行任何操作来更改底层实例 myDog 。您所做的是将其分配给继承树中更高一级的类型的变量。实际上,这限制了只能调用 Animal 中定义的方法。 ,但不会改变这些方法的解析方式。

因为您将可用的方法限制为仅在父类 Animal 上定义的方法可用,编译器无法解析Dog#bark() ,因为它是 Dog 的方法,以及变量 myAnimal被定义为 Animal 类型其中没有 #bark方法。

#move()Animal 两者的方法和Dog ,所以它解析,但它解析为 Dog 上定义的方法,自 myAnimal仍然引用 Dog 的实例,尽管心情高昂。

关于java - Java 中的向上转型/向下转型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58721207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com