[轉]Java靜態方法為什么不能訪問非靜態方法


非靜態方法(不帶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對象,而是通過類名調用該類的靜態方法也可以。

 

程序最終都是在內存中執行,變量只有在內存中占有一席之地時才會被訪問,類的靜態成員(變態和方法)屬於類本身,在類加載的時候就會分配內存,可以 通過類名直接去訪問,非靜態成員(變量和方法)屬於類的對象,所以只有在類的對象禪師(創建實例)的時候才會分配內存,然后通過類的對象去訪問。

在一個類的靜態成員中去訪問非靜態成員之所以會出錯是因為在類的非靜態成員不存在的時候靜態成員就已經存在了,訪問一個內存中不存在的東西當然會出錯。

那類是什么時候被加載呢?在需要調用的時候被加載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM