大家都知道C++有個多態繼承(multi-inheritance)的問題,或曰菱形問題。而Java引入Interface後徹底擺脫了多態繼承的困擾。
可在下是在才疏學淺,對一些核心問題不甚了了,而一些專業書籍在一些關鍵問題上往往閃爍其辭,所以我懷疑那些偽專家們對此也是一知半解,因而顧左右而言他。
我最不明白的一點是:為什麽多態繼承問題隻出現在method上,而variable沒有這種問題?有人可能會說method有override功能,而variable沒有。可我要告訴你:經過鄙人的細心研究,發現無論是在C++還是在Java裏,真正的override並不存在。也就是說,所以來自parent class的變量和函數全部都要無條件地在child class裏繼承。而所謂的override隻不過是child class又提供了一個同名同參數同返回值的函數而已,但我可以告訴你這兩個同名同參數同返回值的函數是並存的,且完全獨立的。
這裏我再順便糾正一個錯誤概念:許多人認為private的變量和函數是不被繼承的。此大謬也!實際上,private的變量不僅能被原封不動地繼承,而且還將傳之於子孫萬代!其實,所有的variables和methods都將被原封不動地繼承並被傳給子孫萬代。因為這才是OOP下父子class之間真實的general與special的關係。隻不過,對於私有的method和variable而言,它們在child class裏看不到也訪問不到,徹底“隱身”了,可是它們卻仍然真實地存在著。
下麵我寫了一段Java代碼可以明白無誤地證實這一點。我們可以看到,在class private_0下定義的私有變量a和私有函數mnopqrst()在經過了四代繼承之後,仍然存在於class private_run裏,否則繼承下來的公有函數mmnnn()就不可能訪問到它們。
好了,言歸正傳,既然一個child class可以繼承所有parent class乃至一切祖先類中的所有變量和函數,那麽為什麽會有不知道給繼承哪個parent class的method的困惑呢?我想絕對不會是所謂命名衝突的問題,因為這非常還解決:隻要在每個變量前製定它原生的class,那麽所以同名但不同源的變量便可區分開來。
問題絕沒有那麽簡單?望眾位高手能指點迷津,不吝賜教!不勝感激敬佩之至!臨表涕零,不知所雲!
=============================================================================================
import java.io.*;
import java.lang.*;
import java.lang.reflect.*;
class private_0
{
private int a = 5;
private void mnopqrst()
{
System.out.println( "a = " + a );
}
public void mmnnn()
{
mnopqrst();
}
}
class private_1 extends private_0
{
}
class private_2 extends private_1
{
private void mnopqrst()
{
}
}
public class private_run extends private_2
{
public static void main( String argv[] )
{
private_run private_one = new private_run();
private_one.mmnnn();
Class myClass = private_one.getClass();
Field [] fields = myClass.getFields();
for( int k = 0; k < fields.length; k++ )
System.out.println( "fields[" + k + "] = " + fields[k] );
}
}
==============================================================================================