Java中的數(shù)組有對(duì)應(yīng)的類么,為什么數(shù)組可以直接調(diào)用clone()方法?

科技 未結(jié) 5 1599

該問(wèn)題從clone()方法開(kāi)始引出。

clone()是基類Object類中的一個(gè)protected方法。

對(duì)該方法做以下測(cè)試

1. 在類A中調(diào)用類A實(shí)例a的clone()方法

public class A implements Cloneable { public static void main(String[] args) throws CloneNotSupportedException { A a = new A(); // 調(diào)用正確 A a2 = (A) a.clone(); } }

以上調(diào)用成功,因?yàn)锳是object的子類,繼承了Object中的clone()方法,所以可以直接調(diào)用。

2. 在類B中調(diào)用類A實(shí)例a的clone()方法

public class B { public static void main(String[] args) { A a = new A(); // 調(diào)用失敗 a.clone(); } }

錯(cuò)誤信息:

以上調(diào)用出錯(cuò),A和B都是Object的子類,都繼承了clone()方法,但不能在一個(gè)子類中調(diào)用另一個(gè)子類的protected方法。

如果需要在類B中實(shí)現(xiàn)對(duì)實(shí)例a的clone,類A需要重寫(xiě)clone方法,并且申明為public,如下:

類A:

public class A implements Cloneable { public Object clone() throws CloneNotSupportedException { return super.clone(); } }

類B:

public class B { public static void main(String[] args) throws CloneNotSupportedException { A a = new A(); // 調(diào)用成功 a.clone(); } }

以上調(diào)用成功,因?yàn)轭怉重寫(xiě)了clone方法,并且申明為public。

3. 提出問(wèn)題,數(shù)組為什么可以直接調(diào)用clone()方法

public class ArrayClone { public static void main(String[] args) { int[] array = {1, 1, 4, 7}; // 調(diào)用成功 array.clone(); } }

如果把a(bǔ)rray理解成為Object的子類,那么該array應(yīng)該不能在類ArrayClone中調(diào)用clone()方法。但是可以調(diào)用成功。

此外:

章節(jié)1中,直接在類A中調(diào)用實(shí)例a的clone()方法時(shí),IDE明確指出clone()方法是protected的,智能提示上有個(gè)小鑰匙。

而在章節(jié)3中,調(diào)用數(shù)組的clone()方法時(shí),IDE提示該方法是public的,智能提示上有個(gè)打開(kāi)的鎖。


4. 提問(wèn)

1. Java中是否有一個(gè)類對(duì)應(yīng)數(shù)組?數(shù)組在jvm中是一個(gè)怎樣的存在?
2. 數(shù)組的clone()方法是怎么實(shí)現(xiàn)的?為什么可以直接調(diào)用?為什么是public的?
3. 數(shù)組的.length方法是怎么實(shí)現(xiàn)的?為什么IDE點(diǎn)不進(jìn)去源碼?

5條回答
  •  龍影狂刀
    2023-04-22 02:38

    有個(gè)有意思的輸入結(jié)果int[]類的修飾符是 public abstract final這又超出了我們的認(rèn)知

提交回復(fù)