好。所以,如果......
int x=3;
int y=5;
x=y;
那会x=5
,对吧?
好的,如果B
是A
...
A a=new A();
B b=new B();
a=b;
^^^为什么这被视为向上转播?
是不是“a”应该成为“b”而不是相反?有人可以向我解释这一切吗?
答案 0 :(得分:10)
让我们跳到一个具体的例子,而不是A
和B
s。
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 表示更一般/抽象和 down 表示更具体。您概括 ComputerScientist
为Person
。
答案 1 :(得分:7)
在a = b;
之后,变量a
(使用类型A
声明)将引用类型为B
的对象。因此,赋值涉及隐式向上转换:a = (A)b;
,转换Java如何b
从B
查看其超类A
。那是一个向上的人。
答案 2 :(得分:1)
A a = new A();
B b = new B();
流程如下:
new A()
创建A的对象,并使用ASSIGNED来引用变量a
类似地,B的对象是使用new B()
和ASSIGNED创建的参考变量b 现在出现问题,这就是为什么a=b
是UPCASTING
此链接会更清晰https://www.youtube.com/watch?v=Wh-WZXCAarY
希望这有帮助。
答案 3 :(得分:0)
这会使x = 5,对吧?
右。
好的,如果B是A的子类......
^^^为什么这被视为向上转播?
因为它就是这样。
是不是“a”应该成为“b”而不是相反?
是的,确实如此。对B的引用是向上转换为对'A'的引用。