继承之后的使用注意事项_ArrayStoreException
今天在看Core In Java第五章节时,看到一个很感兴趣的知识点,如下:
在Java中,子类数组的引用可以转换成超类数组的引用,而不需要采用强制转换。但是,在超类数组的引用添加超类类型引用对象之后,就会出错(ArrayStoreException)!代码如下:
- /**
- * 在第五章节继承中提到了一个很重要的概念
- *
- * 确切的讲是一个继承使用时的忌讳
- *
- * 使用子类类型定义一个数组,然后让一个父类类型数组引用,在父类数组中添加父类类型对象,将出错
- *
- * ArrayStoreException
- *
- * @author Administrator
- *
- */
- public class ArrayStoreExceptionTest {
- /**
- * 测试在继承中的注意事项及忌讳
- *
- * @param args
- */
- public static void main(String[] args) {
- Student[] students = new Student[10];
- Person[] persons = students;
- // 内部类的实例化过程
- Person p1 = new ArrayStoreExceptionTest().new Person(1001, "Jessica");
- persons[0] = p1;
- students[0].setScore(200.1);
- }
- /**
- * Super class Person
- *
- * @author Administrator
- *
- */
- class Person {
- private int id;
- private String name;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Person(int id, String name) {
- super();
- this.id = id;
- this.name = name;
- }
- public Person() {
- super();
- }
- }
- /**
- * Subclass Student
- *
- * @author Administrator
- *
- */
- class Student extends Person {
- private double score;
- public Student(int id, String name, double score) {
- super(id, name);
- this.score = score;
- }
- public double getScore() {
- return score;
- }
- public void setScore(double score) {
- this.score = score;
- }
- }
- }
以上代码中,在main()方法中的代码可以正常编译通过,在运行时将抛出一个ArrayStoreException的运行时异常,原因是:由于persons超类数组对象的引用指向了students子类数组对象的引用,当为persons[0]添加父类对象引用时,将出现这样的情况:JVM会进行检查,由于引用的是子类数组类型对象引用,添加父类引用类型对象如果可以通过,在以下语句将出现更严重的异常!
- students[0].setScore(200.1);
- //将会访问一个不存在的实例域,进而搅乱相邻存储空间的内容!
所以,以上代码块执行之后,将抛出ArrayStoreException,这是一个运行时异常的子类异常!这是使用继承之后的一种忌讳!一定要注意避免!
- Exception in thread "main" java.lang.ArrayStoreException:
- com.harry.coreInJava.chap5.ArrayStoreExceptionTest$Person
- at com.harry.coreInJava.chap5.ArrayStoreExceptionTest.main
- (ArrayStoreExceptionTest.java:30)
所以,如果定义的是一个数组类型对象,则有必要记住这个对象中可以添加什么类型的对象,而不是因为继承关系而扰乱了我们的判断力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~