關燈 巨大 直達底部
親,雙擊螢幕即可自動滾動
第6部分

du2=newUniversityWorld(”清華大學”;”北?copy;”;”

中國”);System。out。println(”u1=”+u1。name+”;”+u1。city+”;”+

u1。country);System。out。println(”u2=”+u2。name+”;”+u2。city+”;

”+u2。country);System。out。println(”city=”+city+”;country=”+

country);System。out。println(”u1。samecity(u2)=”+u1。samecity(u2));

System。out。println(”u1。samecity(city;country)=”+u1。samecity(city;

country));}}

下面是輸出結果。

C:》javaUniversityWorldCityu1=北?copy;大學;北?copy;;中國u2=清華大學;北?copy;;中國city=上海;country=中國u1。samecity(u2)=trueu1。samecity(city;country)=false

5。13動態成員函式傳送

當你用點運算子呼叫一個物件例項的成員函式時,物件例項所屬的類在編譯時要被檢查,以確保呼叫的成員函式在該類中是存在的。在執行時,物件例項可以指向所宣告型別的子類的例項。在這?copy;情況下,如果子類覆蓋了要呼叫的成員函式,Java就用例項來決定呼叫哪一個成員函式。如下面的例子,兩個類是子類和超類的關係,子類覆蓋了超類的成員函式。

classA{voidcallme(){System。out。println(”在A的callme成員函式里”);}}

classBextendsA{voidcallme(){System。out。println(”在B的callme成員函式里”);}}

classDispatch{publicstaticvoidmain(Stringargs''){Aa=newB();a。callme();}}

有趣的是,在成員函式main裡,我們把變數a宣告為型別A,然後把類B的一個例項存放到它上面。我們在a上呼叫成員函式callme,Java編譯器確定在類A確實有成員函式callme,但是在執行時,由於a事實上是B的例項,所以呼叫B的callme,而不呼叫A的。下面是執行結果:C:》javaDispatch在B的callme成員函式里

5。14final

在預設情況下,所有的成員函式和例項變數都可以被覆蓋。如果你希望你的變數或成員函式不再被子類覆蓋,可以把它們宣告為final。這意味著將來的例項都依賴這個定義。例如:finalintFILE_NEW=1;finalintFILE_OPEN=2;finalintFILE_SAVE=3;fianlintFILE_SAVEAS=4;finalintFILE_QUIT=5;final變數用大寫識別符號是一個一般的約定。

5。15靜態

如果你想要建立一個可以在例項的外部呼叫的成員函式,那麼你只需宣告它為靜態的(static?copy;,它就會正常執行。靜態成員函式只能直接呼叫其他靜態成員函式,而不能以任何方式使用this或super。你也可以把變數宣告為靜態的。如果你想初始化一個靜態變數,你可以用static宣告一個恰好在類呼叫時執行一次的程式塊。下面的例子是一個帶有一個靜態成員函式,幾個靜態變

量,和一個靜態初始塊的類。

classStatic{staticinta=3;staticintb;staticvoidmethod(intx){System。out。println(”x=”+x);System。out。println(”a=”+a);System。out。println(”b=”+b);}static{System。out。println(”靜態初始塊”);b=a*4;}pub