1. 程式人生 > 其它 >java_靜態方法和非靜態方法的區別

java_靜態方法和非靜態方法的區別

參照:https://zhuanlan.zhihu.com/p/258751142

靜態方法static(類方法)和 非靜態方法(例項方法)的區別:

方法我們主要分為三種:
1.構造方法
2.非靜態方法(普通方法/例項方法)
3.靜態方法(類方法)

一、靜態方法和非靜態方法的區別(呼叫物件、引用變數不同)
靜態方法:是使用static關鍵字修飾的方法,又叫類方法.屬於類的,不屬於物件, 在例項化物件之前就可以通過類名.方法名呼叫靜態方法。 (靜態屬性,靜態方法都是屬於類的,可以直接通過類名呼叫)。
A.在靜態方法中,可以呼叫靜態方法。
B.在靜態方法中,不能呼叫非靜態方法。
C.在靜態方法中,可以引用類變數(即,static修飾的變數)。
D.在靜態方法中,不能引用成員變數(即,沒有static修飾的變數)。
E.在靜態方法中,不能使用super和this關鍵字

非靜態方法:是不含有static關鍵字修飾的普通方法,又稱為例項方法,成員方法。屬於物件的,不屬於類的。(成員屬性,成員方法是屬於物件的,必須通過new關鍵字建立物件後,再通過物件呼叫)。
A.在普通方法中,可以呼叫普通方法。
B.在普通方法中,可以呼叫靜態方法
C.在普通方法中,可以引用類變數和成員變數
D.在普通方法中,可以使用super和this關鍵字

二、靜態方法和非靜態方法的區別(呼叫方法不同)


靜態方法可以直接呼叫,類名呼叫和物件呼叫。(類名.方法名 / 物件名.方法名)
但是非靜態方法只能通過物件呼叫。(物件名.方法名)

三、靜態方法和非靜態方法的區別(生命週期不同)


靜態方法的生命週期跟相應的類一樣長,靜態方法和靜態變數會隨著類的定義而被分配和裝載入記憶體中。一直到執行緒結束,靜態屬性和方法才會被銷燬。(也就是靜態方法屬於類)
非靜態方法的生命週期和類的例項化物件一樣長,只有當類例項化了一個物件,非靜態方法才會被建立,而當這個物件被銷燬時,非靜態方法也馬上被銷燬。(也就是非靜態方法屬於物件)

總結:類方法可以直接通過類名呼叫,例項方法必需先例項化類,再初始化物件,然後通過類的例項物件才能呼叫

舉例:

class XYZ{

public static void main(String[] str){
      XYZ.testStatic();         //直接通過類呼叫

      XYZ a = new XYZ();        //例項化,然後構造方法會初始化
      a.testMethod();           //物件呼叫方法
}

public static void testStatic(){
	 System.out.println("This is static method");
 }

public void testMethod(){
 	 System.out.println("This is instance method");
 }

}

靜態static變數/方法 在類載入的過程中被初始化,在記憶體中只存在一份,所以可以把它當作是全域性變數/方法。

優點

  1. 屬於類級別的,不需要建立物件就可以直接使用.
  2. 全域性唯一,記憶體中唯一,靜態變數可以唯一標識某些狀態.
  3. 在類載入時候初始化,常駐在記憶體中,呼叫快捷方便.

應用場景:
1. 靜態方法最適合工具類中方法的定義;比如檔案操作,日期處理方法等.
2. 靜態方法適合入口方法的定義;如單例模式,因為從外部拿不到建構函式,所有定義一個靜態的方法獲取物件非常有必要.
3. 靜態變數適合全域性變數的定義.(如布林型靜態成員變數做控制符)

缺點

    1. 靜態方法不能呼叫非靜態的方法和變數.(非靜態方法可以任意的呼叫靜態方法/變數)
    2. 不能使用this和super關鍵字(屬於類級別,沒有建立物件籤不可用this/super)