2017-08-02 79 views
1

我正在用java中的向上转换和向下转换的概念,这也被称为扩大和缩小。Java中的上传如何工作?

  • UpCasting(加宽)从派生类自动发生到基类。即它是否具有is-a关系。
  • 向下播放必须明确进行运行时检查。

好的,我明白了一切。但是,在这种情况下它是如何工作的?

public class ObjPair { 
    Object first; 
    Object second; 

    public ObjPair(Object first, Object second) { 
     this.first = first; 
     this.second = second; 
    } 

    public Object getFirst() { 
     return first; 
    }  
    public Object getSecond() { 
     return second; 
    } 

    public static void main(String[] args) { 
     ObjPair objPair = new ObjPair("A",2.2); // Goes widning conversion 
     System.out.println(objPair.getFirst()); 
     System.out.println(objPair.getSecond()); 
    } 
} 

ObjPair objPair =新ObjPair( “A”,2.2);

  • 这个正在经历上溯造型,字符串反对和双反对和国家越来越店在objPair。大..!!!

现在,当我做objPair.getFirst()objPair.getSecond()。它返回我A2.2

  • 它是如何记住字符串和双精度的,加宽/ upcast应该记住超类的状态和方法。
  • 它如何访问子类的类型和值?
+0

那么,在你的'ObjPair'中,它被存储为一个字符串和一个double。 – Nathan

+0

upcast后它被存为Object,不是吗?这就是上传发生的地方。 – Ritesh

+3

此外,Object类还有一个toString()方法,它将使用println()。字符串和双精度(从双精度自动装箱)覆盖toString()以正确打印它们的值。 –

回答

3

对象引用的浇铸会变化的对象。它简单地允许将其分配到不同类型的引用。对象本身保持不变。

就你而言,它需要两个Object引用,它检查兼容性(那里没有问题),然后在Object类型的变量中设置引用。该实例本身并没有改变。如果他们有覆盖那些Object方法,那么压倒一切的方法将被调用。

因此,当涉及打印对象的部分时,它只是使用String.valueOf,它调用对象的toString()方法。从Object变量访问的实例实际上是String对象,String重写toString()以返回自身。 Double也覆盖toString。这些覆盖被调用,因为实例仍然是String的一个实例,并且是Double的一个实例。只有参考是Object

请注意,您也有一个演员,从doubleDouble那里。这隐含的拳击确实更改对象 - 它需要一个原语,并从它创建一个新的Double

+0

如果需要,您可以将我的视觉示例添加到您的答案中。 – Nathan

1

请记住:在对象在内存它是什么。如果您创建一个Double对象,则它是一个类似于数值的Double对象。

让拥有参考变量使用超类型的事实并不影响参考在所有对象!

在你的例子中,自动装箱的封面下创建一个Double对象,并且getSecond()返回一个对该对象的引用Double对象。

这就是这一切。

0

好吧,让我们来看一个例子。你有一个大的方形框,命名为对象和另一个小盒子。如果你把这个小盒子放在你的大盒子里,小盒子和大盒子的所有属性都在大盒子里。 然后在小盒子里面,有两根棍子,你把第一根棍子标为'A',其次是'2.2'。 现在大箱子可以看到小盒子里面的东西。现在就在那个时候,这个小盒子里有两根棍子,并按照它们的方式标记。 (记住Object类始终是java中每个类的超类/父类)。

+0

这是正确的,除非属性相同,否则大框看不到小框内实现的内容。在我的情况下,它需要toString()实现小框(双和字符串)。 – Ritesh

0

如果你简单地测试了此代码:

public class Main { 

    public Object first; 
    public Object second; 


    public static void main (String[] args){ 
     Main a = new Main(); 
     a.first = new String("foo"); 
     a.second = 5; 

     System.out.println(a.first.getClass().toString()); 
    } 
} 

它输出class java.lang.String。你可以看到它没有被存储为Object。这是通过使用元数据来实现的。