首先我們從C++說起, c++可以多繼承。也就是一個類型 --- class,可以繼承自2個以上的父類型。多繼承導致一個問題,很多人知道。例如,如果類型B,類型C均繼承自類型A。然后類型D繼承自類型B和C。那么構造D的實例的時候,由於要調用父類型的構造方法,最終會調用兩次A的構造方法。結果類型D的實例有兩套祖父的數據,也就是外公和爺爺長的一模一樣,以后使用的時候很麻煩。每次D要和祖父打交道,都要額外的區分到底是外公還是爺爺。 再說,內存里面出現兩套一模一樣的東西,一個用不上,還容易引起混亂,豈不是浪費,又麻煩。
所以,java就通過嚴格的單一繼承規則解決了這個問題。.net當然也一樣,單一集成是一個定律。那么有:
所有的類型 --- 只能繼承自單一的類型;
其次,大家知道,從一個class派生的必然是另一個class。Object是一個class,如果interface繼承自Object,那么interface必然是一個class。那么,如果一個類型實現了一個interface,再有一個基類class, 那么它們的根源都是Object, 也即是這個類的實例也像c++一樣,存在上述的問題。 因此接口肯定不是繼承自Object,否則就違反了單一繼承的定律。
- Set<String> result = new HashSet<String>();
- for (Method m : Set.class.getMethods())
- result.add(m.getName());
- System.out.println(result);
打印結果為:[iterator, toArray, addAll, remove, equals, containsAll, hashCode, contains, add, size, clear, isEmpty, retainAll, removeAll]
確實不包含Object中的public類型方法,也證明了上述推斷。
上文是我在網上看到的一種解釋。
疑問:萬物皆對象,JVM中似乎提到接口和object是有關系的。 其實我覺得這個是sun當初在構建Java語法時候的“語法”問題,暫時理解他們兩者之間存在一種“特別”的關系。