該問(wèn)題從clone()方法開(kāi)始引出。
clone()是基類Object類中的一個(gè)protected方法。
對(duì)該方法做以下測(cè)試
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)用。
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。
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)的鎖。
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)去源碼?