java中的向上和向下转换混淆
好的。所以如果java中的向上和向下转换混淆,java,downcast,upcasting,Java,Downcast,Upcasting,好的。所以如果 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的一个子类 ^^^为什么这
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”的引用。让我们跳到一个具体的例子,而不是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 cs = new ComputerScientist();
您可以访问greet
和validateAlgorithm
。你知道他是一个人
,可以像其他人一样问候他/她。但是,您也可以专门将他/她视为计算机科学家
当您将此对象分配给Person
类型的变量时,您所做的只是说“我不再在乎您是计算机科学家
。从现在起,我将像对待任何其他Person
”一样对待您
这相当于
Person p = (Person) cs;
p
引用的对象仍然知道如何验证算法,并且仍然告诉您他在信息学部门工作。但是,当通过p
访问它时,您告诉编译器您只想问候这个人
,其他什么都不想
之所以称为向上转换,是因为变量在层次结构树中向上,向上表示更一般/抽象,向下表示更具体。你把一个计算机科学家
概括为一个人
A a = new A();
B b = new B();
流程如下:
- A的对象是使用
新建A()
创建的,并分配给引用变量A
类似地,B的对象是使用new B()
创建的,并分配给引用变量B
- 这里需要注意的一点是,评估从右侧到左侧,这就是为什么首先计算右侧,并将结果分配给相应的变量
现在来看你的问题,这就是为什么a=b
是向上投射
- 上述几点也适用于此语句,首先计算b,它是a的子类。现在,由于要将子类指定给超类,所以隐式转换将从子类型转换为超类型,这当然是向上转换
这个链接将使它更加清晰
希望这有帮助。请注意,尽管b
引用的对象将被视为A
,但在A=b
之后,引用的对象仍然是Ab
,它并不是字面上的转换对象。例如,所有被重写的方法仍然被重写。这真的回答了这个问题吗?OP在问为什么。你重复了OP已经知道的内容。+!,很好的解释:-)
A a = new A();
B b = new B();