【发布时间】:2013-09-29 09:51:03
【问题描述】:
好的。所以如果...
int x=3;
int y=5;
x=y;
那就是x=5,对吧?
好的,如果B 是A 的子类...
A a=new A();
B b=new B();
a=b;
^^^为什么这被认为是向上转换?
“a”不是应该变成“b”而不是相反吗?有人可以向我解释这一切吗?
【问题讨论】:
好的。所以如果...
int x=3;
int y=5;
x=y;
那就是x=5,对吧?
好的,如果B 是A 的子类...
A a=new A();
B b=new B();
a=b;
^^^为什么这被认为是向上转换?
“a”不是应该变成“b”而不是相反吗?有人可以向我解释这一切吗?
【问题讨论】:
让我们跳到一个具体的例子,而不是As 和Bs。
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 时
ComputerScientist cs = new ComputerScientist();
您可以同时访问greet 和validateAlgorithm。你知道他是Person,并且可以greet他/她作为任何其他人。但是,您也可以专门将他/她视为ComputerScientist。
当你把这个对象赋值给Person类型的变量时,你所做的只是说“我不再关心你是ComputerScientist。从现在开始,我会像对待你一样对待你任何其他Person"。
Person p = cs;
相当于
Person p = (Person) cs;
p 引用的对象仍然知道如何validateAlgorithm,并且仍然告诉您他(她)在信息学部工作。然而,当通过p 访问它时,你 告诉编译器你只想greet 这个Person,没有别的。
之所以称为upcasting,是因为变量在层次结构树中up,其中up表示更一般/抽象 em> 和 down 表示更具体。您将ComputerScientist概括为Person。
【讨论】:
在a = b; 之后,变量a(以A 类型声明)将引用B 类型的对象。因此,该赋值涉及一个隐式向上转换:a = (A)b;,将 Java 如何查看 b 从 B 转换为其超类 A。这是一个向上的。
【讨论】:
b所引用的对象将被视为A,但a = b之后,所引用的对象仍然是B,它不是字面上转换。例如,所有被覆盖的方法都保持被覆盖。
A a = new A();
B b = new B();
流程如下:
new A() 创建的,并分配给引用变量 a
类似地,B 的对象是使用 new B() 创建并分配给参考变量 b现在来解决您的问题,这就是为什么 a=b 正在升级
这个链接会更清楚https://www.youtube.com/watch?v=Wh-WZXCAarY
希望这会有所帮助。
【讨论】:
这将使 x=5,对吗?
没错。
好的,如果 B 是 A 的子类...
^^^为什么这被认为是向上转换?
因为它就是这样。
“a”不是应该变成“b”而不是相反吗?
是的,确实如此。对 B 的引用向上转换为对“A”的引用。
【讨论】: