首頁  >  文章  >  Java  >  java靜態方法和非靜態方法的差別

java靜態方法和非靜態方法的差別

angryTom
angryTom原創
2019-11-12 10:24:385786瀏覽

java靜態方法和非靜態方法的差別

java靜態方法與非靜態方法的差異

1、靜態方法(static method)

與靜態成員變數一樣,屬於類別本身,在類別裝載的時候被裝載到記憶體中,不自動進行銷毀,會一直存在記憶體中,直到JVM關閉;

2、非靜態方法(non-static method)

又稱實例化方法,屬於實例對象,實例化之後才會分配內存,必須透過類別的實例來引用,當實例物件被JVM回收之後,也跟著消失

靜態方法與實例方法的差異

 1.生命週期

靜​​態方法的生命週期從行程建立時就開始,一直到行程結束,所以說靜態方法是全域的,貫穿整個行程

實例方法的生命週期,從實例化物件開始,一直到實例化物件被註銷回收之後結束

所以實例方法的生命週期是短於靜態方法的生命週期,這也是實例方法中不能呼叫靜態方法的原因

 2 .呼叫方式

在外部呼叫靜態方法時,可以使用  「類別名稱.方法名稱」的方式,也可以使用「物件.方法名稱」的方式,也就是說呼叫靜態方法時無需建立物件

實例方法只能使用「物件.方法名稱的方式」

//-----------hasStaticMethod.java-----------------
public class hasStaticMethod{
//定义一个静态方法
public static void callMe(){
  System.out.println("This is a static method.");
}
}

下面這個程式使用兩種形式來呼叫靜態方法。

//-----------invokeStaticMethod.java-----------------
public class invokeStaticMethod{
  public static void main(String args[]){
  hasStaticMethod.callMe(); //不创建对象,直接调用静态方法 
  hasStaticMethod oa = new hasStaticMethod();  //创建一个对象
  oa.callMe();   //利用对象来调用静态方法
}
}

3.存取限制

靜態方法在存取本類別的成員時,只允許存取靜態成員(即靜態變數和靜態方法),而不允許存取實例成員變數和實例方法;而實例方法則無此限制

實例成員變數是屬於某個物件的,在靜態方法執行時,並不一定存在該物件;同理,如果允許靜態方法存取實例成員方法,就間接的可以存取實例成員變量,所以也不能存取實例成員方法;基於同樣的道理,靜態方法中也不能使用關鍵字this

//-----------accessMember.java-----------------
class accessMember{
private static int sa; //定义一个静态成员变量
private int ia; //定义一个实例成员变量
//下面定义一个静态方法
static void statMethod(){
  int i = 0;  //正确,可以有自己的局部变量sa = 10;  
  //正确,静态方法可以使用静态变量
  otherStat(); 
  //正确,可以调用静态方法
  ia = 20;  //错误,不能使用实例变量
  insMethod(); //错误,不能调用实例方法
}
static void otherStat(){} 
//下面定义一个实例方法 
void insMethod(){
  int i = 0;  //正确,可以有自己的局部变量
  sa = 15;  //正确,可以使用静态变量
  ia = 30;  //正确,可以使用实例变量
  statMethod();  //正确,可以调用静态方法
}
}

#4.執行順序

當一個class檔案被ClassLoader load進入JVM之後,方法指令儲存在Stack中,此時Heap區並沒有資料。然後程式技術器開始執行指令,如果是靜態方法,直接依序執行指令碼,當然此時指令碼是不能存取Heapshuju資料區的;如果是實例方法(實例方法有一個隱含的傳入參數,該參數是JVM給它的,這個參數就是實例物件在Stack中的記憶體位址,因此實例方法才可以找到在Heap中屬於自己的資料),則在呼叫前必須實例化該對象,在Heap中分配數據,並將Stack中的記憶體指標透過JVM的隱含參數傳給實例方法。若不實例化直接調用,由於隱含參數沒有值,會報錯。

以上是java靜態方法和非靜態方法的差別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn