簡體   English   中英

為什么我們能夠在Java中將數組分配給Object類型的引用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM