在下面的代码中,EX1和EX 2提供了齐次理论,但在EX3中它保存了多个类型的值。那么,我们怎么说阵列是同质的呢?这背后的确切理论是什么?
public class Test {
public static void main(String[] args) {
// Ex 1
int [] intArr = new int[5];
intArr[0] = 1;
intArr[1] = 2;
// Ex 2
int [] intArr2 = new int[5];
intArr2[0] = 1;
intArr2[1] = "ss";
// Ex 3
Object [] objArr = new Object[5];
objArr[0] = 1;
objArr[1] = "ss";
objArr[3] = new Object();
}
}
答案 0 :(得分:3)
这里有两个概念:继承和自动装箱
Inheritance - String继承自Object,因此是一个Object。这意味着String在编译时自动获取Object类中定义的所有方法和属性。它是一个Object以及特定于String的附加内容。但是,它可以被Java视为Object,因为它是一个Object。将它添加到数组时,它将作为Object添加,而不是作为String添加。这是因为Array被定义为一个对象数组。
char a = "ss".charAt(1); // Legal as charAt(..) is a method in the String class
Object [] objArr = new Object[5];
objArr[1] = "ss";
objArr[1].charAt(1); // Not legal because charAt(..) method is not defined for Object
请参阅Oracle Tutorial。
Auto-Boxing - Java执行一种称为自动装箱的快捷方式,以自动将原语转换为一组特殊的包装类,所有这些包都继承自Object。因此,由于自动装箱和继承,为Object分配一个数字也会将该数字转换为Object。
因此,添加到数组中的所有内容都被添加为Object。确实,数组中的对象可能是从Object继承的类。但是,就数组而言,它们是Object类型。即便如此,如果你要将它从数组中拉出并将其作为整数投射,你可以这样做。它仍然带有整数信息,但没有强制转换就无法获得该信息。从数组的角度来看,它只是一个Object。
请参阅Oracle Tutorial。