JAVA知識基礎(四):深入理解static關鍵字

1、static存在的主要意義

static的主要意義是在于創建獨立于具體對象的域變量或者方法。以致于即使沒有創建對象,也能使用屬性和調用方法!

static關鍵字還有一個比較關鍵的作用就是 用來形成靜態代碼塊以優化程序性能。static塊可以置于類中的任何地方,類中可以有多個static塊。在類初次被加載的時候,會按照static塊的順序來執行每個static塊,并且只會執行一次。

為什么說static塊可以用來優化程序性能,是因為它的特性:只會在類加載的時候執行一次。因此,很多時候會將一些只需要進行一次的初始化操作都放在static代碼塊中進行。

2、static的獨特之處

被static修飾的變量或者方法是獨立于該類的任何對象,也就是說,這些變量和方法不屬于任何一個實例對象,而是被類的實例對象所共享。

在該類被第一次加載的時候,就會去加載被static修飾的部分,而且只在類第一次使用時加載并進行初始化,注意這是第一次用就要初始化,后面根據需要是可以再次賦值的。

static變量值在類加載的時候分配空間,以后創建類對象的時候不會重新分配。賦值的話,是可以任意賦值的!
被static修飾的變量或者方法是優先于對象存在的,也就是說當一個類加載完畢之后,即便沒有創建對象,也可以去訪問。

3、static 關鍵字主要使用場景

static 關鍵字主要有四種使用場景

  • 修飾成員變量和方法
  • 靜態代碼塊
  • 修飾類【只能修飾內部類也就是靜態內部類】
  • 靜態導包

下面是詳細介紹

4、修飾成員變量和成員方法(常用)

被 static 修飾的成員屬于類,不屬于單個這個類的某個對象,被類中所有對象共享,可以并且建議通過類名調用。被static 聲明的成員變量屬于靜態成員變量,靜態變量 存放在 Java 內存區域的方法區。

方法區與 Java 堆一樣,是各個線程共享的內存區域,它用于存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。雖然Java虛擬機規范把方法區描述為堆的一個邏輯部分,但是它卻有一個別名叫做 Non-Heap(非堆),目的應該是與 Java 堆區分開來。

HotSpot 虛擬機中方法區也常被稱為 “永久代”,本質上兩者并不等價。僅僅是因為 HotSpot 虛擬機設計團隊用永久代來實現方法區而已,這樣 HotSpot 虛擬機的垃圾收集器就可以像管理 Java 堆一樣管理這部分內存了。但是這并不是一個好主意,因為這樣更容易遇到內存溢出問題。

調用格式:

類名.靜態變量名
類名.靜態方法名()

如果變量或者方法被 private 則代表該屬性或者該方法只能在類的內部被訪問而不能在類的外部被方法。

5、靜態代碼塊

靜態代碼塊定義在類中方法外, 靜態代碼塊在非靜態代碼塊之前執行(靜態代碼塊—非靜態代碼塊—構造方法)。 該類不管創建多少對象,靜態代碼塊只執行一次.

一個類中的靜態代碼塊可以有多個,位置可以隨便放,它不在任何的方法體內,JVM加載類時會執行這些靜態的代碼塊,如果靜態代碼塊有多個,JVM將按照它們在類中出現的先后順序依次執行它們,每個代碼塊只會被執行一次。
靜態代碼塊對于定義在它之后的靜態變量,可以賦值,但是不能訪問.

靜態代碼塊通常用來對靜態變量進行一些初始化操作,比如定義枚舉類,還有我們熟悉的單例模式同樣也用到了靜態代碼塊

6、靜態內部類

靜態內部類與非靜態內部類之間存在一個最大的區別,我們知道非靜態內部類在編譯完成之后會隱含地保存著一個引用,該引用是指向創建它的外圍內,但是靜態內部類卻沒有。

沒有這個引用就意味著:
它的創建是不需要依賴外圍類的創建。
它不能使用任何外圍類的非static成員變量和方法。

代碼舉例(靜態內部類實現單例模式):

public class Singleton {// 聲明為 private 避免調用默認構造方法創建對象private Singleton() {}// 聲明為 private 表明靜態內部該類只能在該 Singleton 類中被訪問private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}public static Singleton getUniqueInstance() {return SingletonHolder.INSTANCE;}
}

當 Singleton 類加載時,靜態內部類 SingletonHolder 沒有被加載進內存。只有當調用 getUniqueInstance()方法從而觸發 SingletonHolder.INSTANCE 時 SingletonHolder 才會被加載,此時初始化 INSTANCE 實例,并且 JVM 能確保 INSTANCE 只被實例化一次。

這種方式不僅具有延遲初始化的好處,而且由 JVM 提供了對線程安全的支持。

7、靜態導包

靜態導包格式:import static

這兩個關鍵字連用可以指定導入某個類中的指定靜態資源,并且不需要使用類名調用類中靜態成員,可以直接使用類中靜態成員變量和成員方法

靜態導包在書寫代碼的時候確實能省一點代碼,可以直接調用里面的靜態成員,但是會影響代碼可讀性,所以開發中一般情況下不建議這么使用。

8、靜態變量和實例變量

static修飾的成員變量叫做靜態變量【也叫做類變量】,靜態變量是屬于這個類,而不是屬于是對象。沒有被static修飾的成員變量叫做實例變量,實例變量是屬于這個類的實例對象。java規定static是不允許用來修飾局部變量的。

靜態變量和實例變量的區別
靜態變量:靜態變量由于不屬于任何實例對象,屬于類的,所以在內存中只會有一份,在類的加載過程中,JVM只為靜態變量分配一次內存空間。
實例變量:每次創建對象,都會為每個對象分配成員變量內存空間,實例變量是屬于實例對象的,在內存中,創建幾次對象,就有幾份成員變量。

訪問靜態變量和靜態方法的兩種方法:
靜態變量:

類名.靜態變量
對象.靜態變量(不推薦)

靜態方法:

類名.靜態方法
對象.靜態方法(不推薦)

靜態成員變量雖然獨立于對象,但是不代表不可以通過對象去訪問,所有的靜態方法和靜態變量都可以通過對象訪問【只要訪問權限足夠允許就行】。
this也是可以訪問static的變量的!

9、static靜態方法

static修飾的方法也叫做靜態方法,其實我們最熟悉的static靜態方法就是main方法。

由于對于靜態方法來說是不屬于任何實例對象的,this指的是當前對象,因為static靜態方法不屬于任何對象,所以就談不上this了。
還有一點就是:構造方法不是靜態方法!

x.static注意事項:
1、靜態只能訪問靜態。
2、非靜態既可以訪問非靜態的,也可以訪問靜態的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535935.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535935.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535935.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MIP改造常見問題二十問

在MIP推出后,我們收到了很多站長的疑問和顧慮。我們將所有疑問和顧慮歸納為以下二十個問題,希望對大家理解 MIP 有幫助。 1、MIP 化后對其他搜索引擎抓取收錄以及 SEO 的影響如何? 答:在原頁面 MIP 化,不會影響其它搜…

Nginx(零):背景

我們今天開始對Nginx的學習,本來是打算第一篇就是基礎知識介紹的,但是我感覺在學習一個新知識之前總應該知道,我們為什么要學習它,學習它的意義何在吧!所以我加了背景這一篇作為Nginx開始學習的標志。 1、Nginx的誕生…

Nginx(一):概念基礎

上一篇我們介紹了Nginx的背景,現在我們就要開始正式對Nginx的學習了。本篇我們將對Nginx的基本定義進行介紹,了解Nginx到底是什么。然后我們會介紹Nginx最基本的三個概念:反向代理、負載均衡、動靜分離。 1、Nginx是什么 Nginx(“engine x”…

MIP 官方發布 v1穩定版本

近期,MIP 官方發布了 MIP 系列文件的全新 v1 版本,建議開發者盡快完成升級。 一、 我是開發者,如何升級版本? 對于 MIP 頁面開發者來說,* 只需替換線上引用的 MIP 文件為 v1 版本 *,就可以完成升級。所有…

百度MIP頁規范詳解 —— canonical標簽

百度 MIP 的規范要求必須添加強制性標簽 canonical&#xff0c;不然 MIP 校驗工具 會報錯&#xff1a; 強制性標簽 <link rel"/^(canonical)$/"> 缺失或錯誤 這個標簽怎么寫&#xff1f;又是干什么用的呢&#xff1f; ** 簡單來說&#xff0c;canonical 標簽…

Nginx(二):安裝、配置、常用命令

1、Nginx在Linux操作系統中的安裝 這里簡單介紹一下nginx的安裝了 1.1、前期準備 在安裝nginx之前我們要提前準擺好它的編譯工具以及庫文件&#xff1a;zlib、poenssl。 還有有讓Nginx支持Rewrite功能的PCRE. 安裝的途徑有很多可以參考&#xff1a;https://www.runoob.com/lin…

JAVA知識基礎(五):深入理解final關鍵字

1.final 關鍵字 final關鍵字主要用在三個地方&#xff1a;變量、方法、類。 final修飾變量&#xff1a;final修飾一個類時&#xff0c;表明這個類不能被繼承。final修飾方法&#xff1a;final修飾方法&#xff0c;方法不可以重寫&#xff0c;但是可以被子類訪問 【前提&#…

CMS模板應用調研問卷

截止目前&#xff0c;已經有數十家網站與我們合作&#xff0c;進行了MIP化改造&#xff0c;在搜索結果頁也能看到“閃電標”的出現。除了改造方面的問題&#xff0c;MIP項目組被問到最多的就是&#xff1a;我用了wordpress&#xff0c;我用了織夢cms&#xff0c;怎么改MIP呢&am…

Nginx(三):反向代理

我們本篇將通過兩個實例進行對Nginx反向代理的學習。 1、概念基礎 反向代理&#xff0c;其實客戶端對代理是無感知的&#xff0c;因為客戶端不需要任何配置就是可以訪問。我們只需要將請求發送到反向代理服務器上&#xff0c;有反向代理服務器去選擇目標服務器獲取數據后&…

VIP站長大會(北京站)常見問題解答

功能支持問題 1. react 能否和 MIP 結合使用&#xff0c;如果暫時不能以后是否有考慮&#xff1f;是否會和其他 JavaScript 框架 (比如 Angular ) 結合 ? 目前暫無計劃支持。 2. MIP 頁是否支持自定義 cookie? 實現 登錄、統計、廣告等功能 ? <mip-cookie>組件正在…

Nginx(四):負載均衡Load balancing

1、概念基礎 Load balancing&#xff0c;即負載均衡&#xff0c;是一種計算機技術&#xff0c;用來在多個計算機&#xff08;計算機集群&#xff09;、網絡連接、CPU、磁盤驅動器或其他資源中分配負載&#xff0c;以達到最優化資源使用、最大化吞吐率、最小化響應時間、同時避…

JAVA知識基礎(六):抽象

1.概述 抽象類、抽象方法以及接口&#xff0c;這三個知識點是每個程序員必備的基礎&#xff0c;無論是在實際編程的時候&#xff0c;還是在面試的時候&#xff0c;都會出現這類問題&#xff0c;面試官很可能就會問你&#xff0c;interface和abstract的區別 當父類知道子類應該…

MIP開發教程(三) 使用MIP-CLI工具調試組件

一 . 在 mip-extensions 倉庫中創建新的組件二 . 預覽調試組件 三 . 在 MIP 頁中引用自己編寫的 MIP 組件 四 . 組件提交到 GitHub 倉庫時需要進行校驗 站長開發的非通用組件&#xff0c;使用 組件上線平臺 提交&#xff0c;上線后代碼位于 GitHub/mip-extension-platform 倉…

JAVA知識基礎(七):封裝

1.概述 封裝&#xff08;Encapsulation&#xff09;是指一種將抽象性函式接口的實現細節部分包裝、隱藏起來的方法。 封裝可以被認為是一個保護屏障&#xff0c;防止該類的代碼和數據被外部類定義的代碼隨機訪問。 要訪問該類的代碼和數據&#xff0c;必須通過嚴格的接口控制…

MIP開發教程(二) 使用MIP-CLI工具調試MIP網頁

初始化 MIP 配置 新建一個 MIP 網頁 編寫 MIP 網頁代碼 校驗 MIP 網頁 調試 MIP 網頁 1. 初始化 MIP 配置 首先在html目錄下進行初始化 MIP 配置&#xff1a; $ mip init 此時會創建mip.config文件&#xff1a; 2. 新建一個 MIP 網頁 在mip-project/html文件夾下輸入如下…

Nginx(五):動靜分離

1、概念基礎 Nginx動靜分離簡單來說就是把動態請求和靜態請求分開&#xff0c;不能理解成只是單純的把動態頁面靜態頁面的物理分離。嚴格意義上說應該是動態請求跟靜態請求的分開&#xff0c;可以理解成使用Nginx處理靜態頁面&#xff0c;Tomcat處理動態頁面。動靜分離從目前實…

Nginx(六):配置nginx高可用集群

我們知道在我們使用nginx代理多態tomcat服務器時&#xff0c;如果某臺tomcat服務器發生宕機&#xff0c;那么nginx的分配機制可以自動將其剔除。但是如果發生了nginx的宕機狀況&#xff0c;又該如何解決呢。 1、配置高可用的集群 1.1、什么是高可用 高可用HA&#xff08;Hig…

MIP開發教程(一) MIP-CLI工具安裝與環境部署

依賴安裝 安裝 MIP-CLI 創建開發文件結構 1. 依賴安裝 MIP-CLI 使用 NPM 安裝&#xff0c;依賴 node 環境&#xff1a; node 安裝-windowsnode 安裝-mac MIP-CLI 開發組件需要 git&#xff1a; git 安裝-windowsgit 安裝-mac 2. 安裝 MIP-CLI MIP-CLI&#xff1a;mip 開…

JAVA知識基礎(八):繼承

1.概述 1.1、繼承的由來 至于由來簡單一句話&#xff1a;多個類中存在相同屬性和行為時&#xff0c;將這些內容抽取到單獨一個類中&#xff0c;那么多個類無需再定義這些屬性和行為。 繼承描述的是事物之間的所屬關系&#xff0c;這種關系是 is-a 的關系。 1.2、繼承的定義 …

MIP 2016年終總結

MIP 項目組成立至今已經有一年多的時間&#xff0c;在過去的一年里&#xff0c;感謝各位的關注。 1. MIP JS 迭代 MIP JS 運行環境是 MIP 頁面和 MIP 組件運行的基石。在 2016 年 4 月&#xff0c;MIP JS 發布了 mipmain-v0.0.1.js, 隨后經過多次迭代&#xff0c;在 2016 年 …