首页 文章

在java中的上传和下传混乱

提问于
浏览
4

好的 . 因此,如果...

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

    而不是 AB ,让我们跳到一个具体的例子 .

    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表示更通用/抽象,down表示更具体 . 你将 ComputerScientist 概括为 Person .

  • 8

    a = b; 之后,变量 a (使用类型 A 声明)将引用 B 类型的对象 . 因此,赋值涉及隐式upcast: a = (A)b; ,转换Java如何将 bB 视图到其超类 A . 这是一个向上倾斜 .

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

    流程如下:

    • A的对象是使用 new A() 创建的,而ASSIGNED是用于引用变量a类似于B的对象是使用 new B() 和ASSIGNED创建的参数变量b

    • 这里需要注意的是评估从右侧到左侧,这就是为什么首先计算右侧并将结果分配给各个变量的原因 .

    现在出现问题,这就是为什么 a=b 是UPCASTING

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

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

    希望这可以帮助 .

  • 7

    那会使x = 5,对吗?

    对 .

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

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

    因为那就是它 .

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

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

相关问题