最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

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

2.因為靜態(tài)資源的組織形式固定為了【類>靜態(tài)資源】的形式,也就有效避免的靜態(tài)資源在全局重名的問題。比如在A類中有一個name屬性,B類中也有一個name屬性,如果放在一起會重復,但是分類放開則不會重復了,因為實際上這兩個屬性的全名是A.name和B.name。

3.分類有助于避免因為靜態(tài)資源都放在一個類中導致該類體積過大的問題,方便了管理與協(xié)同維護。

靜態(tài)資源容易混淆的三個點

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

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

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

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

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

靜態(tài)塊

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

import static java.lang.Math.*;

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

這么寫意味著導入了java.lang.Math包下的所有靜態(tài)資源,因此在main函數(shù)里就可以直接使用sin(2,2)而不需要使用Math.sin(2,2)了。另外使用這種語法要特別注意的是,這里要寫import static java.lang.Math.*,最后的【.*】不可少,有了這兩個字符才意味著導入的是Math下的所有靜態(tài)資源,寫成import static java.lang.Math是有問題的。當然,我們也可以指定只導入某個靜態(tài)資源,比如只導入Math下sin這個方法而不導入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這樣的語法可以有效簡化一些操作,比如在頻繁使用Math類下靜態(tài)資源的地方可以少寫很多【Math.】,但是這樣卻降低了代碼的可讀性,因為這樣就模糊了該靜態(tài)資源的來源,弱化了分類的概念。

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

相關(guān)文章

  • SpringBoot使用WebSocket實現(xiàn)前后端交互的操作方法

    SpringBoot使用WebSocket實現(xiàn)前后端交互的操作方法

    springboot使用websocket有兩種方式,一種是實現(xiàn)簡單的websocket,另外一種是實現(xiàn)STOMP協(xié)議,本篇講述如何使用springboot實現(xiàn)簡單的websocket,需要的朋友可以參考下
    2022-04-04
  • Java StringBuffer與StringBuilder有什么區(qū)別

    Java StringBuffer與StringBuilder有什么區(qū)別

    當對字符串進行修改的時候,需要使用 StringBuffer 和 StringBuilder類,和String類不同的是,StringBuffer和 StringBuilder類的對象能夠被多次的修改,并且不產(chǎn)生新的未使用對象,本篇我們來分析分析它們的區(qū)別
    2023-01-01
  • 詳解Java修飾符

    詳解Java修飾符

    Java語言提供了很多修飾符,主要分為以下兩類:訪問修飾符;非訪問修飾符。修飾符用來定義類、方法或者變量,通常放在語句的最前端。我們通過下面的例子來說明,下面就跟小編一起來看下吧
    2016-12-12
  • java實現(xiàn)Redisson看門狗機制

    java實現(xiàn)Redisson看門狗機制

    redission看門狗機制是解決分布式鎖的續(xù)約問題,本文就來詳細的介紹一下java實現(xiàn)Redisson看門狗機制,具有一定的參考價值,感興趣的可以了解一下
    2024-09-09
  • Quarkus改造Pmml模型項目異常記錄及解決處理

    Quarkus改造Pmml模型項目異常記錄及解決處理

    這篇文章主要為大家介紹了Quarkus改造Pmml模型項目是遇到的異常記錄以及解決方法,有需要的同學可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02
  • Spring?Boot?整合RocketMq實現(xiàn)消息過濾功能

    Spring?Boot?整合RocketMq實現(xiàn)消息過濾功能

    這篇文章主要介紹了Spring?Boot?整合RocketMq實現(xiàn)消息過濾,本文講解了RocketMQ實現(xiàn)消息過濾,針對不同的業(yè)務場景選擇合適的方案即可,需要的朋友可以參考下
    2022-06-06
  • Java舉例講解分治算法思想

    Java舉例講解分治算法思想

    分治算法的基本思想是將一個規(guī)模為N的問題分解為K個規(guī)模較小的子問題,這些子問題相互獨立且與原問題性質(zhì)相同。求出子問題的解,就可得到原問題的解,本篇文章我們就用分治算法來實現(xiàn)歸并排序快速排序以及二分搜索算法
    2022-04-04
  • SSH框架網(wǎng)上商城項目第22戰(zhàn)之銀行圖標以及支付頁面顯示

    SSH框架網(wǎng)上商城項目第22戰(zhàn)之銀行圖標以及支付頁面顯示

    這篇文章主要為大家詳細介紹了SSH框架網(wǎng)上商城項目第22戰(zhàn)之銀行圖標以及支付頁面顯示,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Java異常學習之自定義異常詳解

    Java異常學習之自定義異常詳解

    你的程序總有一天會崩潰掉,在崩潰掉的時候我們要知道它在哪,為了什么而崩潰掉,數(shù)據(jù)的保存或者丟失情況如何等問題。下面這篇文章主要給大家介紹了關(guān)于Java異常學習之自定義異常的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-06-06
  • idea鼠標控制放大縮小的操作

    idea鼠標控制放大縮小的操作

    這篇文章主要介紹了idea鼠標控制放大縮小的操作教程,具有很好的參考價值,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02

最新評論

荥经县| 饶平县| 抚州市| 双江| 通城县| 凯里市| 长顺县| 富民县| 长宁区| 德清县| 柯坪县| 瑞丽市| 镇雄县| 宜城市| 祥云县| 大连市| 牡丹江市| 崇明县| 浦城县| 安乡县| 肥西县| 平凉市| 顺义区| 洪江市| 金阳县| 漯河市| 霍城县| 凉山| 二连浩特市| 湖南省| 贡觉县| 昭平县| 陇川县| 叶城县| 甘孜县| 荆门市| 杭锦后旗| 东乡县| 东光县| 绥宁县| 鸡东县|