欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解java中的static關(guān)鍵字

 更新時(shí)間:2020年06月19日 10:13:42   作者:楊冠標(biāo)  
這篇文章主要介紹了java中的static關(guān)鍵字的的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

Java中的static關(guān)鍵字可以用于修飾變量、方法、代碼塊和類(lèi),還可以與import關(guān)鍵字聯(lián)合使用,使用的方式不同賦予了static關(guān)鍵字不同的作用,且在開(kāi)發(fā)中使用廣泛,這里做一下深入了解。

靜態(tài)資源(靜態(tài)變量與靜態(tài)方法)

被static關(guān)鍵字修飾的變量和方法統(tǒng)一屬于類(lèi)的靜態(tài)資源,是類(lèi)實(shí)例之間共享的。被static關(guān)鍵字修飾的變量、方法屬于類(lèi)變量、類(lèi)方法,可以通過(guò)【類(lèi)名.變量名】、【類(lèi)名.方法名】直接引用,而不需要派生一個(gè)類(lèi)實(shí)例出來(lái)。

靜態(tài)資源分類(lèi)存放的好處

JDK把不同的靜態(tài)資源放在了不同的類(lèi)中而不是把所有的靜態(tài)資源放在一個(gè)類(lèi)里面,這樣做主要有3點(diǎn)好處:

1.不同的類(lèi)有自己的靜態(tài)資源,就可以實(shí)現(xiàn)靜態(tài)資源分類(lèi)。比如,和數(shù)學(xué)相關(guān)的靜態(tài)資源就放在了java.lang.Math中,和日歷相關(guān)的靜態(tài)資源就放在java.util.Calendar中,將組織形式固定為【類(lèi)>靜態(tài)資源】,使得代碼的邏輯結(jié)構(gòu)變得清晰。

2.因?yàn)殪o態(tài)資源的組織形式固定為了【類(lèi)>靜態(tài)資源】的形式,也就有效避免的靜態(tài)資源在全局重名的問(wèn)題。比如在A類(lèi)中有一個(gè)name屬性,B類(lèi)中也有一個(gè)name屬性,如果放在一起會(huì)重復(fù),但是分類(lèi)放開(kāi)則不會(huì)重復(fù)了,因?yàn)閷?shí)際上這兩個(gè)屬性的全名是A.name和B.name。

3.分類(lèi)有助于避免因?yàn)殪o態(tài)資源都放在一個(gè)類(lèi)中導(dǎo)致該類(lèi)體積過(guò)大的問(wèn)題,方便了管理與協(xié)同維護(hù)。

靜態(tài)資源容易混淆的三個(gè)點(diǎn)

靜態(tài)資源的知識(shí)點(diǎn)比較簡(jiǎn)單,但是還是有三點(diǎn)比較容易混淆:靜態(tài)方法能不能引用非靜態(tài)資源?靜態(tài)方法能不能引用靜態(tài)資源?非靜態(tài)方法能不能引用靜態(tài)資源?要弄明白這三個(gè)問(wèn)題,就要先了解靜態(tài)資源在JVM中的加載機(jī)制。

實(shí)際上,雖然說(shuō)靜態(tài)資源是屬于類(lèi)的,但在JVM中卻是獨(dú)立于類(lèi)的存在。因?yàn)閺腏VM類(lèi)加載機(jī)制的角度來(lái)講,靜態(tài)資源是類(lèi)初始化的時(shí)候加載的,而非靜態(tài)資源則是派生類(lèi)的時(shí)候才加載的。類(lèi)的初始化早于類(lèi)的派生(new)。比如,在Class.forName("xxx")方法中,就是初始化了一個(gè)類(lèi),但是并不是派生出一個(gè)實(shí)例,而只是加載了這個(gè)類(lèi)中的靜態(tài)資源。因此對(duì)于一個(gè)靜態(tài)資源來(lái)說(shuō),它是不可能知道一個(gè)類(lèi)中有哪些非靜態(tài)資源的。但是對(duì)于非靜態(tài)資源來(lái)說(shuō)就不一樣了,由于它是派生實(shí)例之后才產(chǎn)生的,因此屬于類(lèi)的這些東西它都能識(shí)別得到。至此,上面三個(gè)問(wèn)題的答案已經(jīng)呼之欲出了:

1.靜態(tài)方法能不能引用非靜態(tài)資源?答案是不能,非靜態(tài)資源是派生實(shí)例之后才產(chǎn)生的,對(duì)于在初始化階段就存在的靜態(tài)資源來(lái)說(shuō),根本識(shí)別不到。

2.靜態(tài)方法能不能引用靜態(tài)資源?答案是可以,因?yàn)殪o態(tài)資源都是在類(lèi)初始化的時(shí)候一同加載的,自然都能互相識(shí)別得到。

3.非靜態(tài)方法能不能引用靜態(tài)資源?答案是可以,因?yàn)榉庆o態(tài)方法就是實(shí)例方法,在派生類(lèi)實(shí)例之后產(chǎn)生,而靜態(tài)資源已經(jīng)在類(lèi)初始化的時(shí)候已經(jīng)存在了,自然能在引用靜態(tài)資源的時(shí)候成功識(shí)別。

靜態(tài)塊

靜態(tài)塊也是static關(guān)鍵字的重要應(yīng)用之一,作用是初始化一個(gè)類(lèi)的時(shí)候做特定的操作。和靜態(tài)變量、靜態(tài)方法同樣,靜態(tài)塊里面的代碼只會(huì)執(zhí)行一次,且只在初始化類(lèi)的時(shí)候執(zhí)行。靜態(tài)塊同樣很簡(jiǎn)單,只有三個(gè)小細(xì)節(jié)要特別提及:

靜態(tài)資源的加載順序是嚴(yán)格按照靜態(tài)資源的定義順序來(lái)加載的。

public class A
{
  private static int a = B();
   
  static
  {
    System.out.println("進(jìn)入A類(lèi)的靜態(tài)塊");
  }
   
  public static void main(String[] args)
  {
    new A();
  }
   
  public static int B()
  {
    System.out.println("進(jìn)入A類(lèi)靜態(tài)變量a.B()靜態(tài)方法中");
    return 1;
  }
}

在這里,因?yàn)殪o態(tài)變量a的定義順序在靜態(tài)塊之前,因此在a先被初始化的時(shí)候靜態(tài)方法B先于靜態(tài)塊被調(diào)用執(zhí)行,打印的結(jié)果是:

進(jìn)入A類(lèi)靜態(tài)變量a.B()靜態(tài)方法中
進(jìn)入A類(lèi)的靜態(tài)塊

靜態(tài)代碼塊對(duì)于定義在它之后的靜態(tài)變量,可以賦值,但是不能訪問(wèn)。

public class A
{
  static
  {
    c = 3;
    System.out.println(c);
  }
  
  private static int c;
}

上面這段代碼會(huì)在第6行報(bào)錯(cuò):Cannot reference a field before it is defined。這個(gè)特性理解起來(lái)可能比較奇怪,個(gè)人的理解是給靜態(tài)方法賦值并不是實(shí)時(shí)的,Java遇到賦值語(yǔ)句的時(shí)候會(huì)先將這些個(gè)賦值語(yǔ)句緩存起來(lái),等所有靜態(tài)資源都識(shí)別完成之后再統(tǒng)一進(jìn)行賦值。

靜態(tài)代碼塊是嚴(yán)格按照父類(lèi)靜態(tài)代碼塊->子類(lèi)靜態(tài)代碼塊的順序加載的,且只加載一次。

public class A
{
  static
  {
    System.out.println("A類(lèi)的靜態(tài)代碼塊");
  }
  
  public A()
  {
    System.out.println("A類(lèi)的構(gòu)造器");
  }
}
public class B extends A
{
  static 
  {
    System.out.println("B類(lèi)的靜態(tài)代碼塊");
  }
  
  public B()
  {
    System.out.println("B類(lèi)的構(gòu)造器");
  }
  
  public static void main(String[] args)
  {
    new B();
    new B();
  }
}

上面代碼的結(jié)果是:

A類(lèi)的靜態(tài)代碼塊
B類(lèi)的靜態(tài)代碼塊
A類(lèi)的構(gòu)造器
B類(lèi)的構(gòu)造器
A類(lèi)的構(gòu)造器
B類(lèi)的構(gòu)造器

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

一般情況下,static是關(guān)鍵字是不能用于修飾類(lèi)的,只有在該類(lèi)是內(nèi)部類(lèi)的情況下才能使用static修飾,且只能修飾一個(gè),這樣的內(nèi)部類(lèi)被稱(chēng)為靜態(tài)內(nèi)部類(lèi)(匿名內(nèi)部類(lèi))。靜態(tài)內(nèi)部類(lèi)只有在一些特殊的場(chǎng)景中才能用得上,比如像線程池ThreadPoolExecutor中的四種拒絕機(jī)制CallerRunsPolicy、AbortPolicy、DiscardPolicy、DiscardOldestPolicy就是靜態(tài)內(nèi)部類(lèi)。

與import關(guān)鍵字聯(lián)合使用

import static是JDK1.5之后的新特性,這兩個(gè)關(guān)鍵字聯(lián)合使用可以指定導(dǎo)入某個(gè)類(lèi)中的指定靜態(tài)資源,并且不需要使用類(lèi)名.資源名,可以直接使用資源名。

import static java.lang.Math.*;

public class A
{
  public static void main(String[] args)
  {
    System.out.println(sin(2.2));
  }
}

這么寫(xiě)意味著導(dǎo)入了java.lang.Math包下的所有靜態(tài)資源,因此在main函數(shù)里就可以直接使用sin(2,2)而不需要使用Math.sin(2,2)了。另外使用這種語(yǔ)法要特別注意的是,這里要寫(xiě)import static java.lang.Math.*,最后的【.*】不可少,有了這兩個(gè)字符才意味著導(dǎo)入的是Math下的所有靜態(tài)資源,寫(xiě)成import static java.lang.Math是有問(wèn)題的。當(dāng)然,我們也可以指定只導(dǎo)入某個(gè)靜態(tài)資源,比如只導(dǎo)入Math下sin這個(gè)方法而不導(dǎo)入Math下的所有靜態(tài)資源。

import static java.lang.Math.sin;

public class A
{
  public static void main(String[] args)
  {
    System.out.println(sin(2.2));
  }
}

使用import static這樣的語(yǔ)法可以有效簡(jiǎn)化一些操作,比如在頻繁使用Math類(lèi)下靜態(tài)資源的地方可以少寫(xiě)很多【Math.】,但是這樣卻降低了代碼的可讀性,因?yàn)檫@樣就模糊了該靜態(tài)資源的來(lái)源,弱化了分類(lèi)的概念。

以上就是詳解java中的static關(guān)鍵字的詳細(xì)內(nèi)容,更多關(guān)于java static關(guān)鍵字的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java冒泡排序和快速排序代碼

    java冒泡排序和快速排序代碼

    本文主要介紹了java冒泡排序和快速排序的實(shí)例代碼。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-04-04
  • 關(guān)于properties配置文件的加密方式

    關(guān)于properties配置文件的加密方式

    這篇文章主要介紹了關(guān)于properties配置文件的加密方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Spring JdbcTemplate執(zhí)行數(shù)據(jù)庫(kù)操作詳解

    Spring JdbcTemplate執(zhí)行數(shù)據(jù)庫(kù)操作詳解

    JdbcTemplate是Spring框架自帶的對(duì)JDBC操作的封裝,目的是提供統(tǒng)一的模板方法使對(duì)數(shù)據(jù)庫(kù)的操作更加方便、友好,效率也不錯(cuò),這篇文章主要介紹了Spring JdbcTemplate執(zhí)行數(shù)據(jù)庫(kù)操作,需要的朋友可以參考下
    2022-10-10
  • Springboot引用外部配置文件的方法步驟

    Springboot引用外部配置文件的方法步驟

    這篇文章主要介紹了Springboot引用外部配置文件的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 關(guān)于Java中你所不知道的Integer詳解

    關(guān)于Java中你所不知道的Integer詳解

    這篇文章主要給大家介紹了關(guān)于Java中你所不知道的一些關(guān)于Integer的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • java中建立0-10m的消息(字符串)實(shí)現(xiàn)方法

    java中建立0-10m的消息(字符串)實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇java中建立0-10m的消息(字符串)實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • Java中HashMap和Hashtable的區(qū)別小結(jié)

    Java中HashMap和Hashtable的區(qū)別小結(jié)

    本文主要介紹了Java中HashMap和Hashtable的區(qū)別小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • SpringBoot+Idea熱部署實(shí)現(xiàn)流程解析

    SpringBoot+Idea熱部署實(shí)現(xiàn)流程解析

    這篇文章主要介紹了SpringBoot+Idea熱部署實(shí)現(xiàn)流程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • mybatis自定義類(lèi)型處理器的實(shí)現(xiàn)

    mybatis自定義類(lèi)型處理器的實(shí)現(xiàn)

    在MyBatis使用中,有時(shí)需要對(duì)特定數(shù)據(jù)類(lèi)型進(jìn)行定制處理,自定義類(lèi)型處理器(TypeHandler)可以實(shí)現(xiàn)這一需求,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • Maven中optional標(biāo)簽用法詳解

    Maven中optional標(biāo)簽用法詳解

    這篇文章主要介紹了Maven中optional標(biāo)簽,文章中有詳細(xì)的代碼示例供大家參考,對(duì)大家的學(xué)習(xí)或工作有一定的參考價(jià)值,感興趣的小伙伴可以借鑒一下
    2023-05-05

最新評(píng)論