2014-09-06 38 views
0

如果cChildClass對象,那麼爲什麼它不能調用ChildClass的方法? 喜歡:子類的對象不能調用它自己的方法

ParentClass c=new ChildClass(); //Here ChildClass extends ParentClass 

特別是:

Object s=new StringBuffer(); 

這裏sStringBuffer對象,但s.append(null)是編譯時間錯誤。爲什麼這樣?

+1

因爲你**的參考變量的類型**是'ParentClass',父類對其子女的功能毫無頭緒。 – 2014-09-06 03:59:27

回答

1

c被宣佈爲ParentClass。因此,所有編譯器都知道它是一個ParentClass它的一些的子類。假設其他一些語句重新分配c地方:

c = new SomeOtherChildClass(); 

這是合法的,因爲SomeOtherChildClass也是ParentClass一個子類,你告訴編譯器c可以是任何ParentClass。現在,如果編譯器看到

c.methodOfChildClass(); 

怎麼會知道cChildClass,而不是一個SomeOtherChildClass不具有該方法?

P.S.如果你確定c真是ChildClass,在某些時候,你可以得到它的向下轉換調用ChildClass方法:

((ChildClass)c).methodOfChildClass(); 

演員會導致編譯器看到cChildClass;在運行時,程序會檢查以確保c確實是ChildClass否則程序將拋出ClassCastException

1

,因爲編譯器不知道參考s將要提到的StringBuffer在運行時Java一個實例是statically typed language

+0

什麼是靜態類型語言? – 2014-09-06 03:59:22

+0

http://en.wikipedia.org/wiki/Type_system#Static_and_dynamic_type_checking_in_practice – 2014-09-06 03:59:56

0

你需要轉換使用的實例

Object s = new StringBuffer(); 
StringBuffer s2 = (StringBuffer) s; 
s2.append(null); 

的方法儘管是StringBuffer的實例對象,它仍然是Object類型和對象沒有方法追加

2

這是編譯器的工作以確保您不會調用任何與您所調用的變量不匹配的方法。爲了幫助編譯器,我們給所有變量一個「類型」。類型可能是像「int」這樣的基本類型,或者是一個類,一個枚舉或一個接口。如果它是一個類,一個接口或一個枚舉;那麼該類,接口或枚舉中列出的方法是編譯器允許您在該變量上使用的方法。

變量的「類型」不一定與變量引用的對象的「類」相同。在你的例子中,類型是Object,但是類是StringBuffer。但類型,而不是類,編譯器用來檢查你的方法調用是否正確;因爲不能期望編譯器知道你可能使用變量引用的每個對象的類。

如果語言不這樣工作,那麼根本就沒有類型的變量。這就是Javascript的工作方式 - 所有內容都被聲明爲var,並且沒有真正的類型系統。當我們說Java是「靜態類型」時,我們的意思是我們必須給變量類型,這樣做有助於編譯器保護我們免於濫用我們的變量。

0

你有你的對象轉換爲StringBuffer的類型,或者您必須聲明這樣的StringBuffer S =新的StringBuffer對象s(),那麼你可以調用這個類的所有方法

相關問題