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 {
// ...
}
}
4 回答
而不是
A
和B
,让我们跳到一个具体的例子 .如果你有一个
ComputerScientist
您可以同时访问
greet
和validateAlgorithm
. 你知道他是一个Person
,并且可以像其他任何人一样greet
. 但是,您也可以将他/她特别视为ComputerScientist
.当您将此对象分配给
Person
类型的变量时,您所做的只是说“我不再关心您是ComputerScientist
. 从现在开始,我将像对待任何其他Person
一样对待您” .这相当于
p
引用的对象仍然知道如何validateAlgorithm
,并且仍然告诉您他在信息部门工作 . 但是,当通过p
访问它时,您告诉编译器您只想greet
这个Person
,没有别的 .它被称为upcasting,因为变量在层次结构树中上升,其中up表示更通用/抽象,down表示更具体 . 你将
ComputerScientist
概括为Person
.在
a = b;
之后,变量a
(使用类型A
声明)将引用B
类型的对象 . 因此,赋值涉及隐式upcast:a = (A)b;
,转换Java如何将b
从B
视图到其超类A
. 这是一个向上倾斜 .流程如下:
A的对象是使用
new A()
创建的,而ASSIGNED是用于引用变量a类似于B的对象是使用new B()
和ASSIGNED创建的参数变量b这里需要注意的是评估从右侧到左侧,这就是为什么首先计算右侧并将结果分配给各个变量的原因 .
现在出现问题,这就是为什么
a=b
是UPCASTING这个链接会让它更清晰https://www.youtube.com/watch?v=Wh-WZXCAarY
希望这可以帮助 .
对 .
好的,所以如果B是A的子类......
因为那就是它 .
是的,确实如此 . 对B的引用向上转换为对'A'的引用 .