類體中的方法分為類方法和實例方法。
類方法
用static修飾的方法。
由於類方法是屬於整個類的,並不屬於類的哪兒個對象,所以類方法的方法體中不能有與類的對象有關的內容。即類方法體有如下限制:
1.類方法中不能引用對象變量;
2.類方法中不能調用類的對象方法;
3.在類方法中不能調使用super,this關鍵字;
4.類方法不能被覆蓋。
實例方法
當一個類創建了一個對象后,這個對象就可以調用該類的方法(對象方法)。
1.實例方法中可以引用對象變量,也可以引用類變量;
2.實例方法中可以調用類方法;
3.對象方法中可以使用super,this關鍵字。
區別
當類的字節碼文件被加載到內存時,類的實例方法不會被分配入口地址,當該類創建對象后,類中的實例方法才分配入口地址,從而實例方法可以被類創建的任何對象調用執行。需要注意的是,當我們創建第一個對象時,類中的實例方法就分配了入口地址,當再創建對象時,不再分配入口地址,也就是說,方法的入口地址被所有的對象共享,當所有的對象都不存在時,方法的入口地址才被取消。
對於類中的類方法,在該類被加載到內存時,就分配了相應的入口地址。從而類方法不僅可以被類創建的任何對象調用執行,也可以直接通過類名調用。類方法的入口地址直到程序退出時才被取消。
類方法在類的字節碼加載到內存時就分配了入口地址。因此,Java語言允許通過類名直接調用類方法,而實例方法不能通過類名調用。在Java語言中,類中的類方法不可以操作實例變量,也不可以調用實例方法,這是因為在類創建對象之前,實例成員變量還沒有分配內存,而且實例方法也沒有入口地址。
class A {int x,y; static float f(int a){} float g(int x1,int x2){} } class B {public static void main(String args[]) {A a1=new A(); A.f(2,3);//合法。 a1.f(2,4);//合法。 a1.g(2,5);//合法。 A.g(3,2);//非法。 } }