Java 中的向上转换是如何工作的?

How does upcasting works in Java?

我在 java 中使用了向上转型和向下转型的概念,它们也被称为扩大和缩小。

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

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 = new ObjPair("A",2.2);

现在,当我执行 objPair.getFirst()objPair.getSecond() 时。它 returns 我 A2.2.

记住:内存中的对象它是什么。如果你创建了一个Double对象,那么它就是一个类似于数值的Double对象。

保存引用的变量使用超类型这一事实不会影响引用的对象到

在您的示例中,自动装箱在封面下创建了一个 Double 对象,并且getSecond() returns 对该 Double 对象的引用。

仅此而已。

对象引用的转换不会改变对象。它只是允许将其分配给不同类型的引用。对象本身保持不变。

在你的例子中,它需要两个 Object 引用,它会检查兼容性(没问题),然后将引用设置到 Object 类型的变量中。实例本身不会改变。如果他们有覆盖 Object 的方法,那么将调用覆盖的方法。

因此,当涉及到它打印对象的部分时,它只是使用String.valueOf,它调用了对象的toString()方法。从 Object 变量访问的实例实际上是一个 String 对象,并且 String 覆盖 toString() 到 return 本身。 Double 也覆盖 toString。这些覆盖被调用,因为实例仍然是 String 的实例和 Double 的实例。只有引用是 Object.

请注意,您还有一个从 doubleDouble 的转换。这个隐式装箱 确实 改变了对象 - 它接受一个原语并从中创建一个新的 Double

好了,就是这样,我们举个例子。您有一个名为 Object 的大方框和另一个小方框。如果你把这个小盒子放在你的大盒子里,小盒子和大盒子的所有属性都在大盒子里。 然后在小盒子里,有两根棍子,你将第一根棍子标记为 'A',第二根棍子标记为“2.2”。 现在大盒子可以看到小盒子里面的东西了。现在就在那一刻,小盒子里有两根棍子,并按原样贴上了标签。 (记住对象 class 始终是 java 中每个 class 对象的超 class/parent。

如果您只是测试这段代码:

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。这是通过使用 元数据 .

实现的