请教一个基本的java问题~

来源:百度知道 编辑:UC知道 时间:2024/05/09 08:40:16
如下代码:
class A {

}

class B extends A {

}

class Demo {
public static void main(String[] args) {
A[] x = new B[5];
x[0] = new B();
x[1] = new A();
}
}
那句 A[] x = new B[5] 是啥意思呀?x数组的类型到底是A还是B?
另外上面的代码可以通过编译,但执行却会抛出异常。为什么编译是没有异常呢?

A[] x = new B[5];
声明了一个A类型的数组变量并指向了一个大小为5的B类型的数组

x数组变量被声明为A类型(声明类型),但是它指向了一个B类型的数组(实际类型),因为x被声明为A类型的,编译时,可以放入A类或者A类的子类对象,所以x[1] = new A(); 编译没有问题
因为B是A的子类,x[0] = new B(); 编译也会通过

但是运行时会有问题,运行时的数组是B类型的,只能往里面放入B类或者B类的子类的对象
x[1] = new A(); 就会抛出异常ArrayStoreException,因为A不是B的子类

总结一下,意思就是编译时只检查声明的类型,而运行时会检查实际的类型

class B extends A
说明类B继承自类A,B是A的子类,除具有A类的全部方法和属性外,还具有自己的一些属性和方法.

那么就可以得出:A里面有的,B里面也都有,B里面有的,A类里面不一定有.

所以A[] x = new B[5];的意思是创建一个指向B类的A类数组对象X,其中5是数组的length,也就是X中有5个B类对象,因为B继承自A,所以A也可以是该数组中的元素.