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