代碼:
public class D2 { int age=5; static int a=1; public static void play() { a=2; //age=7; 無法通過編譯, 靜態方法無法直接訪問類的實例成員(即不加static) System.out.println(new D2().age); //在靜態方法中訪問類的實例成員需首先進行類的實例化,輸出。 } public void play1() { a=3; } public static void main(String[] args) { D2 d=new D2(); System.out.println(d.age); //輸出非靜態成員 d.play(); System.out.println(a); //經過靜態方法改變靜態成員的值 d.play1(); System.out.println(a); //經過非靜態方法改變靜態成員的值 } }
類中靜態的方法或者屬性,本質上來講並不是該類的成員,在java虛擬機裝在類的時候,這些靜態的東西已經有了對象,它只是在這個類中"寄居",不需要通過類的構造器(構造函數)類實現實例化;而非靜態的屬性或者方法,在類的裝載是並沒有存在,需在執行了該類的構造函數后才可依賴該類的實例對象存在。
在外部調用靜態方法時,可以使用"類名.方法名"的方式,也可以使用"對象名.方法名"的方式。而實例方法只有后面這種方式。也就是說,調用靜態方法可以無需創建對象。
靜態方法在訪問本類的成員時,只允許訪問靜態成員(即靜態成員變量和靜態方法),而不允許訪問實例成員變量和實例方法;實例方法則無此限制。
本文參考https://www.cnblogs.com/leity/p/9824065.html