`

继承之后的使用注意事项_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 数组元素类型不匹配异常(ArrayStoreException)

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

    主要介绍了使用IDEA异常断点来定位java.lang.ArrayStoreException的问题,平常开发过程中面对这种描述不够清楚,无法定位具体原因的问题该如何处理,下面我们来一起学习一下吧

    Java开发图像合成系统

    Java开发图像合成系统

    Java范例开发大全 (源程序)

     实例37 数组元素类型不匹配异常(ArrayStoreException) 56  实例38 强制类型转换异常(ClassCastException) 56  实例39 索引越界异常(IndexOutOfBoundsException) 57  实例40 空指针异常...

    java范例开发大全(pdf&源码)

    实例37 数组元素类型不匹配异常(ArrayStoreException) 56 实例38 强制类型转换异常(ClassCastException) 56 实例39 索引越界异常(IndexOutOfBoundsException) 57 实例40 空指针异常(NullPointerException) ...

    java范例开发大全源代码

     实例37 数组元素类型不匹配异常(ArrayStoreException) 56  实例38 强制类型转换异常(ClassCastException) 56  实例39 索引越界异常(IndexOutOfBoundsException) 57  实例40 空指针异常...

    java范例开发大全

    实例37 数组元素类型不匹配异常(ArrayStoreException) 56 实例38 强制类型转换异常(ClassCastException) 56 实例39 索引越界异常(IndexOutOfBoundsException) 57 实例40 空指针异常(NullPointerException) ...

    JAVA面试题最全集

    被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载 finally?再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,...

    java 面试题 总结

    抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。...

    超级有影响力霸气的Java面试题大全文档

    1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是...

    Java范例开发大全(全书源程序)

    实例37 数组元素类型不匹配异常(ArrayStoreException) 56 实例38 强制类型转换异常(ClassCastException) 56 实例39 索引越界异常(IndexOutOfBoundsException) 57 实例40 空指针异常(NullPointerException...

    java面试题全攻略,几乎包罗全部面试过程中可能遇到的问题

    ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException...

    java编程常见问题

    当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。 46.java.lang.CloneNotSupportedException 不支持克隆异常。当没有实现Cloneable接口或者不支持克隆方法时,...

    java 异常总结

    该错误及其所有子类指示某个类依赖于另外一些类,在该类编译之后,被依赖的类改变了其类定义而没有重新编译所有的类,进而引发错误的情况。 java.lang.NoClassDefFoundError 未找到类定义错误。当Java虚拟机或者类...

Global site tag (gtag.js) - Google Analytics