日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java基础篇:static关键字

發布時間:2024/9/30 java 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java基础篇:static关键字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄:

一、靜態類與非靜態類:

二、靜態方法與非靜態方法:

三、靜態變量與非靜態變量的區別:

四、靜態代碼塊與非靜態代碼塊:

五、靜態構造函數與非靜態構造函數:

六、相關問題:


Java中的static關鍵字表示“全局”或者“靜態”的意思,用來修飾成員變量和成員方法,也可以修飾代碼塊。

當JVM加載一個類的時候,如果該類存在static修飾的成員變量和成員方法,就會為這些成員變量和成員方法在固定的位置開辟一個固定大小的內存區域;同時被static修飾的成員變量和成員方法是被該類的所有實例共享的,不依賴于某個特定的實例變量,任何一個實例對其的修改都會導致其他實例的變化。

?

一、靜態類與非靜態類:

1、靜態類:

  • 無法實例化,不能包含實例構造函數,但是可以有靜態構造函數
  • 僅包含靜態變量和靜態方法。

2、非靜態類:

  • 每次實例化都是一個新的對象,并且可以不顯式實例化,因為內部有一個默認的靜態構造函數(不可重載),當創建類實例或引用任何靜態成員之前,靜態構造函數被自動執行,并且只執行一次;
  • 可以包含非靜態成員,也可以包含靜態成員;
  • 可以通過 “類名.方法名 或者 變量名” 訪問靜態成員;

?

二、靜態方法與非靜態方法:

  • 被static修飾的方法就是靜態方法類方法沒有被static修飾的方法就是非靜態方法實例方法
  • 因為靜態方法不屬于類的實例成員,所以靜態方法只能被重載,而不能被重寫,在靜態方法中也不能使用 this 或 super。
  • 靜態方法會在類加載的時候被分配和加載入內存中;非靜態方法屬于對象的具體實例,只有在類對象創建時,在對象的內存中才有這個方法的代碼塊。
  • 靜態方法中不能調用非靜態方法和非靜態變量;非靜態方法可以調用靜態方法,也可以調用非靜態方法。
  • 靜態方法可以由實例對象調用也可以由類名直接調用即“類名.方法名 或者 對象名.方法名”;非靜態方法必須由實例對象來調用即“對象名.方法名”

?

三、靜態變量與非靜態變量的區別:

  • 內存分配時間:靜態變量在應用程序初始化時,即類加載的時候分配內存,直到它所在類的應用程序運行結束時才會消亡;非靜態變量需要被實例化后才會分配內存。
  • 生存周期:靜態變量的生存周期為應用程序的存在周期;非靜態變量的存在周期取決于實例化的類的存在周期。
  • 共享方式:靜態變量是全局變量,他在內存中僅有一個,被類的所有實例對象共享,即一個實例改變了靜態變量的值,其他同類的實例讀取到的就是變化后的值;非靜態變量是局部變量,不共享,每次實例化都是一個新的變量。
  • 調用方式:靜態變量只能通過“類名.變量名”調用;非靜態變量當該變量所在的類被實例化之后,可以通過實例化后的類名直接訪問。
  • 訪問方式:靜態成員不能訪問非靜態成員;非靜態成員可以訪問靜態成員。

?

四、靜態代碼塊與非靜態代碼塊:

  • 執行時機:靜態代碼塊是對類進行初始化,在JVM加載類的時候就會執行,而且只執行一次,如果一個類包含多個靜態代碼塊,那就是按照代碼順序執行。非靜態代碼塊是對類對象的初始化,在每次創建對象的時候它都會執行。
  • 都是在JVM加載類的時候且在構造方法之前執行,在類中都可以定義多個,一般在代碼塊中對一些static變量進行賦值。
  • 靜態代碼塊在非靜態代碼塊之前執行,非靜態代碼塊可以在普通方法中定義(不過作用不大),而靜態代碼塊不行。

?

五、靜態構造函數與非靜態構造函數:

  • 靜態構造函數可以用于靜態類,也可用于非靜態類,靜態構造函數不可以繼承;
  • 靜態構造函數不可被直接調用,當創建類實例或者引用任何靜態成員之前,靜態構造函數被自動執行,并且只執行一次。
  • 靜態構造函數無訪問修飾符、無參數,只有一個static標志。

?

六、相關問題:

1、父類及子類的靜態代碼塊、構造代碼塊、構造函數、靜態成員變量、普通成員變量的執行順序?

(1)執行父類的靜態代碼塊,并初始化父類靜態成員變量;

(2)執行子類的靜態代碼塊,并初始化子類靜態成員變量;

(3)執行父類的構造代碼塊,執行父類的構造函數,并初始化父類普通成員變量;

(4)執行子類的構造代碼塊, 執行子類的構造函數,并初始化子類普通成員變量;

2、構造代碼塊與構造函數的區別是:

構造代碼塊是給所有對象進行統一初始化,而構造函數是給對應的對象初始化,因為構造函數是可以多個的,運行哪個構造函數就會建立什么樣的對象,但無論建立哪個對象,都會先執行相同的構造代碼塊。也就是說,構造代碼塊中定義的是不同對象共性的初始化內容。

3、全局變量,即靜態變量的優缺點:

(1)優點:可以減少變量的個數,減少由于實際參數和形式參數的傳遞帶來的時間消耗。

(2)缺點:①會占用更多的內存空間。全局變量保存在靜態存儲區,程序開始運行時為其分配內存,程序結束時釋放內存。與局部變量的動態分配、動態釋放相比,他的生命周期比較長,因此過多的全局變量會占用較多的內存單元。

②全局變量會破壞函數的封裝性。如果使用了全局變量。那么函數體內的語句就可以繞過函數參數和返回值進行存取,這種情況破壞了函數的獨立性,是函數對全局變量產生依賴性,也會降低函數的可移植性。

③使得函數代碼的可讀性差。由于多個函數都可能使用全局變量,函數執行時全局變量的值可能隨時發生變化,對于程序的查錯和調試都非常不利。

④會使遞歸更加難以正確完成,因為遞歸在程序調用自身時才發生。

⑤在多線程的情況下,需要同步各個線程對于全局對象的讀寫操作。

?

總結

以上是生活随笔為你收集整理的Java基础篇:static关键字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。