5.13動態(tài)成員函數(shù)發(fā)送
當(dāng)你用點操作符調(diào)用一個對象實例的成員函數(shù)時,對象實例所屬的類在編譯時要被檢查,以確保調(diào)用的成員函數(shù)在該類中是存在的。在運行時,對象實例可以指向所聲明類型的子類的實例。在這?copy;情況下,如果子類覆蓋了要調(diào)用的成員函數(shù),Java就用實例來決定調(diào)用哪一個成員函數(shù)。如下面的例子,兩個類是子類和超類的關(guān)系,子類覆蓋了超類的成員函數(shù)。
classA{voidcallme(){System.out.println(\"在A的callme成員函數(shù)里\");}}
classBextendsA{voidcallme(){System.out.println(\"在B的callme成員函數(shù)里\");}}
classDispatch{publicstaticvoidmain(Stringargs[]){Aa=newB();a.callme();}}
有趣的是,在成員函數(shù)main里,我們把變量a聲明為類型A,然后把類B的一個實例存放到它上面。我們在a上調(diào)用成員函數(shù)callme,Java編譯器確定在類A確實有成員函數(shù)callme,但是在運行時,由于a事實上是B的實例,所以調(diào)用B的callme,而不調(diào)用A的。下面是運行結(jié)果:C:\\>javaDispatch在B的callme成員函數(shù)里
5.14final
在缺省情況下,所有的成員函數(shù)和實例變量都可以被覆蓋。如果你希望你的變量或成員函數(shù)不再被子類覆蓋,可以把它們聲明為final。這意味著將來的實例都依賴這個定義。例如:finalintFILE_NEW=1;finalintFILE_OPEN=2;finalintFILE_SAVE=3;fianlintFILE_SAVEAS=4;finalintFILE_QUIT=5;final變量用大寫標識符是一個一般的約定。
5.15靜態(tài)
如果你想要創(chuàng)建一個可以在實例的外部調(diào)用的成員函數(shù),那么你只需聲明它為靜態(tài)的(static?copy;,它就會正常運行。靜態(tài)成員函數(shù)只能直接調(diào)用其他靜態(tài)成員函數(shù),而不能以任何方式使用this或super。你也可以把變量聲明為靜態(tài)的。如果你想初始化一個靜態(tài)變量,你可以用static聲明一個恰好在類調(diào)用時執(zhí)行一次的程序塊。下面的例子是一個帶有一個靜態(tài)成員函數(shù),幾個靜態(tài)變
量,和一個靜態(tài)初始塊的類。
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(\"靜態(tài)初始塊\");b=a*4;}publicstaticvoidmain(Stringargs[]){method(42);}}這個類被調(diào)用,所有的靜態(tài)變量都被初始化,a被賦為3,然后運行static塊,這將打印出一段消息,并且把b賦為a*4,即12。然后解釋器調(diào)用main成員函數(shù),它調(diào)用了成員函數(shù)method,參數(shù)x為42。這三個println語句打印了兩個靜態(tài)變量a、b和局部變量x。下面是運行結(jié)果:C:\\>javaStatic靜態(tài)初始塊x=42a=3b=12一個靜態(tài)成員函數(shù)可以通過它所屬的類名來調(diào)用。象調(diào)用實例變量一樣,你可以用點操作符通過類名來調(diào)用靜態(tài)成員函數(shù)和靜態(tài)變量。Java就是這樣實現(xiàn)了全局函數(shù)和全局變量。下面的例子里,我們創(chuàng)建了帶有一個靜態(tài)成員函數(shù)和兩個靜態(tài)變量的類。第二個類可以通過名字直接來調(diào)用第一個類的靜態(tài)成員函數(shù)和靜態(tài)變量。
classstaticClass{staticinta=42;staticintb=99;staticvoid
callme(){System.out.println(\"a=\"+a);}}
classStaticByName{publicstaticvoidmain(Stringargs[])
{StaticClass.callme();System.out.println(\"b=\"+staticClass.b);}}
下面是運行結(jié)果:C:\\>javastaticByNamea=42b=99
2015年全國職稱計算機考試教材(2007模 .. 定價:¥225 優(yōu)惠價:¥213 更多書籍 | |
全國職稱計算機考試速成過關(guān)系列套裝:W .. 定價:¥133 優(yōu)惠價:¥133.0 更多書籍 |