在java中的向上倾斜和向下倾斜的混乱

时间:2013-09-29 09:51:04

标签: java downcast upcasting

好。所以,如果......

int x=3;
int y=5;


x=y;

那会x=5,对吧?

好的,如果BA ...

的子类
A a=new A();
B b=new B();

a=b;

^^^为什么这被视为向上转播?

是不是“a”应该成为“b”而不是相反?有人可以向我解释这一切吗?

4 个答案:

答案 0 :(得分:10)

让我们跳到一个具体的例子,而不是AB 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();

您可以同时访问greetvalidateAlgorithm。你知道他是Person,并且greet他/她可以像任何其他人一样。但是,您也可以将他/她特别视为ComputerScientist

当您将此对象分配给Person类型的变量时,您所做的只是说“我不再关心您是ComputerScientist。从现在开始,我将像对待任何其他Person一样对待您。

Person p = cs;

相当于

Person p = (Person) cs;

p引用的对象仍然知道如何validateAlgorithm,并且仍然告诉您他在信息部门工作。但是,当通过p访问它时,告诉编译器你只想greet这个Person,而不是别的。

它被称为 upcasting ,因为变量在层次结构树中 up ,其中 up 表示更一般/抽象 down 表示更具体。您概括 ComputerScientistPerson

答案 1 :(得分:7)

a = b;之后,变量a(使用类型A声明)将引用类型为B的对象。因此,赋值涉及隐式向上转换:a = (A)b;,转换Java如何bB查看其超类A。那是一个向上的人。

答案 2 :(得分:1)

A a = new A();
B b = new B();

流程如下:

  • 使用new A()创建A的对象,并使用ASSIGNED来引用变量a 类似地,B的对象是使用new B()和ASSIGNED创建的参考变量b
  • 这里需要注意的是评估从右侧到左侧,这就是为什么首先计算右侧并将结果分配给各个变量的原因。

现在出现问题,这就是为什么a=b是UPCAST​​ING

  • 上述要点也适用于此陈述,首先评估b是a的子类。现在,由于您要将子类分配给超类,因此隐式转换从子类型发生到超级类型,该类型是UPCAST​​ING。

此链接会更清晰https://www.youtube.com/watch?v=Wh-WZXCAarY

希望这有帮助。

答案 3 :(得分:0)

  

这会使x = 5,对吧?

右。

好的,如果B是A的子类......

  

^^^为什么这被视为向上转播?

因为它就是这样。

  

是不是“a”应该成为“b”而不是相反?

是的,确实如此。对B的引用是向上转换为对'A'的引用。