您好,登錄后才能下訂單哦!
這篇文章主要介紹了Java中的靜態字段和靜態方法怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
先看看下面這一串代碼:
public class Main { public static void main(String[] args) { System.out.println("Hello, WOrld!"); } }
我們的 main
方法被標記了 static
修飾符,那么 static 這個修飾符的含義是啥呢?
如果一個字段定義為 static
,那么每個類只有一個這樣的字段。
先來看看沒有靜態靜態遍歷的類:
class Student { int stuId; String name; String school = "HY No.1 High School"; }
假設高中有 1500 名學生,上述代碼現在所有的實例數據成員在每次創建對象時都會得到內存。
所有的學生都有其獨特的 stuId 和名字,這些實例數據成員在這種情況下是正確的,畢竟都是唯一的。
但是,這里的 "school " 是所有對象的共同屬性。如果不聲明為靜態變量的話,也會占用多個內存。但如果我們把它變成靜態的,這個字段將只獲得一次內存。
class Student { int stuId; // 實例變量 String name; static String school = "HY No.1 High School"; // 靜態變量 }
如果你將任何變量聲明為靜態,它就被稱為靜態變量。
靜態變量可以用來指代所有對象的共同屬性(對每個對象來說不是唯一的),例如,雇員的公司名稱,學生的學院名稱等。
靜態變量只在類加載時在類區獲得一次內存。
代碼測試:
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(); } }
執行結果:
Student id:1, Name:Karsa is from HY No.1 High School
Student id:2, Name:Ellen is from HY No.1 High School
靜態變量只會獲得一次內存,如果任何對象更改了靜態變量的值,它將保留其值。
看如下代碼:
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(); } }
測試結果:
1
2
3
Java中的靜態方法是一個屬于類的方法,但不被認為是該類的實例;相反,Java中的靜態方法可以很容易地被創建和實現,而不需要任何實例的調用。靜態方法可以訪問類中的任何數據成員,可以對數據成員進行任何操作,也可以將任何數值作為輸入,盡管要訪問的成員變量在類中應該有變量的范圍,而方法只能是靜態的。
public static void syntax_ex (String_name) { Body of the program for execution. }
public。該類的訪問修飾語是public。
static。方法的范圍是靜態的,這意味著所有的成員變量和返回類型都在靜態的范圍內。
void。語法流程中的這個關鍵字表示在當前方法中沒有處理任何返回類型。
syntax_ex。類的名稱,表示靜態方法是當前定義的類的一部分,后面是字符串名稱。
body。它包括整個核心邏輯或業務邏輯(如果需要在靜態模式下)。
如果你在任何方法上使用靜態關鍵字,它就被稱為靜態方法,
靜態方法:
靜態方法屬于類,而不是屬于類的對象。
靜態方法可以被調用而不需要創建一個類的實例。
靜態方法可以訪問靜態數據成員,并可以改變它的值。
如果我們想更改學習名字的操作呢?就可以聲明一個靜態方法。
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(); } }
測試結果:
Student id:1, Name:Karsa is from HY No.5 High School
Student id:2, Name:Ellen is from HY No.5 High School
靜態方法和實例方法是 Java 中的兩種方法,它們在程序員中造成了一些混亂,但這僅僅是一種誤解。靜態方法和實例方法都有很大的區別。讓我們看看靜態方法在 Java 中是如何工作的。Java 中的靜態方法是一種駐留在類中的方法,即使沒有創建對象或沒有進行實例化,也可以訪問。在類的名稱后面加上方法的名稱并傳遞參數,就可以訪問該類的任何實例。
它可以被表示為ClassName.methodName
(arguments) 。此外,這些方法的組成有一個目標,即該方法應可與類中的所有成員變量和每個人的對象共享,其范圍由修改器 static 定義。這些方法沒有任何重載的能力;相反,它們可以在編譯時使用編譯器的靜態綁定來重載,每當程序員需要在類的所有實例、對象或成員變量之間共享一個共同的代碼片段時,靜態方法就會成為救星,因為它通過創建一個共同的靜態范圍來為所有成員、對象和變量創造一種共享的規定。
一個類的所有靜態字段都可以使用靜態字段作為一個類的靜態方法的一部分進行訪問。另外,靜態方法也與內存分配功能有關,并且也是可以支持的。它將靜態方法字段和變量的一部分與一些永久生成的堆存儲在內存中,用于關聯值。內存分配不支持對象作為靜態方法堆的創建,或者方法本身不支持實例化。但接下來的問題是,靜態方法是如何通過共享和創建所有成員的范圍作為類的一部分來工作的。
這是因為對象不需要調用靜態方法。如果是非靜態方法,JVM 會先創建一個對象,然后調用 main() 方法,這會導致額外內存分配的問題。
main 方法不對任何對象進行操作,事實上,在啟動程序時還沒有任何對象。靜態的 main 方法將執行并構造程序所需要的對象。
靜態變量使用的比較少,但靜態常量卻很常用。比如 Math 類中定義一個靜態常量:
public class Math { public static final double PI = 3.14159265358979; }
然后在程序中,可以用 Math.PI 來訪問這個常量。
Java 中為什么需要靜態變量?
答:每當我們希望為一個類的所有對象擁有一個公共屬性時,我們就使用一個類級別的變量,即靜態變量。
在類加載時,此變量僅在內存中加載一次。 由于它不是在Java中按對象定義的,因此可以節省內存。
為什么用 Java 創建靜態變量不是一個好習慣?
答:靜態變量是類的所有對象共有的。 如果創建了新對象,則無需測試靜態變量的值。 使用靜態變量的任何代碼都可以處于任何狀態。 它可以在新對象內或在類級別。 因此,靜態變量的范圍在Java類中是開放式的。
如果我們希望對范圍進行更嚴格的控制,則變量應在對象創建級別創建。
同樣,定義靜態變量也不是一個好習慣,因為它們違反了面向對象編程的原理。
Java 中靜態方法的目的?
答:Java 提供了靜態方法的功能來在類級別創建行為。 靜態方法是類的所有對象所共有的。 我們不需要創建類的任何對象來調用靜態方法。 因此,它提供了不創建用于調用它的對象的便利。
靜態方法也可以訪問和修改靜態數據成員。 這也有助于在類級別上保持行為和狀態。
為什么在 Java 中將 main 方法標記為靜態方法?
答:Java 中的 main 方法被標記為靜態,因此 JVM 可以調用它來啟動程序。 如果 main 方法不是靜態的,那么Java進程將調用哪個構造函數?
因此,在Java中將主要方法標記為靜態是眾所周知的約定。 但是,如果我們去除static,那將會有歧義。 Java進程可能不知道要調用哪個類的方法來啟動程序。
因此,此約定有助于 Java 進程識別類中作為參數傳遞給 Java 進程的程序的啟動代碼。
在什么情況下我們使用靜態塊?
答:有時,有一個具有靜態成員變量的類。 這些變量需要一些復雜的初始化。 這時,靜態塊可作為初始化復雜靜態成員變量初始化的工具。靜態塊甚至在執行main之前執行。有時,我們也可以用靜態的類方法替換靜態塊。
是否可以在不定義main()方法的情況下執行程序?
答:不,從Java 7開始,您需要main()方法來執行程序。 在Java的早期版本中,有一種解決方法可用于使用靜態塊執行。 但是現在這個差距已經縮小。
當main方法的簽名中未提及static修飾符時會發生什么?
答:根據Java規范,main方法必須標記為靜態。 它只需要一個字符串數組的參數即可。
程序可以使用非靜態方法進行編譯。 但是在執行時會給出NoSuchMethodError。
Java中的靜態方法和實例方法有什么區別?
答:通常,需要為不依賴于對象成員變量的類定義行為。 這種行為是通過靜態方法捕獲的。 如果存在依賴于對象成員變量的行為,則我們不會將其標記為靜態,而是將其保留為實例方法。
要調用為靜態方法,我們不需要創建對象。 我們只用類名來稱呼它。 但是要調用實例方法,我們需要先創建/獲取一個對象。
實例成員變量不能通過靜態方法訪問。 但是實例方法可以調用實例變量和靜態變量。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Java中的靜態字段和靜態方法怎么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。