[轉載] Java static關鍵字與static{}語句塊

參考鏈接: Java中的靜態塊static block

目錄直通車?

一、 類的加載特性與時機?

1、 類加載的特性?

2、 類加載的時機?

二、 static的三個常用?

1、 修飾成員變量?

2、 修飾成員方法?

3、 靜態塊(static{})?

?

一、 類的加載特性與時機?

在進入static之前,先補一下關于類的腦。?

1、 類加載的特性?

在JVM的生命周期里,每個類只會被加載一次。?

類加載的原則:延遲加載,能少加載就少加載,因為虛擬機的空間是有限的。?

2、 類加載的時機?

1)第一次創建對象要加載類.?

2)調用靜態方法時要加載類,訪問靜態屬性時會加載類。?

3)加載子類時必定會先加載父類。?

4)創建對象引用不加載類.?

5) 子類調用父類的靜態方法時?

? ? (1)當子類沒有覆蓋父類的靜態方法時,只加載父類,不加載子類?

? ? (2)當子類有覆蓋父類的靜態方法時,既加載父類,又加載子類?

6)訪問靜態常量,如果編譯器可以計算出常量的值,則不會加載類,例如:public static final int a =123;否則會加載類,例如:public static final int a = math.PI。?

二、 static的三個常用?

1、 修飾成員變量?

2、 修飾成員方法?

同C++是一樣的概念。但是在JVM里面,JVM也會劃分一個暫稱靜態存儲區,用于存放方法的定義。實際上從更大的角度而言,它存放的是各種類的定義,當我們通過new來生成對象時,會根據這里定義的類的定義去創建對象。?

下面觀察兩段代碼的輸出結果,加了static和沒有加static的區別:?

public class Person {

? ? String name;

?

? ? int age;

? ??

? ? public String toString() {

? ? ? ? return "Name:" + name + ", Age:" + age;

? ? }

? ??

? ? public static void main(String[] args) {

? ? ? ? Person p1 = new Person();

? ? ? ? p1.name = "zhangsan";

? ? ? ? p1.age = 10;

? ? ? ? Person p2 = new Person();

? ? ? ? p2.name = "lisi";

? ? ? ? p2.age = 12;

? ? ? ? System.out.println(p1);

? ? ? ? System.out.println(p2);

? ? }

?

? ? /**輸出結果

? ? ?* Name:zhangsan, Age:10

? ? ?* Name:lisi, Age:12

? ? ?*/

}?

public class Person {

? ? String name;

? ? // 給age加上static

? ? static int age;

? ? /* 其余代碼不變... */

?

? ? /**輸出結果

? ? ?* Name:zhangsan, Age:12

? ? ?* Name:lisi, Age:12

? ? ?*/

}?

結論:通過運行結果,可以看到 age都為12,只保存了最后一次給age賦的值。這是為什么呢,在內存里面發生了什么??

?

給age屬性加了static關鍵字之后,Person對象就不再擁有age屬性了,age屬性會統一交給Person類去管理,即多個Person對象只會對應一個age屬性,一個對象如果對age屬性做了改變,其他的對象都會受到影響。?

3、 靜態塊(static{})?

(1) static關鍵字還有一個比較關鍵的作用,用來形成靜態代碼塊(static{}(即static塊))以優化程序性能。?

(2) static塊可以置于類中的任何地方,類中可以有多個static塊。?

(3) 在類初次被加載的時候執行且僅會被執行一次(這是優化性能的原因!!!),會按照static塊的順序來執行每個static塊,一般用來初始化靜態變量和調用靜態方法。?

下面通過兩段代碼,說明 static{} 為什么能優化程序性能。?

實例?

/**

?* 每次調用isBornBoomer的時候

?* 都會生成startDate和birthDate兩個對象,造成了空間浪費

?*/

class Person{

? ? private Date birthDate;

? ? ?

? ? public Person(Date birthDate) {

? ? ? ? this.birthDate = birthDate;

? ? }

? ? ?

? ? boolean isBornBoomer() {

? ? ? ? Date startDate = Date.valueOf("1997");

? ? ? ? Date endDate = Date.valueOf("2019");

? ? ? ? return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;

? ? }

}?

??

/**

?* 這里使用了static塊

?* 只需要進行一次的初始化操作

?* 節省內存空間,優化性能

?*/

class Person{

? ? private Date birthDate;

? ? private static Date startDate,endDate;

?

? ? static{

? ? ? ? startDate = Date.valueOf("1997");

? ? ? ? endDate = Date.valueOf("2019");

? ? }

? ? ?

? ? public Person(Date birthDate) {

? ? ? ? this.birthDate = birthDate;

? ? }

? ? ?

? ? boolean isBornBoomer() {

? ? ? ? return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;

? ? }

}?

注意:強調一下static塊是會按照順序執行,與main入口函數無關。?

static還有一個不常用的用途,叫做 static靜態導包 。有興趣的朋友可以去了解一下。

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

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

相關文章

Perl文件讀寫操作

本文轉自 tiger506 51CTO博客&#xff0c;原文鏈接&#xff1a;http://blog.51cto.com/tiger506/830771&#xff0c;如需轉載請自行聯系原作者

[轉載] Java 語言中的實例初始化塊 ( IIB) 詳解

參考鏈接&#xff1a; Java中的實例初始化塊(IIB) 在 Java 語言中的類初始化塊 文章中我們簡單的介紹了下 Java 中的實例初始化塊 ( IIB )。不過我覺得介紹的有點簡單了&#xff0c;于是&#xff0c;再寫一篇文章詳細介紹下吧。 Java 語言中&#xff0c;存在三種操作&#x…

不用正則表達式,用javascript從零寫一個模板引擎(一)

前言 模板引擎的作用就是將模板渲染成html&#xff0c;html render(template,data)&#xff0c;常見的js模板引擎有Pug,Nunjucks,Mustache等。網上一些制作模板引擎的文章大部分是用正則表達式做一些hack工作&#xff0c;看完能收獲的東西很少。本文將使用編譯原理那套理論來打…

[轉載] Java靜態綁定與動態綁定

參考鏈接&#xff1a; Java中的靜態綁定與動態綁定 程序綁定的概念&#xff1a; 綁定指的是一個方法的調用與方法所在的類(方法主體)關聯起來。對java來說&#xff0c;綁定分為靜態綁定和動態綁定&#xff1b;或者叫做前期綁定和后期綁定. 靜態綁定&#xff1a; 在程序執行前方…

關于批量插入數據之我見(100萬級別的數據,mysql)

2019獨角獸企業重金招聘Python工程師標準>>> 因前段時間去面試&#xff0c;問到如何高效向數據庫插入10萬條記錄&#xff0c;之前沒處理過類似問題&#xff0c;也沒看過相關資料&#xff0c;結果沒答上來&#xff0c;今天就查了些資料&#xff0c;總結出三種方法&am…

各個OS關于查看磁盤和wwn號的方法

1,HP-UX幾個命令1&#xff09;查看型號&#xff0c;和uname -a差不多model2&#xff09;查看光纖卡信息ioscan -funC fc3) 查看掃描出的磁盤信息ioscan -fucC disk4&#xff09;查看磁盤及其對應的路徑ioscan -m dsf5) 查看劃分過來的lunioscan -m lun6) 查看磁盤大小diskinfo …

[轉載] Java是不是面向對象的程序

參考鏈接&#xff1a; 為什么Java不是純粹的面向對象語言 轉載自&#xff1a;https://blog.csdn.net/a21700790yan/article/details/80129053 Java——是否確實的 “純面向對象”&#xff1f;讓我們深入到Java的世界&#xff0c;試圖來證實它。 在我剛開始學習 Java 的前面幾…

極速理解設計模式系列:6.適配器模式(Adapter Pattern)

四個角色&#xff1a;目標抽象類角色(Target)、目標對象角色(Adapter)、源對象角色(Adaptee)、客戶端角色(Client) 目標抽象類角色&#xff08;Target)&#xff1a;定義需要實現的目標接口 目標對象角色&#xff08;Adapter)&#xff1a;調用另外一個源對象&#xff0c;并且轉換…

[轉載] Java之繼承

參考鏈接&#xff1a; Java多重繼承 Java之繼承 繼承是面向對象程序的一個基本特征&#xff0c;通過繼承可以實現父子關系&#xff0c;以及代碼的復用。通過繼承實現的類稱為子類&#xff0c;被繼承的類稱為父類&#xff0c;所有直接或間接被繼承的類都稱為父類。 Java類體…

Spark(二): 內存管理

2019獨角獸企業重金招聘Python工程師標準>>> Spark 作為一個以擅長內存計算為優勢的計算引擎&#xff0c;內存管理方案是其非常重要的模塊&#xff1b; Spark的內存可以大體歸為兩類&#xff1a;execution和storage&#xff0c;前者包括shuffles、joins、sorts和agg…

[轉載] 手把手教你整合最優雅SSM框架:SpringMVC + Spring + MyBatis

參考鏈接&#xff1a; Java繼承類的對象創建 本文發表于2016年6月&#xff0c;寫于作者學生時期。文中使用到的技術和框架可能不是當下最佳實踐&#xff0c;甚至很不“優雅”。但對于剛接觸JavaEE和Spring的同學來說&#xff0c;還是能有很多收獲的&#xff0c;大牛輕拍 我們…

多播、組播、廣播優缺點分析

2019獨角獸企業重金招聘Python工程師標準>>> 單播、多播和廣播單播”&#xff08;Unicast&#xff09;、“多播”&#xff08;Multicast&#xff09;和“廣播”&#xff08;Broadcast&#xff09;這三個術語都是用來描述網絡節點之間通訊方式的術語。那么這些術語究…

[轉載] Java重載、覆蓋與構造函數

參考鏈接&#xff1a; Java中的繼承和構造函數 /** * 拷貝構造函數---Copyf t2 new Copyf(t1);就不會在調用默認構造函數了。 * 復制clone和引用 * 重載是在同一個類&#xff08;范圍&#xff09;中&#xff0c;覆蓋是子類對父類而言。 重載不關心返回值類型。 靜態方法不能被…

LOFTERD18B542F16FF685FD684F427B4…

2019獨角獸企業重金招聘Python工程師標準>>> 驗證 轉載于:https://my.oschina.net/jinhengyu/blog/1572124

[轉載] Java獲取一個類繼承的父類或者實現的接口的泛型參數

參考鏈接&#xff1a; Java中的接口和繼承 泛型的作用就不多介紹了&#xff0c;如果你想具備架構設計能力&#xff0c;那么熟練使用泛型是必不可少的。 不多說了&#xff0c;先定義泛型父類和泛型接口&#xff1a; package cn.zhh; public class Parent<T1, T2> { …

PHP系列(一)PHP流程控制結構

while(){} do{ }while(); for( 表達式1; 表達式2;表達式3 ){ 語句或語句序列; } if(){} if(){ }elseif{} <?php $i0; while(true) { if($i>100) break; echo ".$i.<br>"; $i; } ?> <?php echo "<table border1800>"; echo &quo…

[轉載] Scala繼承與Java的區別

參考鏈接&#xff1a; Java中將final與繼承一起使用 在之前的筆記Java靜態屬性和方法的繼承問題中&#xff0c;通過具體的實驗證明&#xff0c;在子類中重寫父類的字段時并沒有覆蓋父類的字段&#xff0c;只是隱藏了父類的字段。而在scala中則不同&#xff0c;scala子類的同名…

Source Map調試壓縮后代碼

在前端開發過程中&#xff0c;無論是樣式還是腳本&#xff0c;運行時的文件可能是壓縮后的&#xff0c;那這個時候調試起來就很麻煩。 這個時候&#xff0c;可以使用Source Map文件來優化調試&#xff0c;Source Map是一個信息文件&#xff0c;里面儲存著原代碼位置信息&#x…

[轉載] Python3十大經典錯誤及解決辦法

參考鏈接&#xff1a; Python中的關鍵字2 ◆ ◆ ◆ ◆ ◆ 接觸了很多Python愛好者&#xff0c;有初學者&#xff0c;亦有轉行人。不論大家學習Python的目的是什么&#xff0c;總之&#xff0c;學習Python前期寫出來的代碼不報錯就是極好的。下面&#xff0c;嚴小樣兒為大家羅…

兩臺電腦間大量數據拷貝的快捷方法

可能大家會遇到需要將一臺電腦里的數據拷貝到另外一臺電腦&#xff0c;最常用的方法是用u盤或移動硬盤等存儲設備來拷貝&#xff0c;這樣速度慢&#xff0c;而且可能拷貝多次才能將數據拷貝完。現提供一種方法&#xff0c;就是通過windows 的文件共享來實現。通過千兆網線直接連…