色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Java中對static關鍵詞的介紹

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-10-11 15:26 ? 次閱讀

staticJava的一個關鍵字,可以用來修飾成員變量、修飾成員方法、構造靜態代碼塊、實現靜態導包以及實現靜態內部類,下面我們來分別介紹。

1、修飾成員變量

用 static 修飾成員變量可以說是該關鍵字最常用的一個功能,通常將用 static 修飾的成員變量稱為類成員或者靜態成員,那么靜態成員和不用 static 修飾的非靜態成員有什么區別呢?

我們先看看不用 static 修飾的成員變量在內存中的構造。

package com.ys.bean;

/**
 * Create by YSOcean
 */
public class Person {
    private String name;
    private Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }
    //get和set方法省略
}

首先,我們創建一個實體類 Person,有兩個屬性 name 和 age,都是普通成員變量(沒有用 static 關鍵字修飾),接著我們通過其構造方法創建兩個對象:

Person p1 = new Person("Tom",21);
Person p2 = new Person("Marry",20);
System.out.println(p1.toString());//Person{name='Tom', age=21}
System.out.println(p2.toString());//Person{name='Marry', age=20}

這兩個對象在內存中的存儲結構如下:

圖片
由上圖可知,我們創建的兩個對象 p1 和 p2 存儲在堆中,但是其引用地址是存放在棧中的,而且這兩個對象的兩個變量互相獨立,我們修改任何一個對象的屬性值,是不改變另外一個對象的屬性值的。

下面我們將 Person 類中的 age 屬性改為由 static 關鍵字修飾:

package com.ys.bean;

/**
 * Create by YSOcean
 */
public class Person {
    private  String name;
    private static Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }
    //get和set方法省略

}

同樣我們還是向上面一樣,創建 p1 和 p2 兩個對象,并打印這兩個對象,看看和上面打印的有啥區別呢?

Person p1 = new Person("Tom",21);
Person p2 = new Person("Marry",20);
System.out.println(p1.toString());//Person{name='Tom', age=20}
System.out.println(p2.toString());//Person{name='Marry', age=20}

我們發現第三行代碼打印的 p1 對象 age 屬性變為 20了,這是為什么呢?

圖片
這是因為用在 jvm 的內存構造中,會在堆中開辟一塊內存空間,專門用來存儲用 static 修飾的成員變量,稱為靜態存儲區,無論我們創建多少個對象,用 static 修飾的成員變量有且只有一份存儲在靜態存儲區中,所以該靜態變量的值是以最后創建對象時設置該靜態變量的值為準,也就是由于 p1 先設置 age = 21,后來創建了 p2 對象,p2將 age 改為了20,那么該靜態存儲區的 age 屬性值也被修改成了20。

PS:在 JDK1.8 以前,靜態存儲區是存放在方法區的,而方法區不屬于堆,在 JDK1.8 之后,才將方法區干掉了,方法區中的靜態存儲區改為到堆中存儲。

總結:static 修飾的變量被所有對象所共享,在內存中只有一個副本。由于與對象無關,所以我們可以直接通過 類名.靜態變量 的方式來直接調用靜態變量。對應的非靜態變量是對象所擁有的,多少個對象就有多少個非靜態變量,各個對象所擁有的副本不受影響。

2、修飾修飾成員方法

用 static 關鍵字修飾成員方法也是一樣的道理,我們可以直接通過 類名.靜態方法名() 的方式來調用,而不用創建對象。

public class Person {
    private  String name;
    private static Integer age;

    public static void printClassName(){
        System.out.println("com.ys.bean.Person");
    }
    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }
    //get和set方法省略

}

調用靜態方法:

Person.printClassName();//com.ys.bean.Person

3、靜態代碼塊

用 static 修飾的代碼塊稱為靜態代碼塊,靜態代碼塊可以置于類的任意一個地方(和成員變量成員方法同等地位,不可放入方法中),并且一個類可以有多個靜態代碼塊,在類初次載入內存時加載靜態代碼塊,并且按照聲明靜態代碼塊的順序來加載,且僅加載一次,優先于各種代碼塊以及構造函數。

public class CodeBlock {
    static{
        System.out.println("靜態代碼塊");
    }
}

由于靜態代碼塊只在類載入內存時加載一次的特性,我們可以利用靜態代碼塊來優化程序性能,比如某個比較大配置文件需要在創建對象時加載,這時候為了節省內存,我們可以將該配置文件的加載時機放入到靜態代碼塊中,那么我們無論創建多少個對象時,該配置文件也只加載了一次。

4、靜態導包

用 static 來修飾成員變量,成員方法,以及靜態代碼塊是最常用的三個功能,靜態導包是 JDK1.5以后的新特性,用 import static 包名 來代替傳統的 import 包名 方式。那么有什么用呢?

比如我們創建一個數組,然后用 JDK 自帶的 Arrays 工具類的 sort 方法來對數組進行排序:

package com.ys.test;

import java.util.Arrays;
/**
 * Create by YSOcean
 */
public class StaticTest {

    public static void main(String[] args) {
        int[] arrays = {3,4,2,8,1,9};
        Arrays.sort(arrays);
    }
}

我們可以看到,調用 sort 方法時,需要進行 import java.util.Arrays 的導包操作,那么變為靜態導包呢?

package com.ys.test;

import static java.util.Arrays.*;
/**
 * Create by YSOcean
 */
public class StaticTest {

    public static void main(String[] args) {
        int[] arrays = {3,4,2,8,1,9};
        sort(arrays);
    }
}

我們可以看到第三行代碼的 import java.util.Arrays 變為了 import static java.util.Arrays.*,意思是導入 Arrays 類中的所有靜態方法,當然你也可以將 * 變為某個方法名,也就是只導入該方法,那么我們在調用該方法時,就可以不帶上類名,直接通過方法名來調用(第 11 行代碼)。

靜態導包只會減少程序員的代碼編寫量,對于性能是沒有任何提升的(也不會降低性能,Java核心技術第10版卷1第148頁4.7.1章節類的導入有介紹),反而會降低代碼的可讀性,所以實際如何使用需要權衡。

5、靜態內部類

首先我們要知道什么是內部類,定義在一個類的內部的類叫內部類,包含內部類的類叫外部類,內部類用 static 修飾便是我們所說的靜態內部類。

定義內部類的好處是外部類可以訪問內部類的所有方法和屬性,包括私有方法和私有屬性。

訪問普通內部類,我們需要先創建外部類的對象,然后通過外部類名.new 創建內部類的實例。

package com.ys.bean;

/**
 * Create by hadoop
 */
public class OutClass {

    public class InnerClass{

    }
}
* OuterClass oc = new OuterClass();
  * OuterClass.InnerClass in = oc.new InnerClass();

訪問靜態內部類,我們不需要創建外部類的對象,可以直接通過 外部類名.內部類名 來創建實例。

package com.ys.bean;

/**
 * Create by hadoop
 */
public class OutClass {

    public static class InnerClass{

    }
}
OuterClass.StaticInnerClass sic = new OuterClass.StaticInnerClass();

6、常見問題

①、靜態變量能存在于普通方法中嗎?

能。很明顯,普通方法必須通過對象來調用,靜態變量都可以直接通過類名來調用了,更不用說通過對象來調用,所以是可以存在于普通方法中的。

②、靜態方法能存在普通變量嗎?

不能。因為靜態方法可以直接通過類名來直接調用,不用創建對象,而普通變量是必須通過對象來調用的。那么將普通變量放在靜態方法中,在直接通過類來調用靜態方法時就會報錯。所以不能。

③、靜態代碼塊能放在方法體中嗎?

不能。首先我們要明確靜態代碼塊是在類加載的時候自動運行的。

普通方法需要我們創建對象,然后手工去調用方法,所靜態代碼塊不能聲明在普通方法中。

那么對于用 static 修飾的靜態方法呢?同樣也是不能的。因為靜態方法同樣也需要我們手工通過類名來調用,而不是直接在類加載的時候就運行了。

也就是說靜態代碼塊能夠自動執行,而不管是普通方法還是靜態方法都是需要手工執行的。

④、靜態導包會比普通導包消耗更多的性能?

不會。靜態導包實際上在編譯期間都會被編譯器進行處理,將其轉換成普通按需導包的形式,所以在程序運行期間是不影響性能的。

⑤、static 可以用來修飾局部變量嗎?

不能。不管是在普通方法還是在靜態方法中,static 關鍵字都不能用來修飾局部變量,這是Java的規定。稍微想想也能明白,局部變量的聲明周期是隨著方法的結束而結束的,因為static 修飾的變量是全局的,不與對象有關的,如果用 static 修飾局部變量容易造成理解上的沖突,所以Java規定 static 關鍵字不能用來修飾局部變量。

7、小結

好了,這就是Java中對 static 關鍵詞的介紹,這下大家都清楚了吧,面向對象的漏網之魚。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲
    +關注

    關注

    13

    文章

    4296

    瀏覽量

    85800
  • JAVA
    +關注

    關注

    19

    文章

    2966

    瀏覽量

    104702
  • 代碼
    +關注

    關注

    30

    文章

    4779

    瀏覽量

    68525
  • static
    +關注

    關注

    0

    文章

    33

    瀏覽量

    10366
  • JDK
    JDK
    +關注

    關注

    0

    文章

    81

    瀏覽量

    16592
收藏 人收藏

    評論

    相關推薦

    [討論]提高網站關鍵詞排名的28個SEO小技巧

    ) 內容自然出現關鍵詞 內容第一段和最后一段出現關鍵詞 H1,H2標簽中出現關鍵詞 導出鏈接錨文本包含
    發表于 12-01 17:08

    TF-IDF測量文章的關鍵詞相關性研究

    停用詞的移除、大小寫字母轉化和詞干提取。4)獲取查詢。獲取單詞權重,對于可疑文檔利用TF-IDF獲得關鍵詞,并排序得到相應的關鍵詞列表。排在前n個的關鍵詞組成一個查詢,以此類推,本試驗
    發表于 01-26 10:38

    亞馬遜代運營 amazon Search term 關鍵詞填寫的“神技”

    關鍵詞稍作調整,以及篩選出的關鍵詞在搜索結果的排名做出決定,是否應該放在 search term ;3.放一些與自己產品相關的長尾
    發表于 06-05 15:41

    HanLP關鍵詞提取算法分析詳解

    l 參考論文:《TextRank: Bringing Order into Texts》l TextRank算法提取關鍵詞Java實現l TextRank算法自動摘要的Java實現這篇文章
    發表于 11-05 10:41

    關鍵詞優化有哪些實用的方法

    的排名。還有一些實用的方法就是網站的一個關鍵詞布局,這里應該設計seo算法的頁面相關匹配程度,這樣來提升網站頁面的整體相關性,其次是重要的位置部署好我們要做的關鍵詞,比如重要的一些標簽來添加我們做
    發表于 08-11 01:19

    百度關鍵詞排名掉完了怎么辦

    一夜之間關鍵詞排名掉完了,沒有被K,也沒有出現違規操作,這是怎么回事呢?
    發表于 01-27 11:01

    #2023,你的 FPGA 年度關鍵詞是什么? #

    FPGA 年度關鍵詞,我的想法是“標準化”;今年的工作遇到了不少同事的issues,本身都是小問題或者很細節的東西但是卻反復出現問題,目前想到的最好的辦法是做好設計規則的標準化才能避免,不知道大家有沒有更好的建議?
    發表于 12-06 20:31

    2009年國照明行業十大關鍵詞

    2009年國照明行業十大關鍵詞   一、節能推廣   關鍵詞:節能推廣   事
    發表于 12-15 10:24 ?630次閱讀

    javastatic關鍵字的作用

    列舉了一些面試筆試中常見的關于static的考題。 以下是本文的目錄大綱: 一.static關鍵字的用途 二.static關鍵字的誤區 三。
    發表于 09-27 17:12 ?0次下載

    基于強度熵解決中文關鍵詞識別

    文本的關鍵詞識別是文本挖掘的基本問題之一。在研究現有基于復雜網絡的關鍵詞識別方法的基礎上,從整個復雜網絡拓撲結構特征的信息缺失角度來考察各節點的重要程度。提出強度熵測度來量化評估各節點重要程度,用于解決中文
    發表于 11-24 09:54 ?7次下載
    基于強度熵解決中文<b class='flag-5'>關鍵詞</b>識別

    基于關鍵詞的最優路徑查詢算法

    為改進基于關鍵詞的最優路徑查詢算法,在大規模圖以及多查詢關鍵詞下復雜度過高與可擴展性不足的缺陷,依據查詢關鍵詞序列構建候選路徑的策略提出一種高效查詢算法。該算法在路徑構建過程優先滿足
    發表于 12-06 11:28 ?0次下載

    基于自動關鍵詞抽取方法

    自動關鍵詞抽取是從文本或文本集合自動抽取主題性或重要性的或短語,是文本檢索、文本摘要等許多文本挖掘任務的基礎性和必要性的工作.探討了關鍵詞和自動
    發表于 12-26 16:47 ?2次下載
    基于自動<b class='flag-5'>關鍵詞</b>抽取方法

    融合BERT向量與TextRank的關鍵詞抽取方法

    Textrank轉移概率矩陣計算過程,同時通過迭代運算對文檔的詞語進行綜合影響力得分排序,最終提取得分最高的TopN個詞語作為關鍵詞。實驗結果表明,當選取Top3、Top5、Top7和Topl0個關鍵詞時,與基于
    發表于 03-21 09:55 ?18次下載
    融合BERT<b class='flag-5'>詞</b>向量與TextRank的<b class='flag-5'>關鍵詞</b>抽取方法

    JAVAstatic、final、static final如何區分

    當我們在使用java寫類的屬性時總會用到很多的類型去修飾它,比如字符串String,整數型int,但是我們偶爾也會遇到 static、final、static final,那么他們的區別是什么呢?
    的頭像 發表于 02-14 14:55 ?1190次閱讀
    <b class='flag-5'>JAVA</b><b class='flag-5'>中</b><b class='flag-5'>static</b>、final、<b class='flag-5'>static</b> final如何區分

    Java對 final 關鍵詞介紹

    1、修飾變量 稍微有點Java基礎的都知道用final關鍵字修飾的變量稱為常量,常量的意思是不可更改。變量為基本數據類型,不可更改很容易理解,那么對于引用類型呢?不可能改的是其引用地址,還是對象
    的頭像 發表于 10-10 17:07 ?411次閱讀
    <b class='flag-5'>Java</b><b class='flag-5'>中</b>對 final <b class='flag-5'>關鍵詞</b>的<b class='flag-5'>介紹</b>
    主站蜘蛛池模板: 古月娜下面好紧好爽| 一起碰一起噜一起草视频| 亚洲人成无码久久久AAA片| 中国二级毛片| 丰满人妻熟女色情A片| 久久vs国产| 日韩精品AV一区二区三区| 亚洲三级黄色片| 成 人 网 站免费观看| 黄色xxxxxx| 日韩做A爰片久久毛片A片毛茸茸| 亚洲视频中文| 大学生一级毛片免费看| 久久久久嫩草影院精品| 天上人间影院久久国产| 国产精品人妻午夜福利| 扒开屁股眼往里面夹东西| china野外18:19| 99视频免费看| 凹凸精品视频分类视频| www伊人网| 北条麻妃夫の友人196| bdsm中国精品调教ch| 99久久久无码国产精品不卡按摩| 97蜜桃网123.com| xxxxx俄罗斯| 国产成人cao在线| 国产精品免费一区二区三区视频 | 久久国产av偷拍在线| 国内精品久久久久影院老司| 国产一区二区内射最近更新| 久久99国产综合精品AV蜜桃| 国产人妻午夜无码AV天堂 | 韩国伦理片2018在线播放免费观看| 中文字幕国产视频| 99热婷婷国产精品综合| 国产人妻麻豆蜜桃色69| 日本三级黄色大片| 99re2.久久热最新地址| 成年人视频在线免费观看| 大香网伊人久久综合网2020|