[英]Why are we able to assign arrays to reference of type Object in Java?
作為學習的一部分,以下是我試圖理解的病理學例子,
class C{}; interface I{}; class S extends C implements I{};
class B{};
有了這些聲明,我可以說, class C
class B
類是Object
類的直接子類,可以從這些類中訪問Object
類的所有方法。 但,
1)當我聲明interface I{};
interface I
如何與Object
類相關?
在接下來,下面是對數組類型的一些賦值,后面是子類到超類賦值和反之亦然。
C[] c = new C[4];
S[] s = new S[6];
I[] i = new S[0];
B[] b = new B[2];
//i = new C[2]; Compile error
i =s; c=s; s = (S[])c; i = (I[])c;
i = (I[])b; //Run-time error
我了解到數組是'第一類對象'和Object
類的直接子類,
Object o = c; // i mean `I i = c;` will not work `I[] i =c;` works
2)關於上面的定義(語法),'數組是第一類對象'是什么意思?因為Object[] oa = c;
因為class C
類是Object
類的直接子類,所以對我有意義。
當我聲明接口I {}; 接口I如何與Object類相關?
從Java語言規范 :
如果接口沒有直接的超接口 ,則接口隱式聲明一個公共抽象成員方法m,其中包含簽名s,返回類型r和throws子句t,對應於具有簽名s的每個公共實例方法m,返回類型r和throws子句t在Object中聲明 ,除非接口顯式聲明具有相同簽名,相同返回類型和兼容throws子句的方法。
我如何考慮指向數組c的引用變量o
如注釋中所述, 數組本身是Object
的子類,因此以下賦值有效:
Object o = c;
Java語言規范的相關部分說:
在Java編程語言中, 數組是對象 (§4.3.1),是動態創建的, 可以分配給Object類型的變量 (§4.3.2)。
這也是“數組是第一類對象”的含義。 在Java中,數組不是特殊類型或某些特殊構造 - 它本質上是Object
的子類,具有附加字段(特別是length
)(以及一些額外的編譯器支持,以便能夠在語法上描述和初始化數組)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.