中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中靜態方法和非靜態方法有區別嗎

發布時間:2020-06-29 11:36:01 來源:億速云 閱讀:413 作者:Leah 欄目:編程語言

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中靜態方法和非靜態方法有區別嗎問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿合奇县| 德化县| 江达县| 眉山市| 松桃| 吴忠市| 申扎县| 尚义县| 武清区| 黑水县| 高安市| 女性| 从化市| 宝应县| 兴业县| 平定县| 双柏县| 田东县| 黄石市| 化隆| 石柱| 栾川县| 仁寿县| 潮州市| 辰溪县| 蒙阴县| 宣城市| 余江县| 浦城县| 高邑县| 腾冲县| 平武县| 汶上县| 九龙县| 长沙县| 来安县| 镇宁| 平远县| 策勒县| 绥宁县| 沙河市|