问题描述
我试图理解Java中的向上转换和向下转换,并且对以下情况(关于我的代码,在下面)感到困惑:
I am trying to understand upcasting and downcasting in Java and I am confused by the following scenario (about my code, which is below):
首先-为什么当我包含行myAnimal.bark();
,
First - why is it that the code does not compile when I include the line myAnimal.bark();
,
和第二个-(假设我注释了myAnimal.bark();
)为什么调用myAnimal.move()
打印"moveDog"
而不是"moveAnimal"
? myAnimal
是否不限于Animal
类中的方法,因为即使我们将其设置为Dog
类型,我们也已将其声明为Animal
?
and Second - (assuming I comment out myAnimal.bark();
) why does calling myAnimal.move()
print "moveDog"
instead of "moveAnimal"
? Isn't myAnimal
restricted to methods from the Animal
class because we have declared its type to be Animal
, even though we are setting it to a type of Dog
?
任何帮助将不胜感激!这是代码:
Any help is greatly appreciated! Here is the code:
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");
}
}
推荐答案
在这一行有隐式的上行:
With the implicit upcast at this line:
Animal myAnimal = myDog;
您没有做任何更改基础实例myDog
的操作.您正在做的就是将其分配给继承树中一级更高级别的变量.有效地,这限制了只能调用Animal
中定义的方法的方法,而不会改变这些方法的解析方式.
You are not doing anything to change the underlying instance myDog
. What you are doing is assigning it to a variable of a type one level higher in the inheritance tree. Effectively, this restricts which methods can be called to only those defined in Animal
, but does not change how those methods resolve.
因为您将可用方法限制为仅在父类Animal
上定义的方法可用,所以编译器无法解析Dog#bark()
,因为它是Dog
的方法,并且变量myAnimal
被定义为类型为Animal
的类型,没有#bark
方法.
Because you have restricted the methods available to only those defined on the parent class Animal
, the compiler cannot resolve Dog#bark()
, since it is a method of Dog
, and the variable myAnimal
is defined to be of type Animal
which has no #bark
method.
#move()
是Animal
和Dog
的方法,因此可以解析,但可以解析为Dog
上定义的方法,因为myAnimal
仍引用Dog
的实例,尽管沮丧.
#move()
is a method of both Animal
and Dog
, so it resolves, but it resolves to the method defined on Dog
, since myAnimal
still refers to an instance of Dog
, despite being upcast.
这篇关于Java中的上/下流的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!