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

Java?中的靜態(tài)字段和靜態(tài)方法?

 更新時(shí)間:2022年03月22日 11:59:19   作者:宇宙之一粟  
這篇文章主要介紹了Java中的靜態(tài)字段和靜態(tài)方法,文章圍繞Java?靜態(tài)方法展開詳細(xì)內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

先看看下面這一串代碼:

public class Main {
? ? public static void main(String[] args) {
? ? ? ? System.out.println("Hello, WOrld!");
? ? }
}

我們的 ??main?? 方法被標(biāo)記了 ??static?? 修飾符,那么 ??static?? 這個(gè)修飾符的含義是啥呢?

一、靜態(tài)變量

如果一個(gè)字段定義為 static,那么每個(gè)類只有一個(gè)這樣的字段。

先來看看沒有靜態(tài)靜態(tài)遍歷的類:

class Student {
? int stuId;
? String name;
? String school = "HY No.1 High School";
}

假設(shè)高中有 1500 名學(xué)生,上述代碼現(xiàn)在所有的實(shí)例數(shù)據(jù)成員在每次創(chuàng)建對(duì)象時(shí)都會(huì)得到內(nèi)存。

所有的學(xué)生都有其獨(dú)特的 stuId 和名字,這些實(shí)例數(shù)據(jù)成員在這種情況下是正確的,畢竟都是唯一的。

但是,這里的 "school " 是所有對(duì)象的共同屬性。如果不聲明為靜態(tài)變量的話,也會(huì)占用多個(gè)內(nèi)存。但如果我們把它變成靜態(tài)的,這個(gè)字段將只獲得一次內(nèi)存。

靜態(tài)變量聲明

class Student {
? int stuId; ?// 實(shí)例變量
? String name;
? static String school = "HY No.1 High School"; // 靜態(tài)變量
}

如果你將任何變量聲明為靜態(tài),它就被稱為靜態(tài)變量。

  • 靜態(tài)變量可以用來指代所有對(duì)象的共同屬性(對(duì)每個(gè)對(duì)象來說不是唯一的),例如,雇員的公司名稱,學(xué)生的學(xué)院名稱等。
  • 靜態(tài)變量只在類加載時(shí)在類區(qū)獲得一次內(nèi)存。

靜態(tài)變量測(cè)試

代碼測(cè)試:

package com.yuzhou1su.RelearnJava;

class Student {
? ? int stuId;?
? ? String name;
? ? static String school = "HY No.1 High School";
??
? ? Student(int id, String n) {
? ? ? ? stuId = id;
? ? ? ? name = n;
? ? }

? ? void display() {
? ? ? ? System.out.println("Student id:" + stuId + ", Name:" + name + " is from " + school);
? ? }
}

public class TestVariable {

? ? public static void main(String[] args) {
? ? ? ? // TODO Auto-generated method stub
? ? ? ? Student s1 = new Student(001, "Karsa");
? ? ? ? Student s2 = new Student(002, "Ellen");

? ? ? ? s1.display();
? ? ? ? s2.display();
? ? }

}

執(zhí)行結(jié)果:

Student id:1, Name:Karsa is from HY No.1 High School
Student id:2, Name:Ellen is from HY No.1 High School

靜態(tài)變量只會(huì)獲得一次內(nèi)存,如果任何對(duì)象更改了靜態(tài)變量的值,它將保留其值。

看如下代碼:

package com.yuzhou1su.RelearnJava;

public class StaticVariableCount {
??
? static int count = 0;
??
? StaticVariableCount() {
? ? count++;
? ? System.out.println(count);
? }

? public static void main(String[] args) {
? ? // TODO Auto-generated method stub
? ? StaticVariableCount svc1 = new StaticVariableCount();
? ? StaticVariableCount svc2 = new StaticVariableCount();
? ? StaticVariableCount svc3 = new StaticVariableCount();
? ??
? }
}

測(cè)試結(jié)果:

1
2
3

二、靜態(tài)方法

Java中的靜態(tài)方法是一個(gè)屬于類的方法,但不被認(rèn)為是該類的實(shí)例;相反,Java中的靜態(tài)方法可以很容易地被創(chuàng)建和實(shí)現(xiàn),而不需要任何實(shí)例的調(diào)用。靜態(tài)方法可以訪問類中的任何數(shù)據(jù)成員,可以對(duì)數(shù)據(jù)成員進(jìn)行任何操作,也可以將任何數(shù)值作為輸入,盡管要訪問的成員變量在類中應(yīng)該有變量的范圍,而方法只能是靜態(tài)的。

public static void syntax_ex (String_name) {
? ? Body of the program for execution.
}
  • public。該類的訪問修飾語是public。
  • static。方法的范圍是靜態(tài)的,這意味著所有的成員變量和返回類型都在靜態(tài)的范圍內(nèi)。
  • void。語法流程中的這個(gè)關(guān)鍵字表示在當(dāng)前方法中沒有處理任何返回類型。
  • syntax_ex。類的名稱,表示靜態(tài)方法是當(dāng)前定義的類的一部分,后面是字符串名稱。
  • body。它包括整個(gè)核心邏輯或業(yè)務(wù)邏輯(如果需要在靜態(tài)模式下)。

如果你在任何方法上使用靜態(tài)關(guān)鍵字,它就被稱為靜態(tài)方法,

靜態(tài)方法:

  • 靜態(tài)方法屬于類,而不是屬于類的對(duì)象。
  • 靜態(tài)方法可以被調(diào)用而不需要?jiǎng)?chuàng)建一個(gè)類的實(shí)例。
  • 靜態(tài)方法可以訪問靜態(tài)數(shù)據(jù)成員,并可以改變它的值。

靜態(tài)方法測(cè)試

如果我們想更改學(xué)習(xí)名字的操作呢?就可以聲明一個(gè)靜態(tài)方法。

package com.yuzhou1su.RelearnJava;

class Student {
? ? int stuId;?
? ? String name;
? ? static String school = "HY No.1 High School";
? ??
? ? static void changeSchool() {
? ? ? ? school = "HY No.5 High School";
? ? }
??
? ? Student(int id, String n) {
? ? ? ? stuId = id;
? ? ? ? name = n;
? ? }

? ? void display() {
? ? ? ? System.out.println("Student id:" + stuId + ", Name:" + name + " is from " + school);
? ? }
}

public class TestVariable {

? ? public static void main(String[] args) {
? ? ? ? // TODO Auto-generated method stub
? ? ? ??
? ? ? ? Student.changeSchool();
? ? ? ? Student s1 = new Student(001, "Karsa");
? ? ? ? Student s2 = new Student(002, "Ellen");

? ? ? ? s1.display();
? ? ? ? s2.display();
? ? }

}

測(cè)試結(jié)果:

Student id:1, Name:Karsa is from HY No.5 High School
Student id:2, Name:Ellen is from HY No.5 High School

靜態(tài)方法是如何工作的

  • 靜態(tài)方法和實(shí)例方法是 Java 中的兩種方法,它們?cè)诔绦騿T中造成了一些混亂,但這僅僅是一種誤解。靜態(tài)方法和實(shí)例方法都有很大的區(qū)別。讓我們看看靜態(tài)方法在 Java 中是如何工作的。Java 中的靜態(tài)方法是一種駐留在類中的方法,即使沒有創(chuàng)建對(duì)象或沒有進(jìn)行實(shí)例化,也可以訪問。在類的名稱后面加上方法的名稱并傳遞參數(shù),就可以訪問該類的任何實(shí)例。
  • 它可以被表示為??ClassName.methodName(arguments)?? 。此外,這些方法的組成有一個(gè)目標(biāo),即該方法應(yīng)可與類中的所有成員變量和每個(gè)人的對(duì)象共享,其范圍由修改器 ??static?? 定義。這些方法沒有任何重載的能力;相反,它們可以在編譯時(shí)使用編譯器的靜態(tài)綁定來重載,每當(dāng)程序員需要在類的所有實(shí)例、對(duì)象或成員變量之間共享一個(gè)共同的代碼片段時(shí),靜態(tài)方法就會(huì)成為救星,因?yàn)樗ㄟ^創(chuàng)建一個(gè)共同的靜態(tài)范圍來為所有成員、對(duì)象和變量創(chuàng)造一種共享的規(guī)定。
  • 一個(gè)類的所有靜態(tài)字段都可以使用靜態(tài)字段作為一個(gè)類的靜態(tài)方法的一部分進(jìn)行訪問。另外,靜態(tài)方法也與內(nèi)存分配功能有關(guān),并且也是可以支持的。它將靜態(tài)方法字段和變量的一部分與一些永久生成的堆存儲(chǔ)在內(nèi)存中,用于關(guān)聯(lián)值。內(nèi)存分配不支持對(duì)象作為靜態(tài)方法堆的創(chuàng)建,或者方法本身不支持實(shí)例化。但接下來的問題是,靜態(tài)方法是如何通過共享和創(chuàng)建所有成員的范圍作為類的一部分來工作的。

為什么 Java Main 方法是靜態(tài)方法

這是因?yàn)閷?duì)象不需要調(diào)用靜態(tài)方法。如果是非靜態(tài)方法,JVM 會(huì)先創(chuàng)建一個(gè)對(duì)象,然后調(diào)用 ??main()?? 方法,這會(huì)導(dǎo)致額外內(nèi)存分配的問題。

main 方法不對(duì)任何對(duì)象進(jìn)行操作,事實(shí)上,在啟動(dòng)程序時(shí)還沒有任何對(duì)象。靜態(tài)的 main 方法將執(zhí)行并構(gòu)造程序所需要的對(duì)象。

三、靜態(tài)常量

靜態(tài)變量使用的比較少,但靜態(tài)常量卻很常用。比如 Math 類中定義一個(gè)靜態(tài)常量:

public class Math {
? public static final double PI = 3.14159265358979;
}

然后在程序中,可以用 Math.PI 來訪問這個(gè)常量。

四、總結(jié)

Java 中為什么需要靜態(tài)變量?

答:每當(dāng)我們希望為一個(gè)類的所有對(duì)象擁有一個(gè)公共屬性時(shí),我們就使用一個(gè)類級(jí)別的變量,即靜態(tài)變量。

在類加載時(shí),此變量僅在內(nèi)存中加載一次。 由于它不是在Java中按對(duì)象定義的,因此可以節(jié)省內(nèi)存。

為什么用 Java 創(chuàng)建靜態(tài)變量不是一個(gè)好習(xí)慣?

答:靜態(tài)變量是類的所有對(duì)象共有的。 如果創(chuàng)建了新對(duì)象,則無需測(cè)試靜態(tài)變量的值。 使用靜態(tài)變量的任何代碼都可以處于任何狀態(tài)。 它可以在新對(duì)象內(nèi)或在類級(jí)別。 因此,靜態(tài)變量的范圍在Java類中是開放式的。

如果我們希望對(duì)范圍進(jìn)行更嚴(yán)格的控制,則變量應(yīng)在對(duì)象創(chuàng)建級(jí)別創(chuàng)建。

同樣,定義靜態(tài)變量也不是一個(gè)好習(xí)慣,因?yàn)樗鼈冞`反了面向?qū)ο缶幊痰脑怼?/p>

Java 中靜態(tài)方法的目的?

答:Java 提供了靜態(tài)方法的功能來在類級(jí)別創(chuàng)建行為。 靜態(tài)方法是類的所有對(duì)象所共有的。 我們不需要?jiǎng)?chuàng)建類的任何對(duì)象來調(diào)用靜態(tài)方法。 因此,它提供了不創(chuàng)建用于調(diào)用它的對(duì)象的便利。

靜態(tài)方法也可以訪問和修改靜態(tài)數(shù)據(jù)成員。 這也有助于在類級(jí)別上保持行為和狀態(tài)。

為什么在 Java 中將 main 方法標(biāo)記為靜態(tài)方法?

答:Java 中的 main 方法被標(biāo)記為靜態(tài),因此 JVM 可以調(diào)用它來啟動(dòng)程序。 如果 main 方法不是靜態(tài)的,那么Java進(jìn)程將調(diào)用哪個(gè)構(gòu)造函數(shù)?

因此,在Java中將主要方法標(biāo)記為靜態(tài)是眾所周知的約定。 但是,如果我們?nèi)コ齭tatic,那將會(huì)有歧義。 Java進(jìn)程可能不知道要調(diào)用哪個(gè)類的方法來啟動(dòng)程序。

因此,此約定有助于 Java 進(jìn)程識(shí)別類中作為參數(shù)傳遞給 Java 進(jìn)程的程序的啟動(dòng)代碼。

在什么情況下我們使用靜態(tài)塊?

答:有時(shí),有一個(gè)具有靜態(tài)成員變量的類。 這些變量需要一些復(fù)雜的初始化。 這時(shí),靜態(tài)塊可作為初始化復(fù)雜靜態(tài)成員變量初始化的工具。靜態(tài)塊甚至在執(zhí)行main之前執(zhí)行。有時(shí),我們也可以用靜態(tài)的類方法替換靜態(tài)塊。

是否可以在不定義main()方法的情況下執(zhí)行程序?

答:不,從Java 7開始,您需要main()方法來執(zhí)行程序。 在Java的早期版本中,有一種解決方法可用于使用靜態(tài)塊執(zhí)行。 但是現(xiàn)在這個(gè)差距已經(jīng)縮小。

當(dāng)main方法的簽名中未提及static修飾符時(shí)會(huì)發(fā)生什么?

答:根據(jù)Java規(guī)范,main方法必須標(biāo)記為靜態(tài)。 它只需要一個(gè)字符串?dāng)?shù)組的參數(shù)即可。

程序可以使用非靜態(tài)方法進(jìn)行編譯。 但是在執(zhí)行時(shí)會(huì)給出NoSuchMethodError。

Java中的靜態(tài)方法和實(shí)例方法有什么區(qū)別?

答:通常,需要為不依賴于對(duì)象成員變量的類定義行為。 這種行為是通過靜態(tài)方法捕獲的。 如果存在依賴于對(duì)象成員變量的行為,則我們不會(huì)將其標(biāo)記為靜態(tài),而是將其保留為實(shí)例方法。

要調(diào)用為靜態(tài)方法,我們不需要?jiǎng)?chuàng)建對(duì)象。 我們只用類名來稱呼它。 但是要調(diào)用實(shí)例方法,我們需要先創(chuàng)建/獲取一個(gè)對(duì)象。

實(shí)例成員變量不能通過靜態(tài)方法訪問。 但是實(shí)例方法可以調(diào)用實(shí)例變量和靜態(tài)變量。

到此這篇關(guān)于Java 中的靜態(tài)字段和靜態(tài)方法 的文章就介紹到這了,更多相關(guān)Java 靜態(tài)方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java開發(fā)環(huán)境配置及Vscode搭建過程

    Java開發(fā)環(huán)境配置及Vscode搭建過程

    今天通過圖文并茂的形式給大家介紹Java開發(fā)環(huán)境配置及Vscode搭建過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-07-07
  • Java計(jì)算交集,差集,并集的方法示例

    Java計(jì)算交集,差集,并集的方法示例

    這篇文章主要介紹了Java計(jì)算交集,差集,并集的方法,結(jié)合實(shí)例形式簡(jiǎn)單分析了java集合運(yùn)算的簡(jiǎn)單操作技巧,需要的朋友可以參考下
    2017-10-10
  • spring boot security自定義認(rèn)證的代碼示例

    spring boot security自定義認(rèn)證的代碼示例

    這篇文章主要介紹了spring boot security自定義認(rèn)證,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • Java 11 正式發(fā)布,這 8 個(gè)逆天新特性教你寫出更牛的代碼

    Java 11 正式發(fā)布,這 8 個(gè)逆天新特性教你寫出更牛的代碼

    美國當(dāng)?shù)貢r(shí)間9月25日,Oracle 官方宣布 Java 11 (18.9 LTS) 正式發(fā)布,可在生產(chǎn)環(huán)境中使用!這是自 Java 8 后的首個(gè)長期支持版本
    2018-09-09
  • 簡(jiǎn)單的java圖片處理類(圖片水印 圖片縮放)

    簡(jiǎn)單的java圖片處理類(圖片水印 圖片縮放)

    本圖片處理類功能非常之強(qiáng)大可以實(shí)現(xiàn)幾乎所有WEB開發(fā)中對(duì)圖像的處理功能都集成了,包括有縮放圖像、切割圖像、圖像類型轉(zhuǎn)換、彩色轉(zhuǎn)黑白、文字水印、圖片水印等功能
    2013-11-11
  • Spring?Data?Redis切換底層Jedis和Lettuce實(shí)現(xiàn)源碼解析

    Spring?Data?Redis切換底層Jedis和Lettuce實(shí)現(xiàn)源碼解析

    這篇文章主要為大家介紹了Spring?Data?Redis切換底層Jedis和Lettuce實(shí)現(xiàn)方法源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Java 線程對(duì)比(Thread,Runnable,Callable)實(shí)例詳解

    Java 線程對(duì)比(Thread,Runnable,Callable)實(shí)例詳解

    這篇文章主要介紹了Java 線程(Thread,Runnable,Callable)實(shí)例詳解的相關(guān)資料,這里對(duì)java 線程的三種方法進(jìn)行了對(duì)比,需要的朋友可以參考下
    2016-12-12
  • Spring?Boot開發(fā)時(shí)Java對(duì)象和Json對(duì)象之間的轉(zhuǎn)換

    Spring?Boot開發(fā)時(shí)Java對(duì)象和Json對(duì)象之間的轉(zhuǎn)換

    在Spring?Boot開發(fā)中,我們經(jīng)常需要處理Java對(duì)象和Json對(duì)象之間的轉(zhuǎn)換,本文將介紹如何在Spring?Boot項(xiàng)目中實(shí)現(xiàn)Java對(duì)象和Json對(duì)象之間的轉(zhuǎn)換,感興趣的朋友跟隨小編一起看看吧
    2023-09-09
  • 簡(jiǎn)單通用JDBC輔助類封裝(實(shí)例)

    簡(jiǎn)單通用JDBC輔助類封裝(實(shí)例)

    下面小編就為大家?guī)硪黄?jiǎn)單通用JDBC輔助類封裝(實(shí)例)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-07-07
  • IntelliJ IDEA中Tomcat日志亂碼問題的解決指南

    IntelliJ IDEA中Tomcat日志亂碼問題的解決指南

    在使用IntelliJ IDEA進(jìn)行Java開發(fā)時(shí),Tomcat作為常用的服務(wù)器,往往被集成在開發(fā)環(huán)境中,許多開發(fā)者可能會(huì)遇到這樣一個(gè)問題:?jiǎn)?dòng) Tomcat 服務(wù)器時(shí),控制臺(tái)的日志輸出出現(xiàn)了亂碼,本文將詳細(xì)介紹如何通過修改IntelliJ IDEA和Tomcat的相關(guān)配置,徹底解決日志輸出亂碼的問題
    2024-10-10

最新評(píng)論

曲麻莱县| 北辰区| 留坝县| 永德县| 项城市| 盐池县| 富阳市| 衢州市| 绍兴市| 左权县| 金华市| 永修县| 抚顺县| 鄂托克前旗| 平塘县| 蓬溪县| 晋城| 达拉特旗| 秦皇岛市| 贞丰县| 钟祥市| 古交市| 钦州市| 乌审旗| 秭归县| 永年县| 蒲城县| 沛县| 德令哈市| 蓬安县| 延川县| 禹州市| 娱乐| 喀喇沁旗| 龙游县| 嘉兴市| 宁蒗| 黔东| 拉萨市| 浙江省| 香港 |