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
之后,引用的对象仍然是A
b
,它并不是字面上的转换对象。例如,所有被重写的方法仍然被重写。这真的回答了这个问题吗?OP在问为什么。你重复了OP已经知道的内容。+!,很好的解释:-)
A a = new A();
B b = new B();