关于 Java 类的向上转型和向下转型的疑问 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Not404
V2EX    Java

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

  •  
  •   Not404 Jun 4, 2021 2932 views
    This topic created in 1788 days ago, the information mentioned may be changed or developed.
    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 replies    2021-06-04 11:22:20 +08:00
    RiceMarch
        1
    RiceMarch  
       Jun 4, 2021 via iPhone
    1 就是上转型,将父类的引用指向子类的实例 或者将子类对象赋值给父类引用
    secondwtq
        2
    secondwtq  
       Jun 4, 2021
    搜 Java array covariant
    sutra
        3
    sutra  
       Jun 4, 2021
    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  
       Jun 4, 2021
    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  
       Jun 4, 2021
    A[] a,申明了 a 是 A 类型的数组

    A[] a=new B[2],则是创建了两个 B 实例,并且将引用给 a[]
    然后
    a[0]=new A(),则又创建了一个 A 实例,并将引用给 a[0]。
    所以此时 a[]保有这两个引用,一个指向 A 实例,一个指向 B 实例。
    huang119412
        6
    huang119412  
       Jun 4, 2021
    Java 数组的缺陷。Java 数组是协变的. 这样设计是因为早期没有泛型的时候充当泛型。当然数组还有无任何 final,volatile 语义等缺陷。
    sakura1
        7
    sakura1  
       Jun 4, 2021
    这是泛型里的协变和逆变的概念,就是
    sakura1
        8
    sakura1  
       Jun 4, 2021
    A extends B
    sakura1
        9
    sakura1  
       Jun 4, 2021
    ...换行失败,打扰了
    Not404
        10
    Not404  
    OP
       Jun 4, 2021
    @RiceMarch 嗯嗯 已经理解了。谢谢。之前没有搜索对。
    Not404
        11
    Not404  
    OP
       Jun 4, 2021
    @sakura1 嗯嗯 搜到了讲解。明白了。谢谢啦。
    Not404
        12
    Not404  
    OP
       Jun 4, 2021
    @huang119412 嗯 通过协变又去了解了其他几个概念。谢谢啦
    Not404
        13
    Not404  
    OP
       Jun 4, 2021
    @secondwtq
    @sutra
    谢谢啦。找到关键字去搜索了。
    About     Help     Advertise     Blog     API     FAQ     Solana     6172 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 53ms UTC 06:20 PVG 14:20 LAX 23:20 JFK 02: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