V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Not404
V2EX  ›  Java

关于 Java 类的向上转型和向下转型的疑问

  •  
  •   Not404 · 2021-06-04 01:02:03 +08:00 · 2255 次点击
    这是一个创建于 1298 天前的主题,其中的信息可能已经有所发展或是发生改变。
    class A { }
    class B extends A { }

    在 main 中
    A a = new B(); 是可以的 1⃣️

    但是
    A[] a = new B[2] ----> 这里的 a 是 A 类型,但是里面的元素实际上是 B 类型??

    a[0] = new A () ---> 按照 1⃣️中,这里的 a[0] 应该是 A 类型,但是实际上却是 B 类型。
    a[1] = new B();

    在 1⃣️里,一个 A 类型的 a,实际内部是 B 类型?
    所以 A[] a 是一个 A 类型的数组,但里面都是 B 类型的元素?
    所以 a[0] 是 B 类型?
    这里我就不理解了
    求解答
    13 条回复    2021-06-04 11:22:20 +08:00
    RiceMarch
        1
    RiceMarch  
       2021-06-04 01:49:43 +08:00 via iPhone
    1 就是上转型,将父类的引用指向子类的实例 或者将子类对象赋值给父类引用
    secondwtq
        2
    secondwtq  
       2021-06-04 05:04:06 +08:00
    搜 Java array covariant
    sutra
        3
    sutra  
       2021-06-04 08:28:22 +08:00
    package java.lang;

    /**
    * Thrown to indicate that an attempt has been made to store the
    * wrong type of object into an array of objects. For example, the
    * following code generates an {@code ArrayStoreException}:
    * <blockquote><pre>
    * Object x[] = new String[3];
    * x[0] = new Integer(0);
    * </pre></blockquote>
    *
    * @since 1.0
    */
    public class ArrayStoreException extends RuntimeException {
    cpstar
        4
    cpstar  
       2021-06-04 09:09:14 +08:00
    a[0]和 a[1]都是 A 类型,实际指针指向的存储,一个 A 实例一个 B 实例。
    调用的时候 a[0]/a[1]都无法调用 B 的扩展方法,如果 B 实现了 A 的 override 方法,则实现多态,调用 a[1]的时候,调用的是 B 的方法,a[0]则是 A 的方法。
    然后可以 B b=(B)a[1],而如果 B b=(B)a[0]则抛 ClassCastException
    cpstar
        5
    cpstar  
       2021-06-04 09:12:13 +08:00
    A[] a,申明了 a 是 A 类型的数组

    A[] a=new B[2],则是创建了两个 B 实例,并且将引用给 a[]
    然后
    a[0]=new A(),则又创建了一个 A 实例,并将引用给 a[0]。
    所以此时 a[]保有这两个引用,一个指向 A 实例,一个指向 B 实例。
    huang119412
        6
    huang119412  
       2021-06-04 10:31:03 +08:00
    Java 数组的缺陷。Java 数组是协变的. 这样设计是因为早期没有泛型的时候充当泛型。当然数组还有无任何 final,volatile 语义等缺陷。
    sakura1
        7
    sakura1  
       2021-06-04 10:57:35 +08:00
    这是泛型里的协变和逆变的概念,就是
    sakura1
        8
    sakura1  
       2021-06-04 10:57:50 +08:00
    A extends B
    sakura1
        9
    sakura1  
       2021-06-04 10:58:06 +08:00
    ...换行失败,打扰了
    Not404
        10
    Not404  
    OP
       2021-06-04 11:20:23 +08:00
    @RiceMarch 嗯嗯 已经理解了。谢谢。之前没有搜索对。
    Not404
        11
    Not404  
    OP
       2021-06-04 11:21:06 +08:00
    @sakura1 嗯嗯 搜到了讲解。明白了。谢谢啦。
    Not404
        12
    Not404  
    OP
       2021-06-04 11:21:54 +08:00
    @huang119412 嗯 通过协变又去了解了其他几个概念。谢谢啦
    Not404
        13
    Not404  
    OP
       2021-06-04 11:22:20 +08:00
    @secondwtq
    @sutra
    谢谢啦。找到关键字去搜索了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1092 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 18:02 · PVG 02:02 · LAX 10:02 · JFK 13:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.