靜態static方法中不能調用非靜態non-static方法,准確地說是不能直接調用non-static方法。但是可以通過將一個對象的引用傳入static方法中,再去調用該對象的non-static方法。
在主函數(static方法)中我們經常創建某個類的實例,再利用其引用變量調用它的非靜態方法。
//StaticMethodTest.java
//A ststic method cannot call a non-static method, but we can transfer a object reference, which include a non-static metho to the static method, thus, wo can call that non-static method in a indirect way.
//A ststic method cannot call a non-static method, but we can transfer a object reference, which include a non-static metho to the static method, thus, wo can call that non-static method in a indirect way.
public class StaticMethodTest{
void NonStaticMethod(){
System.out.println("This is a non-sataic method.");
}
static void StaticMethod(StaticMethodTest s){
System.out.println("This is a static method.");
s.NonStaticMethod();
}
static void StaticMethod(StaticMethodTest s){
System.out.println("This is a static method.");
s.NonStaticMethod();
}
public static void main(String[] args) {
StaticMethodTest sObj=new StaticMethodTest();
StaticMethod(sObj); //在主函數中可以直接調用靜態方法
}
}
StaticMethod(sObj); //在主函數中可以直接調用靜態方法
}
}
類的靜態成員(變量和方法)屬於類本身,在類加載的時候就會分配內存,可以通過類名直接去訪問;非靜態成員(變量和方法)屬於類的對象,所以只有在類的對象產生(創建類的實例)時才會分配內存,然后通過類的對象(實例)去訪問。
在一個類的靜態成員中去訪問其非靜態成員之所以會出錯是因為在類的非靜態成員不存在的時候類的靜態成員就已經存在了,訪問一個內存中不存在的東西當然會出錯:
而類又是在什么時候加載的呢?
由引導類加載器負責加載的核心類比如 String 類在 JVM 啟動時(main 方法開始執行前)就會被加載,其它類在使用前(new 它對象或調用其靜態方法訪問靜態域等等前)會被動態加載,要注意的是子類被加載前它的所有超類要根據由父到子的順序被逐一加載。
參考文檔:http://blog.csdn.net/zhouwubin123/article/details/6623308
