好的。所以,如果...java中的向上和向下混淆混淆
int x=3;
int y=5;
x=y;
这会让x=5
,对不对?
好了,所以如果B
是A
一个子类...
A a=new A();
B b=new B();
a=b;
^^^为什么这被认为是向上转型?
不是“a”应该成为“b”而不是其他方式?有人可以向我解释这一切吗?
好的。所以,如果...java中的向上和向下混淆混淆
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;
后,变量a
(与A
类型声明)将指B
类型的对象。因此,作业涉及到一个隐式上传:a = (A)b;
,将Java视图b
从B
转换为其超类A
。这是一个倒戈。
这将使x = 5,对不对?
没错。
好了,所以如果B是A的子类...
^^^为什么这被认为是向上转型?
因为这就是它。
不是“a”应该成为“b”而不是其他方式?
是的,它的确如此。对B的引用被上传到对'A'的引用。
这是否真的回答了这个问题? OP在问为什么。你重复了OP已经知道的内容。 –
而不是A
s和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
,没有别的。
它被称为向上转型因为变量在分层结构树,其中了意味着进入了更一般/抽象和下意味着更具体。你是推广 a ComputerScientist
作为Person
。
+!,很好的解释:-) –
A a = new A();
B b = new B();
的流程如下:使用new A()
被创建并分配给refrence变量 类似B的对象使用new B()
创建
现在来到你的问题,这也是为什么a=b
被向上转型
此链接会更清楚https://www.youtube.com/watch?v=Wh-WZXCAarY
希望这有助于。
请注意,虽然'b'所引用的对象将被视为'A',在'a = b'之后,被引用的对象仍然是'B',它不会被*转换。例如,所有重写的方法都会被覆盖。 – afsantos