数组真的是同质的吗?

时间:2018-04-21 23:17:25

标签: java arrays data-structures collections

在下面的代码中,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();
        }
    }

1 个答案:

答案 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