精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Java中對(duì)static關(guān)鍵詞的介紹

科技綠洲 ? 來(lái)源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-11 15:26 ? 次閱讀

staticJava的一個(gè)關(guān)鍵字,可以用來(lái)修飾成員變量、修飾成員方法、構(gòu)造靜態(tài)代碼塊、實(shí)現(xiàn)靜態(tài)導(dǎo)包以及實(shí)現(xiàn)靜態(tài)內(nèi)部類,下面我們來(lái)分別介紹。

1、修飾成員變量

用 static 修飾成員變量可以說(shuō)是該關(guān)鍵字最常用的一個(gè)功能,通常將用 static 修飾的成員變量稱為類成員或者靜態(tài)成員,那么靜態(tài)成員和不用 static 修飾的非靜態(tài)成員有什么區(qū)別呢?

我們先看看不用 static 修飾的成員變量在內(nèi)存中的構(gòu)造。

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方法省略
}

首先,我們創(chuàng)建一個(gè)實(shí)體類 Person,有兩個(gè)屬性 name 和 age,都是普通成員變量(沒(méi)有用 static 關(guān)鍵字修飾),接著我們通過(guò)其構(gòu)造方法創(chuàng)建兩個(gè)對(duì)象:

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}

這兩個(gè)對(duì)象在內(nèi)存中的存儲(chǔ)結(jié)構(gòu)如下:

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

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

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方法省略

}

同樣我們還是向上面一樣,創(chuàng)建 p1 和 p2 兩個(gè)對(duì)象,并打印這兩個(gè)對(duì)象,看看和上面打印的有啥區(qū)別呢?

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}

我們發(fā)現(xiàn)第三行代碼打印的 p1 對(duì)象 age 屬性變?yōu)?20了,這是為什么呢?

圖片
這是因?yàn)橛迷?jvm 的內(nèi)存構(gòu)造中,會(huì)在堆中開(kāi)辟一塊內(nèi)存空間,專門用來(lái)存儲(chǔ)用 static 修飾的成員變量,稱為靜態(tài)存儲(chǔ)區(qū),無(wú)論我們創(chuàng)建多少個(gè)對(duì)象,用 static 修飾的成員變量有且只有一份存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū)中,所以該靜態(tài)變量的值是以最后創(chuàng)建對(duì)象時(shí)設(shè)置該靜態(tài)變量的值為準(zhǔn),也就是由于 p1 先設(shè)置 age = 21,后來(lái)創(chuàng)建了 p2 對(duì)象,p2將 age 改為了20,那么該靜態(tài)存儲(chǔ)區(qū)的 age 屬性值也被修改成了20。

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

總結(jié):static 修飾的變量被所有對(duì)象所共享,在內(nèi)存中只有一個(gè)副本。由于與對(duì)象無(wú)關(guān),所以我們可以直接通過(guò) 類名.靜態(tài)變量 的方式來(lái)直接調(diào)用靜態(tài)變量。對(duì)應(yīng)的非靜態(tài)變量是對(duì)象所擁有的,多少個(gè)對(duì)象就有多少個(gè)非靜態(tài)變量,各個(gè)對(duì)象所擁有的副本不受影響。

2、修飾修飾成員方法

用 static 關(guān)鍵字修飾成員方法也是一樣的道理,我們可以直接通過(guò) 類名.靜態(tài)方法名() 的方式來(lái)調(diào)用,而不用創(chuàng)建對(duì)象。

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方法省略

}

調(diào)用靜態(tài)方法:

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

3、靜態(tài)代碼塊

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

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

由于靜態(tài)代碼塊只在類載入內(nèi)存時(shí)加載一次的特性,我們可以利用靜態(tài)代碼塊來(lái)優(yōu)化程序性能,比如某個(gè)比較大配置文件需要在創(chuàng)建對(duì)象時(shí)加載,這時(shí)候?yàn)榱斯?jié)省內(nèi)存,我們可以將該配置文件的加載時(shí)機(jī)放入到靜態(tài)代碼塊中,那么我們無(wú)論創(chuàng)建多少個(gè)對(duì)象時(shí),該配置文件也只加載了一次。

4、靜態(tài)導(dǎo)包

用 static 來(lái)修飾成員變量,成員方法,以及靜態(tài)代碼塊是最常用的三個(gè)功能,靜態(tài)導(dǎo)包是 JDK1.5以后的新特性,用 import static 包名 來(lái)代替?zhèn)鹘y(tǒng)的 import 包名 方式。那么有什么用呢?

比如我們創(chuàng)建一個(gè)數(shù)組,然后用 JDK 自帶的 Arrays 工具類的 sort 方法來(lái)對(duì)數(shù)組進(jìn)行排序:

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);
    }
}

我們可以看到,調(diào)用 sort 方法時(shí),需要進(jìn)行 import java.util.Arrays 的導(dǎo)包操作,那么變?yōu)殪o態(tài)導(dǎo)包呢?

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 變?yōu)榱?import static java.util.Arrays.*,意思是導(dǎo)入 Arrays 類中的所有靜態(tài)方法,當(dāng)然你也可以將 * 變?yōu)槟硞€(gè)方法名,也就是只導(dǎo)入該方法,那么我們?cè)谡{(diào)用該方法時(shí),就可以不帶上類名,直接通過(guò)方法名來(lái)調(diào)用(第 11 行代碼)。

靜態(tài)導(dǎo)包只會(huì)減少程序員的代碼編寫(xiě)量,對(duì)于性能是沒(méi)有任何提升的(也不會(huì)降低性能,Java核心技術(shù)第10版卷1第148頁(yè)4.7.1章節(jié)類的導(dǎo)入有介紹),反而會(huì)降低代碼的可讀性,所以實(shí)際如何使用需要權(quán)衡。

5、靜態(tài)內(nèi)部類

首先我們要知道什么是內(nèi)部類,定義在一個(gè)類的內(nèi)部的類叫內(nèi)部類,包含內(nèi)部類的類叫外部類,內(nèi)部類用 static 修飾便是我們所說(shuō)的靜態(tài)內(nèi)部類。

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

訪問(wèn)普通內(nèi)部類,我們需要先創(chuàng)建外部類的對(duì)象,然后通過(guò)外部類名.new 創(chuàng)建內(nèi)部類的實(shí)例。

package com.ys.bean;

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

    public class InnerClass{

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

訪問(wèn)靜態(tài)內(nèi)部類,我們不需要?jiǎng)?chuàng)建外部類的對(duì)象,可以直接通過(guò) 外部類名.內(nèi)部類名 來(lái)創(chuàng)建實(shí)例。

package com.ys.bean;

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

    public static class InnerClass{

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

6、常見(jiàn)問(wèn)題

①、靜態(tài)變量能存在于普通方法中嗎?

能。很明顯,普通方法必須通過(guò)對(duì)象來(lái)調(diào)用,靜態(tài)變量都可以直接通過(guò)類名來(lái)調(diào)用了,更不用說(shuō)通過(guò)對(duì)象來(lái)調(diào)用,所以是可以存在于普通方法中的。

②、靜態(tài)方法能存在普通變量嗎?

不能。因?yàn)殪o態(tài)方法可以直接通過(guò)類名來(lái)直接調(diào)用,不用創(chuàng)建對(duì)象,而普通變量是必須通過(guò)對(duì)象來(lái)調(diào)用的。那么將普通變量放在靜態(tài)方法中,在直接通過(guò)類來(lái)調(diào)用靜態(tài)方法時(shí)就會(huì)報(bào)錯(cuò)。所以不能。

③、靜態(tài)代碼塊能放在方法體中嗎?

不能。首先我們要明確靜態(tài)代碼塊是在類加載的時(shí)候自動(dòng)運(yùn)行的。

普通方法需要我們創(chuàng)建對(duì)象,然后手工去調(diào)用方法,所靜態(tài)代碼塊不能聲明在普通方法中。

那么對(duì)于用 static 修飾的靜態(tài)方法呢?同樣也是不能的。因?yàn)殪o態(tài)方法同樣也需要我們手工通過(guò)類名來(lái)調(diào)用,而不是直接在類加載的時(shí)候就運(yùn)行了。

也就是說(shuō)靜態(tài)代碼塊能夠自動(dòng)執(zhí)行,而不管是普通方法還是靜態(tài)方法都是需要手工執(zhí)行的。

④、靜態(tài)導(dǎo)包會(huì)比普通導(dǎo)包消耗更多的性能?

不會(huì)。靜態(tài)導(dǎo)包實(shí)際上在編譯期間都會(huì)被編譯器進(jìn)行處理,將其轉(zhuǎn)換成普通按需導(dǎo)包的形式,所以在程序運(yùn)行期間是不影響性能的。

⑤、static 可以用來(lái)修飾局部變量嗎?

不能。不管是在普通方法還是在靜態(tài)方法中,static 關(guān)鍵字都不能用來(lái)修飾局部變量,這是Java的規(guī)定。稍微想想也能明白,局部變量的聲明周期是隨著方法的結(jié)束而結(jié)束的,因?yàn)閟tatic 修飾的變量是全局的,不與對(duì)象有關(guān)的,如果用 static 修飾局部變量容易造成理解上的沖突,所以Java規(guī)定 static 關(guān)鍵字不能用來(lái)修飾局部變量。

7、小結(jié)

好了,這就是Java中對(duì) static 關(guān)鍵詞的介紹,這下大家都清楚了吧,面向?qū)ο蟮穆┚W(wǎng)之魚(yú)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(chǔ)
    +關(guān)注

    關(guān)注

    13

    文章

    4122

    瀏覽量

    85271
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2943

    瀏覽量

    104085
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4670

    瀏覽量

    67760
  • static
    +關(guān)注

    關(guān)注

    0

    文章

    33

    瀏覽量

    10320
  • JDK
    JDK
    +關(guān)注

    關(guān)注

    0

    文章

    80

    瀏覽量

    16548
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    [討論]提高網(wǎng)站關(guān)鍵詞排名的28個(gè)SEO小技巧

    ) 內(nèi)容自然出現(xiàn)關(guān)鍵詞 內(nèi)容第一段和最后一段出現(xiàn)關(guān)鍵詞 H1,H2標(biāo)簽中出現(xiàn)關(guān)鍵詞 導(dǎo)出鏈接錨文本包含
    發(fā)表于 12-01 17:08

    TF-IDF測(cè)量文章的關(guān)鍵詞相關(guān)性研究

    停用詞的移除、大小寫(xiě)字母轉(zhuǎn)化和詞干提取。4)獲取查詢。獲取單詞權(quán)重,對(duì)于可疑文檔利用TF-IDF獲得關(guān)鍵詞,并排序得到相應(yīng)的關(guān)鍵詞列表。排在前n個(gè)的關(guān)鍵詞組成一個(gè)查詢,以此類推,本試驗(yàn)
    發(fā)表于 01-26 10:38

    亞馬遜代運(yùn)營(yíng) amazon Search term 關(guān)鍵詞填寫(xiě)的“神技”

    關(guān)鍵詞稍作調(diào)整,以及篩選出的關(guān)鍵詞在搜索結(jié)果的排名做出決定,是否應(yīng)該放在 search term ;3.放一些與自己產(chǎn)品相關(guān)的長(zhǎng)尾進(jìn)
    發(fā)表于 06-05 15:41

    HanLP關(guān)鍵詞提取算法分析詳解

    l 參考論文:《TextRank: Bringing Order into Texts》l TextRank算法提取關(guān)鍵詞Java實(shí)現(xiàn)l TextRank算法自動(dòng)摘要的Java實(shí)現(xiàn)這篇文章
    發(fā)表于 11-05 10:41

    關(guān)鍵詞優(yōu)化有哪些實(shí)用的方法

    的排名。還有一些實(shí)用的方法就是網(wǎng)站的一個(gè)關(guān)鍵詞布局,這里應(yīng)該設(shè)計(jì)seo算法的頁(yè)面相關(guān)匹配程度,這樣來(lái)提升網(wǎng)站頁(yè)面的整體相關(guān)性,其次是重要的位置部署好我們要做的關(guān)鍵詞,比如重要的一些標(biāo)簽來(lái)添加我們做
    發(fā)表于 08-11 01:19

    百度關(guān)鍵詞排名掉完了怎么辦

    一夜之間關(guān)鍵詞排名掉完了,沒(méi)有被K,也沒(méi)有出現(xiàn)違規(guī)操作,這是怎么回事呢?
    發(fā)表于 01-27 11:01

    #2023,你的 FPGA 年度關(guān)鍵詞是什么? #

    FPGA 年度關(guān)鍵詞,我的想法是“標(biāo)準(zhǔn)化”;今年的工作遇到了不少同事的issues,本身都是小問(wèn)題或者很細(xì)節(jié)的東西但是卻反復(fù)出現(xiàn)問(wèn)題,目前想到的最好的辦法是做好設(shè)計(jì)規(guī)則的標(biāo)準(zhǔn)化才能避免,不知道大家有沒(méi)有更好的建議?
    發(fā)表于 12-06 20:31

    2009年國(guó)照明行業(yè)十大關(guān)鍵詞

    2009年國(guó)照明行業(yè)十大關(guān)鍵詞   一、節(jié)能推廣   關(guān)鍵詞:節(jié)能推廣   事
    發(fā)表于 12-15 10:24 ?604次閱讀

    javastatic關(guān)鍵字的作用

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

    基于強(qiáng)度熵解決中文關(guān)鍵詞識(shí)別

    文本的關(guān)鍵詞識(shí)別是文本挖掘的基本問(wèn)題之一。在研究現(xiàn)有基于復(fù)雜網(wǎng)絡(luò)的關(guān)鍵詞識(shí)別方法的基礎(chǔ)上,從整個(gè)復(fù)雜網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)特征的信息缺失角度來(lái)考察各節(jié)點(diǎn)的重要程度。提出強(qiáng)度熵測(cè)度來(lái)量化評(píng)估各節(jié)點(diǎn)重要程度,用于解決中文
    發(fā)表于 11-24 09:54 ?7次下載
    基于強(qiáng)度熵解決中文<b class='flag-5'>關(guān)鍵詞</b>識(shí)別

    基于關(guān)鍵詞的最優(yōu)路徑查詢算法

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

    基于自動(dòng)關(guān)鍵詞抽取方法

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

    融合BERT向量與TextRank的關(guān)鍵詞抽取方法

    Textrank轉(zhuǎn)移概率矩陣計(jì)算過(guò)程,同時(shí)通過(guò)迭代運(yùn)算對(duì)文檔的詞語(yǔ)進(jìn)行綜合影響力得分排序,最終提取得分最高的TopN個(gè)詞語(yǔ)作為關(guān)鍵詞。實(shí)驗(yàn)結(jié)果表明,當(dāng)選取Top3、Top5、Top7和Topl0個(gè)關(guān)鍵詞時(shí),與基于
    發(fā)表于 03-21 09:55 ?18次下載
    融合BERT<b class='flag-5'>詞</b>向量與TextRank的<b class='flag-5'>關(guān)鍵詞</b>抽取方法

    JAVAstatic、final、static final如何區(qū)分

    當(dāng)我們?cè)谑褂?b class='flag-5'>java寫(xiě)類的屬性時(shí)總會(huì)用到很多的類型去修飾它,比如字符串String,整數(shù)型int,但是我們偶爾也會(huì)遇到 static、final、static final,那么他們的區(qū)別是什么呢?
    的頭像 發(fā)表于 02-14 14:55 ?1116次閱讀
    <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如何區(qū)分

    Java對(duì) final 關(guān)鍵詞介紹

    1、修飾變量 稍微有點(diǎn)Java基礎(chǔ)的都知道用final關(guān)鍵字修飾的變量稱為常量,常量的意思是不可更改。變量為基本數(shù)據(jù)類型,不可更改很容易理解,那么對(duì)于引用類型呢?不可能改的是其引用地址,還是對(duì)象
    的頭像 發(fā)表于 10-10 17:07 ?340次閱讀
    <b class='flag-5'>Java</b><b class='flag-5'>中</b>對(duì) final <b class='flag-5'>關(guān)鍵詞</b>的<b class='flag-5'>介紹</b>