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

實(shí)例解析Java關(guān)于static的作用

 更新時(shí)間:2019年04月03日 08:58:16   作者:農(nóng)碼關(guān)山北  
只要是有學(xué)過Java的都一定知道static,也一定能多多少少說出一些作用和注意事項(xiàng)。文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

概述

只要是有學(xué)過Java的都一定知道static,也一定能多多少少說出一些作用和注意事項(xiàng)。如果已經(jīng)對static了如指掌的請點(diǎn)擊關(guān)閉按鈕,看下去也只是浪費(fèi)您寶貴時(shí)間而已。這篇隨筆只是個(gè)人的習(xí)慣總結(jié)。

為什么需要static?

有時(shí)候我們并不想去new一個(gè)對象,只是單純的想要調(diào)用一個(gè)函數(shù),并且希望這個(gè)函數(shù)不會與包含它的類的其他對象有所關(guān)聯(lián)。說得通俗點(diǎn),即使沒有創(chuàng)建對象,也能通過類本身來調(diào)用函數(shù)。

static靜態(tài)變量

被static修飾的變量屬于類變量,通過字面意思就說明了這個(gè)變量的歸屬(類),與之相對的是沒有被static修飾的成員變量,也稱為實(shí)例變量,說明這個(gè)變量是屬于某個(gè)具體的對象。

public class StaticDemo
{
 private static int i = 50;

 private int j = 60;

 public static void main(String[] args) {
 StaticDemo staticDemo = new StaticDemo();
 StaticDemo staticDemo1 = new StaticDemo();
 //即使創(chuàng)建兩個(gè)對象,也都指向同一存儲空間
 System.out.println(staticDemo.i);
 System.out.println(staticDemo1.i);
 //改變值
 staticDemo.i = 52;
 System.out.println(staticDemo1.i);
 staticDemo.j = 65;
 staticDemo1.j = 70;
 System.out.println(staticDemo.j);
 System.out.println(staticDemo1.j);
 }

}

輸出

50
50
52
65
70

通過上面的實(shí)例,我們很快看出他們的區(qū)別

  1. 靜態(tài)變量是屬于類的,只有一份存儲空間,是類之間共享的,牽一發(fā)而動全身,一處變,處處變。
  2. 實(shí)例變量屬于實(shí)例對象,創(chuàng)建幾次對象,就有幾份的成員變量(拷貝)。

static修飾的靜態(tài)函數(shù)

說到靜態(tài)函數(shù),就不得不提Java另一個(gè)關(guān)鍵詞this,指的是當(dāng)前的引用。意思是調(diào)用這個(gè)函數(shù)的對象,這意味著和static修飾的函數(shù)水火不容。被static修飾的函數(shù),不能出現(xiàn)this關(guān)鍵字,否則便會報(bào)錯(cuò)。

去掉this,分別調(diào)用i或者j,會發(fā)現(xiàn)靜態(tài)函數(shù)調(diào)用非靜態(tài)資源時(shí)出錯(cuò)。這是為什么?從JVM加載機(jī)制角度來說,靜態(tài)資源(被staitc修飾)是類在初始化的時(shí)候就加載的,而非靜態(tài)資源是new的時(shí)候加載的。類的初始化是早于new的,加載了say()的函數(shù)時(shí),它并不認(rèn)識 j 這個(gè)成員變量,但對于非靜態(tài)函數(shù)來說,當(dāng)它加載時(shí),靜態(tài)資源已經(jīng)加載完畢,所以它是認(rèn)識 i 這個(gè)靜態(tài)資源的。我們總結(jié)一下static修飾函數(shù)時(shí)的特點(diǎn)

  1. 靜態(tài)函數(shù)不能引用非靜態(tài)資源;
  2. 非靜態(tài)函數(shù)可以引用靜態(tài)資源;
  3. 靜態(tài)函數(shù)可以相互調(diào)用(只要引入所在包即可);
  4. 靜態(tài)函數(shù)沒有this,因?yàn)樗灰栏接谌魏螌ο蟆?/li>

現(xiàn)在,我們也能知道m(xù)ain函數(shù)為什么必須是static的,因?yàn)槌绦蛟趫?zhí)行main函數(shù)時(shí)候,沒有創(chuàng)建任何對象,只是通過類名來訪問。

構(gòu)造函數(shù)是不是靜態(tài)函數(shù)?

《Java編程思想》提到“即使沒有顯示地使用static關(guān)鍵字,構(gòu)造器實(shí)際上也是靜態(tài)方法”。我至今不能確認(rèn)構(gòu)造器是不是靜態(tài)函數(shù),個(gè)人更偏向于不是。原因待會再闡述,先看個(gè)實(shí)例

public class StaticTest
{
 private static int i;

 private int j;

 public StaticTest(int i,int j){
 this.i = i;
 this.j = j;
     say1()
 }


 public void say1()
 {
 System.out.println("you age is" + i);
 System.out.println("you age is" + j);
 }

 public static void main(String[] args)
 {
 StaticTest staticTest = new StaticTest(4,5);
 StaticTest staticTest1 = new StaticTest(10,69);
 System.out.println(staticTest.i);
 System.out.println(staticTest.j);
 System.out.println(staticTest1.i);
 System.out.println(staticTest1.j);

 }
}

輸出

you age is4
you age is5
you age is10
you age is69
10
5
10
69

實(shí)例中,確實(shí)改變了 i 的值,也符合靜態(tài)資源的定義,只有一份存儲空間。但構(gòu)造器里用了this,與我前文所說的static屬于類,不屬于任何對象,this屬于當(dāng)前引用對象互相矛盾,并且構(gòu)造函數(shù)還可以調(diào)用實(shí)例函數(shù)。一臉懵逼,這也是讓我感到困惑并且認(rèn)為構(gòu)造函數(shù)不是靜態(tài)函數(shù)的地方。如有周知,留言解惑,感謝。

靜態(tài)塊與非靜態(tài)塊

private static int i;
static
    {
        i = 5;
    }

靜態(tài)塊是static的重要應(yīng)用之一,無函數(shù)名、作用域、返回值以及參數(shù),靜態(tài)代碼塊與靜態(tài)變量和靜態(tài)函數(shù)一樣,不論類被調(diào)用多少次,該區(qū)域代碼只在類初始化時(shí)第一次時(shí)執(zhí)行一次,并且嚴(yán)格按照靜態(tài)資源的定義順序執(zhí)行加載,與靜態(tài)函數(shù)區(qū)別在于一個(gè)主動一個(gè)被動。

{
        System.out.println("我是靜態(tài)塊.");
  }

非靜態(tài)塊,同樣無函數(shù)名,作用域,返回值以及參數(shù),非靜態(tài)代碼塊會在每次類被調(diào)用或者被實(shí)例化時(shí)執(zhí)行。

實(shí)例

public class StaticTest extends Father
{
 public StaticTest()
 {
 System.out.println("我是StaticTest的構(gòu)造函數(shù)");
 }

 {
 System.out.println("我是StaticTest的非靜態(tài)塊");
 }

 static
 {
 System.out.println("我是StaticTest的靜態(tài)塊");
 }

 public static void main(String[] args)
 {
 new StaticTest();
 new StaticTest();
 }
}

class Father
{
 public Father()
 {
 System.out.println("我是Father構(gòu)造函數(shù)");
 }

 {
 System.out.println("我是Father非靜態(tài)塊1");
 }

 {
 System.out.println("我是Father非靜態(tài)塊2");
 }

 static
 {
 System.out.println("我是Father靜態(tài)塊");
 }

}

輸出

我是Father靜態(tài)塊
我是StaticTest的靜態(tài)塊
我是Father非靜態(tài)塊1
我是Father非靜態(tài)塊2
我是Father構(gòu)造函數(shù)
我是StaticTest的非靜態(tài)塊
我是StaticTest的構(gòu)造函數(shù)
我是Father非靜態(tài)塊1
我是Father非靜態(tài)塊2
我是Father構(gòu)造函數(shù)
我是StaticTest的非靜態(tài)塊
我是StaticTest的構(gòu)造函數(shù)

加載順序 :父類靜態(tài)塊 > 子類靜態(tài)塊 > 父類非靜態(tài)塊 > 父類構(gòu)造函數(shù) > 子類非靜態(tài)塊 > 子類構(gòu)造函數(shù)

靜態(tài)代碼塊以及非靜態(tài)代碼塊都會在構(gòu)造函數(shù)前執(zhí)行,首次訪問時(shí),靜態(tài)代碼塊會在非靜態(tài)代碼塊前執(zhí)行。

改變main函數(shù)

public static void main(String[] args)
{
       
}

輸出

我是Father靜態(tài)塊
我是StaticTest的靜態(tài)塊

靜態(tài)代碼塊在類加載時(shí)自動執(zhí)行,非靜態(tài)代碼塊是在創(chuàng)建對象時(shí)自動執(zhí)行的代碼,不創(chuàng)建對象不執(zhí)行該類的非靜態(tài)代碼塊。

靜態(tài)導(dǎo)入

靜態(tài)導(dǎo)入是jdk5引入的新特性,有時(shí)我們在實(shí)際應(yīng)用中,并不需要整個(gè)jar包都導(dǎo)入,而只是想使用某部分函數(shù)。提高代碼的閱讀性,更好的理解程序。

import static java.lang.System.out;

public class StaticTest
{
 public static void main(String[] args)
 {
 out.println("import static測試");
     System.out.println("import static測試");
 } 
}

輸出

import static測試
import static測試

會發(fā)現(xiàn),兩者輸出是沒有區(qū)別的,但是我們少寫了System. 雖然允許這么使用,但在實(shí)際開發(fā)中,我很少發(fā)現(xiàn)有同事這么做,主要是不利于理解,但好處是如果頻繁用這個(gè)類,可以少很多的類名。

===============================================================

如發(fā)現(xiàn)錯(cuò)誤,請及時(shí)留言,lz及時(shí)修改,避免誤導(dǎo)后來者。感謝?。?!

相關(guān)文章

  • SparkStreaming整合Kafka過程詳解

    SparkStreaming整合Kafka過程詳解

    這篇文章主要介紹了SparkStreaming整合Kafka過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-01-01
  • Java中indexOf()方法詳解及其日常使用舉例

    Java中indexOf()方法詳解及其日常使用舉例

    這篇文章主要給大家介紹了關(guān)于Java中indexOf()方法詳解及其日常使用舉例的相關(guān)資料,indexOf()方法是JavaScript字符串的內(nèi)置方法之一,它用于查找給定子字符串在原始字符串中第一次出現(xiàn)的位置,需要的朋友可以參考下
    2023-12-12
  • 基于Java解決華為機(jī)試實(shí)現(xiàn)整數(shù)與IP地址間的轉(zhuǎn)換?

    基于Java解決華為機(jī)試實(shí)現(xiàn)整數(shù)與IP地址間的轉(zhuǎn)換?

    這篇文章主要介紹了基于Java解決華為機(jī)試實(shí)現(xiàn)整數(shù)與IP地址間的轉(zhuǎn)換,文章舉例說明圍繞文章主題展開相關(guān)內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-02-02
  • Spring中的@ComponentScan注解使用詳解

    Spring中的@ComponentScan注解使用詳解

    這篇文章主要介紹了Spring中的@ComponentScan注解使用詳解,@ComponentScan 注解的作用就是根據(jù)指定的掃描路徑,把路徑中符合掃描規(guī)則的類裝配到 Spring 容器中,需要的朋友可以參考下
    2024-01-01
  • Springboot多數(shù)據(jù)源配置之整合dynamic-datasource方式

    Springboot多數(shù)據(jù)源配置之整合dynamic-datasource方式

    這篇文章主要介紹了Springboot多數(shù)據(jù)源配置之整合dynamic-datasource方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 一文弄懂Java中ThreadPoolExecutor

    一文弄懂Java中ThreadPoolExecutor

    ThreadPoolExecutor是Java中的一個(gè)線程池實(shí)現(xiàn),它可以管理和控制多個(gè) Worker Threads,本文就詳細(xì)的介紹一下Java中ThreadPoolExecutor,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • 解決spirngboot連接redis報(bào)錯(cuò):READONLY?You?can‘t?write?against?a?read?only?replica的問題

    解決spirngboot連接redis報(bào)錯(cuò):READONLY?You?can‘t?write?against?

    docker部署的redis,springboot基本每天來連redis都報(bào)錯(cuò):READONLY?You?can't?write?against?a?read?only?replica,重啟redis后,可以正常連接。但是每天都重啟redis,不現(xiàn)實(shí),也很麻煩,今天給大家分享解決方式,感興趣的朋友一起看看吧
    2023-06-06
  • springMVC之HandlerExceptionResolver使用

    springMVC之HandlerExceptionResolver使用

    這篇文章主要介紹了springMVC之HandlerExceptionResolver使用,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • SpringBoot?Redis?發(fā)布訂閱模式(Pub/Sub)的具體使用

    SpringBoot?Redis?發(fā)布訂閱模式(Pub/Sub)的具體使用

    本文主要介紹了SpringBoot Redis 發(fā)布訂閱模式(Pub/Sub)的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • IntelliJ IDEA設(shè)置代碼的快捷編輯模板Live Templates

    IntelliJ IDEA設(shè)置代碼的快捷編輯模板Live Templates

    今天小編就為大家分享一篇關(guān)于IntelliJ IDEA設(shè)置代碼的快捷編輯模板Live Templates,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10

最新評論

张家界市| 渝中区| 墨脱县| 大洼县| 增城市| 无棣县| 吴忠市| 三门县| 林西县| 延川县| 汝南县| 什邡市| 赣榆县| 永年县| 盐边县| 淮北市| 施秉县| 寻乌县| 中卫市| 景德镇市| 赤水市| 即墨市| 科技| 茂名市| 西乌珠穆沁旗| 托克托县| 沙田区| 和田市| 黄骅市| 巴青县| 河间市| 襄城县| 峨边| 德兴市| 金秀| 忻城县| 沭阳县| 靖西县| 卓资县| 上高县| 蒙阴县|