非靜態方法(不帶static)可以訪問靜態方法(帶static),但是反過來就不行,為什么呢?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public
class
test{
public
void
static
main(String args[]){
method();
//會出錯,提示你講method方法改成靜態的
method2();
//調用方法正確
new
Test2().method();
//正確
}
public
void
method(){
System.out.println(
"HelloWorld"
);
}
public
static
void
method2(){
System.out.println(
"HelloWorld"
);
}
}
public
class
Test2{
public
void
method(){
System.out.println(
"HelloWorld"
);
}
}
|
這個要從java的內存機制去分析,首先當你New 一個對象的時候,並不是先在堆中為對象開辟內存空間,而是先將類中的靜態方法(帶有static修飾的靜態函數)的代碼加載到一個叫做方法區的地方,然后 再在堆內存中創建對象。所以說靜態方法會隨着類的加載而被加載。當你new一個對象時,該對象存在於對內存中,this關鍵字一般指該對象,但是如果沒有 new對象,而是通過類名調用該類的靜態方法也可以。
程序最終都是在內存中執行,變量只有在內存中占有一席之地時才會被訪問,類的靜態成員(變態和方法)屬於類本身,在類加載的時候就會分配內存,可以 通過類名直接去訪問,非靜態成員(變量和方法)屬於類的對象,所以只有在類的對象禪師(創建實例)的時候才會分配內存,然后通過類的對象去訪問。
在一個類的靜態成員中去訪問非靜態成員之所以會出錯是因為在類的非靜態成員不存在的時候靜態成員就已經存在了,訪問一個內存中不存在的東西當然會出錯。
那類是什么時候被加載呢?在需要調用的時候被加載。