類變數、類方法(static在類中的用法)及main函式細節

很有意思的一句話, 一個數如果沒有前面的1,後面跟再多的0也是沒有意義,我們應該繼續努力,把1的位置往前挪 !

目錄

類變數

類變數的定義

訪問修飾符 static 資料型別 變數名;//推薦使用static 訪問修飾符 資料型別 變數名;//也可以

在定義時也可以賦予初始值!

什麼是類變數

用static關鍵字修飾的成員變數即類變數,也叫

靜態變數/靜態屬性,是該類的所有物件共享的變數

,任何一個該類的物件去訪問它時,取到的都是相同的值,同樣任何一個該類的物件去修改它的值,修改的也是同一個變數。而

static變數在類載入時就生成了

,下面以ChildGame類來演示類變數的使用並分析類變數在記憶體中的佈局:

package com。lww。study_static_;public class ChildGame { public static void main(String[] args) { //定義一個變數count,統計有多少個小孩加入了遊戲 //int count = 0; //註釋快捷鍵,多行註釋(每行都要) ctrl + / //註釋快捷鍵,多行註釋(首尾行) ctrl + shift + / Child child1 = new Child(“白骨精”); child1。join(); //count++; child1。count++; Child child2 = new Child(“狐狸精”); child2。join(); //count++; child2。count++; Child child3 = new Child(“老鼠精”); child3。join(); //count++; child3。count++; //遊戲結束 //System。out。println(“共有” + count + “小孩加入了遊戲”); //類變數可以透過類名訪問 System。out。println(“共有” + Child。count + “小孩加入了遊戲”); //下面的程式碼輸出結果相同 System。out。println(“child1。count = ” + child1。count); System。out。println(“child2。count = ” + child2。count); System。out。println(“child3。count = ” + child3。count); }}class Child{ private String name; //定義一個類變數 count,是一個static 靜態變數 //該變數最大的特點就是會被Child類的所有的物件例項共享 public static int count = 0; public Child(String name){ this。name = name; } public void join(){ System。out。println(name + “加入了遊戲。。”); }

經過上面的程式碼測試,我們發現同一個類定義的不同物件,所訪問到的static修飾的成員變數均是同一個,下面給出它在記憶體中的佈局:

類變數、類方法(static在類中的用法)及main函式細節

有些書上說static修飾的count變數是在方法區中的靜態域,而這裡提供的是存在於堆區上,這裡不做過多分析,感興趣的可以自己找找網上的文章。不管是哪一種佈局,這裡主要想說明的點是, 類變數在類載入時就產生了,該類的每一個例項物件都使用的是同一個類變數!

如何訪問類變數

類名。類變數名//推薦使用!物件名。類變數名

靜態變數的訪問修飾符的訪問許可權範圍和普通成員變數是一樣(遵循的訪問規則一樣)!

類變數的細節總結

什麼時候需要使用類變數:當我們需要讓某個類的所有物件都共享一個變數時,就可以考慮使用類變數(靜態變數)

類變數與例項變數(普通屬性)的區別: 類變數是該類的所有物件共享的,而例項變數是每個物件獨享的

加上static稱為類變數或靜態變數,否則稱為例項變數/普通變數/非靜態變數

類變數可以透過 類名。類變數名 或者 物件名。類變數名 來訪問,但Java設計者推薦我們使用 類名。類變數名 方式去訪問。訪問規則遵循修飾符的訪問許可權和範圍

例項變數不能透過 類名.普通成員變數名 訪問

,因為還未建立物件例項,記憶體中沒有該普通成員變數

類變數是在類載入時就初始化了,也就是說,即使沒有建立物件,只要類載入了,就可以使用類變量了 ,這也就是為什麼能夠透過 類名。類變數名 方式去訪問

類變數的生命週期是隨類的載入開始,隨著類的消亡而銷燬

類方法

類方法的定義

類方法也稱為靜態方法,定義形式如下:

訪問修飾符 static 資料返回型別 方法名() {……}//推薦使用static 訪問修飾符 資料返回型別 方法名() {……}//也可

經過上面類變數的介紹,這裡的類方法理解起來會相對容易。

類方法的呼叫

類名。類方法名//推薦使用物件名。類方法名

呼叫/訪問規則同樣遵循訪問修飾符的訪問許可權和範圍!下面是一段測試程式碼,供學習和思考:

package com。lww。study_static_;public class StaticMethodDetail { public static void main(String[] args) { D。hi(); //非靜態方法,不能透過類名呼叫 //D。say();//error,需要先建立物件,再透過物件呼叫 new D()。say(); new D()。ok(); }}class D { private int n1 = 100; private static int n2 = 200; public void say() { //非靜態方法 } public static void hi() { //靜態方法 //類方法中不允許使用和物件有關的關鍵字, // 比如this和super,普通方法(成員方法)可以呼叫 //System。out。println(this。n1);//error } //類方法(靜態方法)中,只能訪問靜態變數 或者 靜態方法 //即靜態方法中只能訪問靜態成員 public static void hello() { System。out。println(n2); System。out。println(D。n2); //System。out。println(this。n2);//error hi(); //say();//error } //普通成員方法,既可以訪問非靜態成員,也可以訪問靜態成員 public void ok() { //非靜態成員 System。out。println(n1++); System。out。println(this。n1); say(); //靜態成員 System。out。println(n2); hello(); }}

常見使用場景

當方法中不涉及到任何和物件相關的成員時,可以將方法設計成靜態方法,提高開發效率,比如util中的Math類、Array類中的方法很多都是設計為靜態方法,他們都是可以直接透過 類名。類方法名 呼叫,避免建立物件的消耗

在程式設計師實際開發過程中,往往會將一些通用的方法,設計成靜態方法,這樣我們不需要建立物件就可以使用了,比如列印一堆陣列,氣泡排序,完成某個計算任務等

類方法的細節總結

類方法和普通方法都是隨著類的載入而載入,將結構資訊儲存在方法區

類方法中無this的引數,普通方法中隱含著this的引數

類方法可以透過類名呼叫,也可以透過物件名呼叫

普通方法和物件有關,需要透過物件名呼叫,不能透過類名呼叫

類方法中不允許使用和物件有關的關鍵字,比如this和super 。普通方法可以

類方法(靜態方法)中只能訪問靜態成員,即只能 靜態變數 或者 靜態方法

普通成員方法,既可以訪問 非靜態成員,也可以訪問 靜態成員

main方法語法

深入理解main方法

main方法的形式:

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

main方法是由虛擬機器呼叫的

Java虛擬機器需要呼叫main()方法,所以該方法的訪問許可權必須是public

Java虛擬機器在執行main()方法時不必建立物件,所以該方法必須是static修飾的

該方法接收String型別的陣列引數,該陣列中儲存執行java命令時傳遞給所執行的類的引數

java 執行的程式 引數1 引數2 引數3……引數由args陣列接收

main()方法屬於靜態方法,所以在main()方法中,可以直接呼叫main所在類的靜態方法或者靜態屬性,但是不能訪問該類中的非靜態成員,必須建立該類的例項物件後,才可以透過物件去訪問,下面是一段測試程式碼:

import sun。applet。Main;public class Main01 { //靜態的變數/屬性 private static String name = “憨憨”; //非靜態的變數/屬性 private int n1 = 10000; //靜態方法 public static void hi() { System。out。println(“Main01的 hi方法”); } //非靜態方法 public void cry() { System。out。println(“Main01的 cry方法”); } public static void main(String[] args) { //可以直接使用name, //1。 靜態方法main 可以訪問本類的靜態成員 System。out。println(“name = ” + name); hi(); //2。 靜態方法main 不可以訪問本類的非靜態成員 //System。out。println(n1);//error //cry();//error //3。 靜態方法main 要訪問本類的非靜態成員,必須要先建立物件,再呼叫即可 Main01 main01 = new Main01(); System。out。println(main01。n1); main01。cry(); }}

關於args陣列,這裡也可以透過下面的操作進行演示,在IDEA中執行下面程式碼:

package com。lww。study_main_;public class Main02 { public static void main(String[] args) { for (int i = 0; i < args。length; i++) { System。out。println(“args[” + i + “] = ” + args[i]); } }}

我們會發現沒有任何輸出結果,那是因為我們還沒有給執行過程傳遞引數,透過下面步驟設定執行該程式碼時要傳遞的引數

類變數、類方法(static在類中的用法)及main函式細節

如果沒有顯示有Main02,可以先執行一遍再設定,點選進去後出現以下介面

類變數、類方法(static在類中的用法)及main函式細節

在Program arguments欄輸入要傳遞的執行引數,比如我這裡輸入的是北京 上海 西安,最後Apply後OK退出該介面,重新執行程式碼,會發現輸出以下結果

類變數、類方法(static在類中的用法)及main函式細節

當然這部分內容瞭解一下即可,實際開發過程中不需要我們去傳遞引數,我們還是要了解一下有這麼個內容即可!

喜歡的話,記得點贊,關注+轉發!!!