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


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

java中的方法我們主要分為三種:

1.構造方法
2.非靜態方法(普通方法/實例方法)
3.靜態方法(類方法)

一、靜態方法和非靜態方法的區別(調用對象、引用變量不同)

靜態方法:是使用static關鍵字修飾的方法,又叫類方法.屬於類的,不屬於對象,在實例化對象之前就可以通過類名.方法名調用靜態方法.( 靜態屬性,靜態方法都是屬於類的,可以直接通過類名調用).

A.在靜態方法中,可以調用靜態方法。
B.在靜態方法中,不能調用非靜態方法。
C.在靜態方法中,可以引用類變量(即,static修飾的變量)。
D.在靜態方法中,不能引用成員變量(即,沒有static修飾的變量)。
E.在靜態方法中,不能使用super和this關鍵字

 

非靜態方法:是不含有static關鍵字修飾的普通方法,又稱為實例方法,成員方法。屬於對象的,不屬於類的.( 成員屬性,成員方法是屬於對象的,必須通過new關鍵字創建對象后,再通過對象調用)。

A.在普通方法中,可以調用普通方法。
B.在普通方法中,可以調用靜態方法
C.在普通方法中,可以引用類變量和成員變量
D.在普通方法中,可以使用super和this關鍵字

 

二、靜態方法和非靜態方法的區別(調用方法不同)

靜態方法可以直接調用,類名調用和對象調用. ( 類名.方法名 / 對象名.方法名)但是非靜態方法只能通過對象調用. ( 對象名.方法名)

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

靜態方法的生命周期跟相應的類一樣長,靜態方法和靜態變量會隨着類的定義而被分配和裝載入內存中。一直到線程結束,靜態屬性和方法才會被銷毀。(也就是靜態方法屬於類)

非靜態方法的生命周期和類的實例化對象一樣長,只有當類實例化了一個對象,非靜態方法才會被創建,而當這個對象被銷毀時,非靜態方法也馬上被銷毀。(也就是非靜態方法屬於對象)

總結:

類方法可以直接通過類名調用,實例方法必需先實例化類,再初始化對象,然后通過類的實例對象才能調用。

靜態static變量/方法 在類加載的過程中被初始化,在內存中只存在一份,所以可以把它當作是全局變量/方法。

優點

  1. 屬於類級別的,不需要創建對象就可以直接使用.
  2. 全局唯一,內存中唯一,靜態變量可以唯一標識某些狀態.
  3. 在類加載時候初始化,常駐在內存中,調用快捷方便.

應用場景:

1. 靜態方法最適合工具類中方法的定義;比如文件操作,日期處理方法等.
2. 靜態方法適合入口方法的定義;如單例模式,因為從外部拿不到構造函數,所有定義一個靜態的方法獲取對象非常有必要.
3. 靜態變量適合全局變量的定義.(如布爾型靜態成員變量做控制符)

缺點:

  1. 靜態方法不能調用非靜態的方法和變量.(非靜態方法可以任意的調用靜態方法/變量)
  2. 不能使用this和super關鍵字(屬於類級別,沒有創建對象簽不可用this/super)

 

 1 package com.oop.method;  2 
 3 public class StaticMethodAndCommonMethod {  4     private static int a = 0;  5     int b = 0;  6 
 7     public static void main(String[] args) {  8 
 9  } 10 
11     static void add() { 12         // .在靜態方法中,可以調用靜態變量。
13         a = 1; 14         // .在靜態方法中,可以調用靜態方法。
15  min(); 16         // 下面兩行代碼報錯的原因是:靜態方法和靜態變量在類加載的時候就創建了, 17         // 而非靜態方法方法和非靜態變量只有當類實例化了一個對象,非靜態方法才會被創建,
18         b = 1; 19  ma(); 20  } 21 
22     static void min() { 23  } 24 
25     void max() { 26  } 27 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM