`

继承之后的使用注意事项_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)



所以,如果定义的是一个数组类型对象,则有必要记住这个对象中可以添加什么类型的对象,而不是因为继承关系而扰乱了我们的判断力!
分享到:
评论

相关推荐

    java 数组元素类型不匹配异常(ArrayStoreException)

    当你尝试将一个与数组声明类型不兼容的元素存储到数组中时,Java会抛出一个`ArrayStoreException`。这个异常是`java.lang`包下的,它是`RuntimeException`的一个子类,表明在运行时发生了类型不匹配的问题。 ### ...

    使用IDEA异常断点来定位java.lang.ArrayStoreException的问题

    使用IDEA异常断点来定位java.lang.ArrayStoreException的问题 通过使用IDEA的异常断点功能,可以快速定位Java程序中抛出的异常,例如java.lang.ArrayStoreException。在本文中,我们将介绍如何使用IDEA异常断点来...

    java.lang.ArrayStoreException(解决方案).md

    项目中碰到的,记录一下解决方案

    Java开发图像合成系统

    Java开发图像合成系统

    Java编程异常处理最佳实践【推荐】

    在try中使用了一个资源,比如InputStream,之后需要关闭它。在这种情况下,一个常见的错误是在try的末尾关闭了资源。但是,这种方法存在问题,只要不抛出异常,这种方法就可以很好地运行。但是你在try里调用了一个或...

    hibernat调用过程和函数

    )}` 并使用 `query.setParameter(1, "99")` 时,会抛出异常 `java.lang.ArrayStoreException`。这是因为Hibernate在处理参数时发生了类型不匹配。 **解决方案**: 1. **检查存储过程参数类型**:确保存储过程中定义...

    Java ArrayList.add 的实现方法

    需要注意的是,在 add(int index, E element) 方法中,我们使用 System.arraycopy 方法来复制数组元素,这是一个 native 方法,它的实现是基于 C++ 语言的。很多人认为 System.arraycopy 方法是调用底层的 memcpy ...

    Java面试宝典2017 下载 高清完整PDF版

    50. Java中有多种实现多线程的方式,包括实现Runnable接口、继承Thread类,同步的实现方法包括使用synchronized关键字和使用java.util.concurrent包下的工具类。 51. 启动线程使用start()方法,而不是run()方法。 ...

    Java 面试题

    - `switch`语句不可以直接作用于`long`类型,但在Java 7及以后版本中,通过扩展支持了`long`类型。 - `switch`语句可以作用于`String`类型,同样是在Java 7之后添加的支持。 #### 6. `short`类型的操作 - `short s1...

    java面试基础知识.doc

    Runtime Exception 是 Java 语言中的一种异常类型,包括 ArithmeticException、ArrayStoreException、BufferOverflowException、BufferUnderflowException 等许多类型。 接口和继承 在 Java 语言中,接口可以继承...

    java面试2016

    常见的`runtime exception`包括`NullPointerException`、`IndexOutOfBoundsException`、`ArrayStoreException`、`IllegalArgumentException`、`SecurityException`等。 #### 45. 异常处理的关键字 - `throws`:声明...

    java面试宝典

    - 对于`long`,JDK 7及之后版本支持使用`switch`语句,但在JDK 6及更早版本中不支持。 - `switch`语句从JDK 7开始支持`String`类型。 **6. shorts1=1;s1=s1+1;有什么错?shorts1=1;s1+=1;有什么错?** - `short s1=1...

    java 面试宝典

    - **接口**:只能包含抽象方法(Java 8 以后可以包含默认方法和静态方法),不能有构造函数。 **25. abstract 的 method 是否可同时是 static, 是否可同时是 native,是否可同时是 synchronized?** - **不可以同时...

    java面试题集总结

    2. **注意事项**:不要将`String`的`length()`方法与数组的`length`属性混淆。虽然两者都可以表示“长度”,但其含义和使用方式不同。 #### 十二、重载 (`Overload`) 与 重写 (`Override`) 1. **重载 (Overload)**...

    Java面试宝典2022版(超长版).docx

    - **`ArrayStoreException`**: 尝试将不兼容的对象存储到数组中。 #### 45. 异常处理的关键字 - **`throws`**: 用于声明方法可能抛出的异常。 - **`throw`**: 用于抛出异常。 - **`try`**: 用于包裹可能抛出异常的...

    java面试部分

    - 实现多线程:继承`Thread`类、实现`Runnable`接口、使用`ExecutorService`框架。 - 实现同步:使用`synchronized`关键字、使用显式锁(`Lock`接口)。 #### 51. 线程启动 - 启动线程应使用`start()`方法,而不是...

Global site tag (gtag.js) - Google Analytics