2013-09-29 42 views
4

好的。所以,如果...java中的向上和向下混淆混淆

int x=3; 
int y=5; 


x=y; 

这会让x=5,对不对?

好了,所以如果BA一个子类...

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

a=b; 

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

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

回答

7

a = b;后,变量a(与A类型声明)将指B类型的对象。因此,作业涉及到一个隐式上传:a = (A)b;,将Java视图bB转换为其超类A。这是一个倒戈。

+1

请注意,虽然'b'所引用的对象将被视为'A',在'a = b'之后,被引用的对象仍然是'B',它不会被*转换。例如,所有重写的方法都会被覆盖。 – afsantos

0

这将使x = 5,对不对?

没错。

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

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

因为这就是它。

不是“a”应该成为“b”而不是其他方式?

是的,它的确如此。对B的引用被上传到对'A'的引用。

+3

这是否真的回答了这个问题? OP在问为什么。你重复了OP已经知道的内容。 –

8

而不是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作为

ComputerScientist cs = new ComputerScientist(); 

您可以访问两个greetvalidateAlgorithm。你知道他是Person,并且可以和其他任何人一样greet他/她。但是,您也可以将他/她具体对待为ComputerScientist

当你将这个对象Person类型的变量,你要做的就是说“我不在乎了,你是一个ComputerScientist。从现在开始,我会好好对待你就像任何其他Person

Person p = cs; 

即相当于

Person p = (Person) cs; 

通过p所指的对象仍然知道如何validateAlgorithm,并且还告诉你,他(她)工作在信息部。然而,当通过p,访问它时,你告诉编译器,你只想要greet这个Person,没有别的。

它被称为向上转型因为变量在分层结构树,其中意味着进入更一般/抽象意味着更具体。你是推广 a ComputerScientist作为Person

+0

+!,很好的解释:-) –

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

的流程如下:使用new A()被创建并分配给refrence变量 类似B的对象使用new B()创建

  • A的对象和分配给该refrence变量b
  • 这里需要注意的一点是评估从右侧到左侧,这就是为什么首先计算右侧并将结果分配给各个变量的原因。

现在来到你的问题,这也是为什么a=b被向上转型

  • 上述几点适用于本声明为好,先计算b是的一个子类。现在,因为你将一个子类分配给一个超类,所以隐式转换从一个子类型发生到一个超类型,这个类型是UPCAST​​ING的。

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

希望这有助于。