成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

如何實現(xiàn)Java中的static關(guān)鍵字解析

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)如何實現(xiàn)Java中的static關(guān)鍵字解析,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創(chuàng)新互聯(lián)建站基于分布式IDC數(shù)據(jù)中心構(gòu)建的平臺為眾多戶提供達(dá)州服務(wù)器托管 四川大帶寬租用 成都機(jī)柜租用 成都服務(wù)器租用。

static關(guān)鍵字是很多朋友在編寫代碼和閱讀代碼時碰到的比較難以理解的一個關(guān)鍵字,也是各大公司的面試官喜歡在面試時問到的知識點之一。下面就先講述一下static關(guān)鍵字的用法和平常容易誤解的地方,最后列舉了一些面試筆試中常見的關(guān)于static的考題。

一.static關(guān)鍵字的用途

在《Java編程思想》P86頁有這樣一段話:

“static方法就是沒有this的方法。在static方法內(nèi)部不能調(diào)用非靜態(tài)方法,反過來是可以的。而且可以在沒有創(chuàng)建任何對象的前提下,僅僅通過類本身來調(diào)用static方法。這實際上正是static方法的主要用途。”

這段話雖然只是說明了static方法的特殊之處,但是可以看出static關(guān)鍵字的基本作用,簡而言之,一句話來描述就是:

方便在沒有創(chuàng)建對象的情況下來進(jìn)行調(diào)用(方法/變量)。

很顯然,被static關(guān)鍵字修飾的方法或者變量不需要依賴于對象來進(jìn)行訪問,只要類被加載了,就可以通過類名去進(jìn)行訪問。

static可以用來修飾類的成員方法、類的成員變量,另外可以編寫static代碼塊來優(yōu)化程序性能。

1)static方法

static方法一般稱作靜態(tài)方法,由于靜態(tài)方法不依賴于任何對象就可以進(jìn)行訪問,因此對于靜態(tài)方法來說,是沒有this的,因為它不依附于任何對象,既然都沒有對象,就談不上this了。并且由于這個特性,在靜態(tài)方法中不能訪問類的非靜態(tài)成員變量和非靜態(tài)成員方法,因為非靜態(tài)成員方法/變量都是必須依賴具體的對象才能夠被調(diào)用。

但是要注意的是,雖然在靜態(tài)方法中不能訪問非靜態(tài)成員方法和非靜態(tài)成員變量,但是在非靜態(tài)成員方法中是可以訪問靜態(tài)成員方法/變量的。舉個簡單的例子:

如何實現(xiàn)Java中的static關(guān)鍵字解析

在上面的代碼中,由于print2方法是獨立于對象存在的,可以直接用過類名調(diào)用。假如說可以在靜態(tài)方法中訪問非靜態(tài)方法/變量的話,那么如果在main方法中有下面一條語句:

MyObject.print2();

此時對象都沒有,str2根本就不存在,所以就會產(chǎn)生矛盾了。同樣對于方法也是一樣,由于你無法預(yù)知在print1方法中是否訪問了非靜態(tài)成員變量,所以也禁止在靜態(tài)成員方法中訪問非靜態(tài)成員方法。

而對于非靜態(tài)成員方法,它訪問靜態(tài)成員方法/變量顯然是毫無限制的。

因此,如果說想在不創(chuàng)建對象的情況下調(diào)用某個方法,就可以將這個方法設(shè)置為static。我們最常見的static方法就是main方法,至于為什么main方法必須是static的,現(xiàn)在就很清楚了。因為程序在執(zhí)行main方法的時候沒有創(chuàng)建任何對象,因此只有通過類名來訪問。

另外記住,即使沒有顯示地聲明為static,類的構(gòu)造器實際上也是靜態(tài)方法。

2)static變量

static變量也稱作靜態(tài)變量,靜態(tài)變量和非靜態(tài)變量的區(qū)別是:靜態(tài)變量被所有的對象所共享,在內(nèi)存中只有一個副本,它當(dāng)且僅當(dāng)在類初次加載時會被初始化。而非靜態(tài)變量是對象所擁有的,在創(chuàng)建對象的時候被初始化,存在多個副本,各個對象擁有的副本互不影響。

static成員變量的初始化順序按照定義的順序進(jìn)行初始化。

3)static代碼塊

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

為什么說static塊可以用來優(yōu)化程序性能,是因為它的特性:只會在類加載的時候執(zhí)行一次。下面看個例子:


class Person{

    private Date birthDate;

    private static Date startDate,endDate;

    static{

        startDate = Date.valueOf("1946");

        endDate = Date.valueOf("1964");

    }

     

    public Person(Date birthDate) {

        this.birthDate = birthDate;

    }

     

    boolean isBornBoomer() {

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

    }

}

因此,很多時候會將一些只需要進(jìn)行一次的初始化操作都放在static代碼塊中進(jìn)行。

二.static關(guān)鍵字的誤區(qū)

1.static關(guān)鍵字會改變類中成員的訪問權(quán)限嗎?

有些初學(xué)的朋友會將java中的static與C/C++中的static關(guān)鍵字的功能混淆了。在這里只需要記住一點:與C/C++中的static不同,Java中的static關(guān)鍵字不會影響到變量或者方法的作用域。在Java中能夠影響到訪問權(quán)限的只有private、public、protected(包括包訪問權(quán)限)這幾個關(guān)鍵字??聪旅娴睦泳兔靼琢耍?/p>

如何實現(xiàn)Java中的static關(guān)鍵字解析

提示錯誤"Person.age 不可視",這說明static關(guān)鍵字并不會改變變量和方法的訪問權(quán)限。

2.能通過this訪問靜態(tài)成員變量嗎?

雖然對于靜態(tài)方法來說沒有this,那么在非靜態(tài)方法中能夠通過this訪問靜態(tài)成員變量嗎?先看下面的一個例子,這段代碼輸出的結(jié)果是什么?


public class Test extends Base{

 

    static{

        System.out.println("test static");

    }

     

    public Test(){

        System.out.println("test constructor");

    }

     

    public static void main(String[] args) {

        new Test();

    }

}

 

class Base{

     

    static{

        System.out.println("base static");

    }

     

    public Base(){

        System.out.println("base constructor");

    }

}

如何實現(xiàn)Java中的static關(guān)鍵字解析 View Code

至于為什么是這個結(jié)果,我們先不討論,先來想一下這段代碼具體的執(zhí)行過程,在執(zhí)行開始,先要尋找到main方法,因為main方法是程序的入口,但是在執(zhí)行main方法之前,必須先加載Test類,而在加載Test類的時候發(fā)現(xiàn)Test類繼承自Base類,因此會轉(zhuǎn)去先加載Base類,在加載Base類的時候,發(fā)現(xiàn)有static塊,便執(zhí)行了static塊。在Base類加載完成之后,便繼續(xù)加載Test類,然后發(fā)現(xiàn)Test類中也有static塊,便執(zhí)行static塊。在加載完所需的類之后,便開始執(zhí)行main方法。在main方法中執(zhí)行new Test()的時候會先調(diào)用父類的構(gòu)造器,然后再調(diào)用自身的構(gòu)造器。因此,便出現(xiàn)了上面的輸出結(jié)果。

2.這段代碼的輸出結(jié)果是什么?


public class Test {

     

    static{

        System.out.println("test static 1");

    }

    public static void main(String[] args) {

         

    }

     

    static{

        System.out.println("test static 2");

    }

}

如何實現(xiàn)Java中的static關(guān)鍵字解析 View Code

雖然在main方法中沒有任何語句,但是還是會輸出,原因上面已經(jīng)講述過了。另外,static塊可以出現(xiàn)類中的任何地方(只要不是方法內(nèi)部,記住,任何方法內(nèi)部都不行),并且執(zhí)行是按照static塊的順序執(zhí)行的。

上述就是小編為大家分享的如何實現(xiàn)Java中的static關(guān)鍵字解析了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

文章名稱:如何實現(xiàn)Java中的static關(guān)鍵字解析
文章路徑:http://jinyejixie.com/article46/jjjghg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄網(wǎng)站內(nèi)鏈、網(wǎng)站建設(shè)網(wǎng)站排名、虛擬主機(jī)、小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
望谟县| 信丰县| 成都市| 宁蒗| 天镇县| 阳城县| 南靖县| 营山县| 涞源县| 华蓥市| 万盛区| 定陶县| 绵竹市| 濉溪县| 陇南市| 水富县| 鄂伦春自治旗| 大邑县| 大丰市| 湾仔区| 闽侯县| 三河市| 石门县| 咸阳市| 涞水县| 陈巴尔虎旗| 永年县| 抚松县| 衡山县| 冷水江市| 离岛区| 昭平县| 库尔勒市| 宜兴市| 高邑县| 微博| 太白县| 阳山县| 乐平市| 苏尼特右旗| 馆陶县|