該問題從clone()方法開始引出。
clone()是基類Object類中的一個protected方法。
對該方法做以下測試
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)用成功,因為A是object的子類,繼承了Object中的clone()方法,所以可以直接調(diào)用。
public class B { public static void main(String[] args) { A a = new A(); // 調(diào)用失敗 a.clone(); } }
錯誤信息:
以上調(diào)用出錯,A和B都是Object的子類,都繼承了clone()方法,但不能在一個子類中調(diào)用另一個子類的protected方法。
如果需要在類B中實現(xiàn)對實例a的clone,類A需要重寫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)用成功,因為類A重寫了clone方法,并且申明為public。
public class ArrayClone { public static void main(String[] args) { int[] array = {1, 1, 4, 7}; // 調(diào)用成功 array.clone(); } }
如果把array理解成為Object的子類,那么該array應(yīng)該不能在類ArrayClone中調(diào)用clone()方法。但是可以調(diào)用成功。
此外:
章節(jié)1中,直接在類A中調(diào)用實例a的clone()方法時,IDE明確指出clone()方法是protected的,智能提示上有個小鑰匙。
而在章節(jié)3中,調(diào)用數(shù)組的clone()方法時,IDE提示該方法是public的,智能提示上有個打開的鎖。
1. Java中是否有一個類對應(yīng)數(shù)組?數(shù)組在jvm中是一個怎樣的存在?
2. 數(shù)組的clone()方法是怎么實現(xiàn)的?為什么可以直接調(diào)用?為什么是public的?
3. 數(shù)組的.length方法是怎么實現(xiàn)的?為什么IDE點不進去源碼?
1、Java中并不存在任何一個類對應(yīng)數(shù)組,數(shù)組屬于Java語言的一部分。2、數(shù)據(jù)是特殊的對象,本身就實現(xiàn)了Cloneable
。Object
的clone
方法的javadoc中有這么一句Note that all arrays are considered to implement the interface Cloneable ,所以數(shù)組是可以直接使用clone
方法的。3、數(shù)組對象天生就有一個final
的length
屬性,因為數(shù)組并沒有定義在任何一個類中,所以沒有源碼。
Class c = int[].class;System.out.println(c.getPackage());System.out.println(c.getName());System.out.println(Modifier.toString(c.getModifiers()));
可以這么理解:數(shù)組類是一組特殊的類,由JVM運行時動態(tài)生成,包括它的length屬性及其它方法實現(xiàn)除了int[], boolean[] 這種數(shù)組外,還包含用戶自定義類型的數(shù)組, 比如 com.yourPackage.YourClass[] 這種格式的數(shù)組,以及2維,3維..多維數(shù)組
有個有意思的輸入結(jié)果int[]類的修飾符是 public abstract final這又超出了我們的認知
Java的數(shù)組就是數(shù)組,沒有類與之對應(yīng)。數(shù)組所使用的clone()并非一定要類才能擁有呀,只要編譯器提供了這種語法,一樣可以實現(xiàn)。同樣的,數(shù)組的length也是編譯器解析出來的數(shù)組屬性,并非由Java實現(xiàn),也自然看不到Java的源碼。