4

好的。因此,如果...

int x=3;
int y=5;


x=y;

这样就可以了x=5,对吧?

好的,所以 ifBA...的子类

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

a=b;

^^^为什么这被认为是向上转换?

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

4

4 回答 4

10

让我们跳到一个具体的例子,而不是As 和s。B

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 {
        // ...
    }
}

当你有一个ComputerScientistas

ComputerScientist cs = new ComputerScientist();

您可以同时访问greetvalidateAlgorithm。您知道(她)他是一个Person,并且可以将greet他/她与任何其他人一样。但是,您也可以专门将他/她视为ComputerScientist.

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

Person p = cs;

这相当于

Person p = (Person) cs;

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

之所以称为向上转换,是因为变量在层次结构树中向上,向上表示更一般/抽象向下表示更具体。您将a概括ComputerScientistPerson.

于 2013-09-29T10:34:54.657 回答
7

之后a = b;,变量a(用 type 声明A)将引用 type 的对象B。因此,赋值涉及一个隐式向上转换:a = (A)b;,将 Java 视图的方式b从转换B为它的超类A。那是一个上流。

于 2013-09-29T09:56:01.457 回答
1
A a = new A();
B b = new B();

流程如下:

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

现在来解决您的问题,这就是a=bUPCAST​​ING的原因

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

这个链接会让它更清楚https://www.youtube.com/watch?v=Wh-WZXCAarY

希望这可以帮助。

于 2015-03-14T05:22:08.257 回答
0

这将使x = 5,对吗?

正确的。

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

^^^为什么这被认为是向上转换?

因为就是这样。

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

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

于 2013-09-29T10:09:26.447 回答