关于 Java 类的向上转型和向下转型的疑问 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Not404
V2EX    Java

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

  •  
  •   Not404 2021 年 6 月 4 日 2912 次点击
    这是一个创建于 1778 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 年 6 月 4 日 via iPhone
    1 就是上转型,将父类的引用指向子类的实例 或者将子类对象赋值给父类引用
    secondwtq
        2
    secondwtq  
       2021 年 6 月 4 日
    搜 Java array covariant
    sutra
        3
    sutra  
       2021 年 6 月 4 日
    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 年 6 月 4 日
    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 年 6 月 4 日
    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 年 6 月 4 日
    Java 数组的缺陷。Java 数组是协变的. 这样设计是因为早期没有泛型的时候充当泛型。当然数组还有无任何 final,volatile 语义等缺陷。
    sakura1
        7
    sakura1  
       2021 年 6 月 4 日
    这是泛型里的协变和逆变的概念,就是
    sakura1
        8
    sakura1  
       2021 年 6 月 4 日
    A extends B
    sakura1
        9
    sakura1  
       2021 年 6 月 4 日
    ...换行失败,打扰了
    Not404
        10
    Not404  
    OP
       2021 年 6 月 4 日
    @RiceMarch 嗯嗯 已经理解了。谢谢。之前没有搜索对。
    Not404
        11
    Not404  
    OP
       2021 年 6 月 4 日
    @sakura1 嗯嗯 搜到了讲解。明白了。谢谢啦。
    Not404
        12
    Not404  
    OP
       2021 年 6 月 4 日
    @huang119412 嗯 通过协变又去了解了其他几个概念。谢谢啦
    Not404
        13
    Not404  
    OP
       2021 年 6 月 4 日
    @secondwtq
    @sutra
    谢谢啦。找到关键字去搜索了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5034 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 42ms UTC 01:20 PVG 09:20 LAX 18:20 JFK 21:20
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86