我們知道如果一個類有被建立實體,一定會走建構式方法來建立實體。
所以設計以下程式碼測試
public class MainTest {
//main方法,程式入口
public static void main(String[] args) {
System.out.println("main方法入口");
}
//建構式
MainTest(){
System.out.println("建立MainTest實體");
}
}
結果:

程式運行過程:
1. main方法走 System.out.println("main方法入口")
2. 結束!!
所以在進入main方法時並不會建立MainTest實體
2. 測試在Main方法中new一個自己的類 (MainTest)
public class MainTest {
//main方法,程式入口
public static void main(String[] args) {
System.out.println("main方法入口");
MainTest mt = new MainTest();
}
//建構式
MainTest(){
System.out.println("建立MainTest實體");
}
}
結果:

程式碼運行過程:
1.main方法走System.out.println("main方法入口")
2.建立MainTest實體,走MainTest建構方法
3. 靜態方法無法調用非靜態變量、非靜態方法
public class MainTest {
static boolean a;//靜態變量
boolean b;//成員變量
//main方法,程式入口
public static void main(String[] args) {
test();
//test2();//不可調用非靜態方法
System.out.println(a);
//System.out.println(b);//不可調用非靜態變數
}
static void test(){
System.out.println("Hi! this is testing");
}
void test2(){
System.out.println("Hi! this is testing");
}
}
其實這跟"static"修飾詞有關,首先JAVA變量有三種
靜態變量: 有static修飾詞,獨立於方法外。
成員變量: 沒有static修飾詞,獨立於方法外。
局部變量: 於類的方法中的變量,其變量周期。
JVM在載入類的時候只會為靜態變量配置一次記憶體,載入類的過程中完成靜態變數的記憶體分配,調用時可以用"類名"直接訪問;而成員變量則會在"類實例化"時才會配置一次記憶體,並且多個類就會有多份,彼此不相影響。
類可以有兩種形式的方法:靜態方法(類方法)、非靜態方法(實例方法)。
當調用類的"靜態方法"時,類的"實例"可能尚不存在(尚未new類的實體),因此不允許從靜態方法中引用實例變量。
總結
main方法帶有static修飾詞,依JVM配置邏輯,在加載類的過程並不會實例化該類(雖然main寫在那個類上)
靜態方法是屬於"類"的方法,而不是屬於實體,JVM在加載類的時候就會生成一份。因此直接透過"類名"就可以直接調用靜態方法。Math.random()就是一個靜態方法。
靜態方法不可以使用"非靜態變數",同理也不可以透過"this"或"super"來調用實例變數
水拉!寫很棒。只是我看不太懂(我較沒觀念,而且不會寫JAVA