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

2021-06-04 01:02:03 +08:00
 Not404
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 类型?
这里我就不理解了
求解答
2054 次点击
所在节点    Java
13 条回复
RiceMarch
2021-06-04 01:49:43 +08:00
1 就是上转型,将父类的引用指向子类的实例 或者将子类对象赋值给父类引用
secondwtq
2021-06-04 05:04:06 +08:00
搜 Java array covariant
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
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
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
2021-06-04 10:31:03 +08:00
Java 数组的缺陷。Java 数组是协变的. 这样设计是因为早期没有泛型的时候充当泛型。当然数组还有无任何 final,volatile 语义等缺陷。
sakura1
2021-06-04 10:57:35 +08:00
这是泛型里的协变和逆变的概念,就是
sakura1
2021-06-04 10:57:50 +08:00
A extends B
sakura1
2021-06-04 10:58:06 +08:00
...换行失败,打扰了
Not404
2021-06-04 11:20:23 +08:00
@RiceMarch 嗯嗯 已经理解了。谢谢。之前没有搜索对。
Not404
2021-06-04 11:21:06 +08:00
@sakura1 嗯嗯 搜到了讲解。明白了。谢谢啦。
Not404
2021-06-04 11:21:54 +08:00
@huang119412 嗯 通过协变又去了解了其他几个概念。谢谢啦
Not404
2021-06-04 11:22:20 +08:00
@secondwtq
@sutra
谢谢啦。找到关键字去搜索了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/781249

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX