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