91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

千阳县| 商都县| 宝清县| 张家界市| 临安市| 忻州市| 凯里市| 鸡东县| 富民县| 华安县| 大悟县| 花垣县| 中宁县| 台东县| 岳阳县| 吴川市| 郁南县| 宜宾县| 岗巴县| 城口县| 贵港市| 高安市| 禹州市| 南康市| 泰来县| 合作市| 罗甸县| 孟津县| 锡林浩特市| 西盟| 加查县| 武陟县| 永和县| 香格里拉县| 宣恩县| 卓资县| 安福县| 兴海县| 奈曼旗| 会昌县| 松溪县|