【问题标题】:Upcasting and Downcasting confusion in javajava中的向上转换和向下转换混淆
【发布时间】:2013-09-29 09:51:03
【问题描述】:

好的。所以如果...

int x=3;
int y=5;


x=y;

那就是x=5,对吧?

好的,如果BA 的子类...

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

a=b;

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

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

【问题讨论】:

    标签: java downcast upcasting


    【解决方案1】:

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

    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表示更一般/抽象 em> 和 down 表示更具体。您将ComputerScientist概括Person

    【讨论】:

    • +!,很好的解释:-)
    【解决方案2】:

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

    【讨论】:

    • 请注意,虽然b所引用的对象将被视为A,但a = b之后,所引用的对象仍然是B,它不是字面上转换。例如,所有被覆盖的方法都保持被覆盖。
    【解决方案3】:
    A a = new A();
    B b = new B();
    

    流程如下:

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

    现在来解决您的问题,这就是为什么 a=b 正在升级

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

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

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      这将使 x=5,对吗?

      没错。

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

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

      因为它就是这样。

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

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

      【讨论】:

      • 这真的回答了这个问题吗? OP在问为什么。您重复了 OP 已经知道的内容。
      猜你喜欢
      • 1970-01-01
      • 2017-03-16
      • 1970-01-01
      • 2017-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多