好的。所以如果...
int x=3;
int y=5;
x=y;
那么x=5
,对吗?
好的,如果B
是A
的子类...
A a=new A();
B b=new B();
a=b;
为什么这被认为是向上转型?
"a" 不应该变成 "b" 而不是相反吗?有人能向我解释一下吗?
我们不谈论抽象的A和B,来看一个具体的例子。
class Person {
public void greet() {
System.out.println("Hello there!");
}
}
class ComputerScientist extends Person { // Does he, really?
@Override
public void greet() {
System.out.println("Hello there! I work at the Informatics Department.");
}
public void validateAlgorithm(Algorithm a)
throws InvalidAlgorithmException {
// ...
}
}
当你有一个计算机科学家
作为
ComputerScientist cs = new ComputerScientist();
您可以访问greet
和validateAlgorithm
。您知道他/她是一个Person
,并且可以像对待其他人一样向他/她greet
。但是,您也可以将他/她特别视为ComputerScientist
。
当您将此对象分配给Person
类型的变量时,您所做的只是说:"我不再关心你是一个ComputerScientist
了。从现在开始,我将像对待任何其他Person
一样对待你。"
Person p = cs;
相当于
Person p = (Person) cs;
p
所指的对象仍然知道如何validateAlgorithm
,并且仍然告诉你他在信息系学院工作。但是,通过p
访问它时,你告诉编译器你只想问候这个Person
,不需要其他信息。ComputerScientist
泛化成一个Person
。在执行 a = b;
后,变量 a
(声明为类型 A
)将引用类型为 B
的对象。因此,此赋值涉及隐式向上转型:a = (A)b;
,将 Java 视图中的 b
从 B
转换为其超类 A
。这就是一次向上转型。
A a = new A();
B b = new B();
new A()
创建 A 对象并将其赋值给引用变量 a;同样,使用 new B()
创建 B 对象并将其赋值给引用变量 b。现在来看看你所遇到的问题——为什么 a=b
是向上转型。
这个链接可以让它更清晰 https://www.youtube.com/watch?v=Wh-WZXCAarY
希望这有所帮助。
那么x的值就是5了,对吧?
没错。
好的,如果B是A的子类...
为什么这被认为是向上转型呢?
因为它就是向上转型。
难道不应该是"a"变成"b"而不是反过来吗?
是的,确实如此。对B的引用向上转型为对'A'的引用。
b
所引用的对象将被视为A
,但在a = b
之后,所引用的对象仍然是B
,它并没有被字面上转换。例如,所有重写的方法仍然被重写。 - afsantos