我对此代码感到困惑
String[][] str=new String[2][3];
Object[] obj=str;
编译好。因为Object是超类String是子类
但以下代码会产生错误
class Ex { }
class Ex1 extends Ex { }
class ExTest {
public static void main(String[] args)
{
Ex1[][] ex1=new Ex1[2][3];
Ex[] ex=ex1;
}
}
但是此代码会产生错误原因
答案 0 :(得分:3)
它编译,因为obj
现在将包含两个一维String[]
个对象。
以下所有内容将编译:
String[][] str = new String[2][3];
Object obj1 = str;
Object[] obj2 = str;
Object[][] obj3 = str;
答案 1 :(得分:1)
所有数组实例也是java.lang.Object
的实例。因此,以下所有作业都是合法的。 objArr1
数组的元素是一维String
数组。
Object obj1 = new String[3];
Object obj2 = new int[3];
Object obj3 = new String[3][3];
Object[] objArr1 = new String[3][4];
更新:
class Ex { }
class Ex1 extends Ex { }
class ExTest {
public static void main(String[] args) {
Ex1[][] ex1=new Ex1[2][3];
Ex1[][][] exArr=new Ex1[2][3][3];
Object obj = exArr; //valid
Object objArr[] = ex1; // valid assignment. every array instances are also object
Object[][] obj2Arr = exArr; // valid
Object[][][] obj3Arr = exArr; //valid
Obejct[][][][] obj4Arr = exArr; //compiler error. obj4Arr is 4 dimensional, whereas exArr is three..
Ex[] ex=ex1; // compiler error
Ex1[] ex1Arr = ex1 ; // compiler error
}
}
即使元素类型相同,也不能为彼此分配不同的维数组。您可以将任何具有任何维度的数组分配给维数小于或等于指定数组维度的Object数组。因为每个数组实例也是Object实例..
答案 2 :(得分:1)
当你意识到java数组时,无论它们具有多少维数,都是有意义的......在IS-A关系方面的对象。因此,对象数组可以容纳几乎任何数组,因为每个数组都是 Object 。
答案 3 :(得分:0)
首先,我要强调一下:
Object是所有数组类型的直接超类
是单维数组还是多维数
或String数组或任何其他派生类型的数组。
我对此代码感到困惑
String[][] str=new String[2][3]; Object[] obj=str;
编译好。因为Object是超类String是子类 类
这里假设我们有
Object[] objArray = new Object[2];
objArray[0]= // it can hold something which is of type object
// as we know String[] IS A Object, so I can assign it here like below
String[] strArray = new String[3];
objArray[0] = strArray ;
这里我将单个维String
数组指定为objArray
的元素,因此我们可以说objArray可以保存2d String数组,即String[][]
,即
Object[] objArray = new String[2][];
但以下代码会产生错误
class Ex { } class Ex1 extends Ex { } class ExTest { public static void main(String[] args) { Ex1[][] ex1=new Ex1[2][3]; Ex[] ex=ex1; } }
但是此代码会产生错误原因
这是因为ex[0]
可以保存一个IS Ex
。
假设允许Ex[] ex=ex1;
然后ex[0]
应该能够保存Ex1
ex[0] = new Ex1[3];// but this can not be possible as Ex1[] IS A Object NOT Ex