Java中static方法和普通方法的區別
阿新 • • 發佈:2018-12-12
在類中使用static修飾的靜態方法會隨著類的定義而被分配和裝載入記憶體中;而非靜態方法屬於物件的具體例項,只有在類的物件建立時在物件的記憶體中才有這個方法的程式碼段。
注意:非靜態方法既可以訪問靜態資料成員 又可以訪問非靜態資料成員,而靜態方法只能訪問靜態資料成員;
非靜態方法既可以訪問靜態方法又可以訪問非靜態方法,而靜態方法只能訪問靜態資料方法。
原因:因為靜態方法和靜態資料成員會隨著類的定義而被分配和裝載入記憶體中,而非靜態方法和非靜態資料成員只有在類的物件建立時在物件的記憶體中才有這個方法的程式碼段。
引用靜態方法時,可以用類名.方法名或者物件名.方法名的形式。
對以上描述進行驗證的程式碼示例(小樹親測):
import java.util.*;
public class TestStatic {
public static void main(String[]args){
System.out.println(S.getStatic());//使用類名加字首訪問靜態方法
S s=new S();
System.out.println(s.getStatic());//使用例項化物件名訪問靜態方法
System.out.println(s.get());
}
public static class S
{
private static int a;
private int t=0;
//靜態初始器:由static和{}組成,只在類裝載的時候(第一次使用類的時候)執行一次,往往用來初始化靜態變數。
static{
a=10;
}
//靜態方法只能訪問靜態資料成員
public static int getStatic()
{
return a;
}
public int getT()
{
return t;
}
//非靜態方法可以訪問靜態方法和非靜態方法
public int get()
{
getT();
getStatic();
t=a;//非靜態方法可以訪問非靜態資料成員和靜態資料成員
return t;
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
總結: (1)static修飾的靜態方法會隨著類的定義而被分配和裝載入記憶體中,編譯器只為整個類建立了一個靜態變數的副本,也就是隻分配一個記憶體空間,雖然可能有多個例項,但這些例項共享該記憶體,特別值得注意的是,任何一個物件對靜態資料成員的修改,都會影響其它物件。 (2)靜態不能引用非靜態這一特性,是由於靜態的會隨著類的定義而被分配和裝載入記憶體中這一關鍵點決定的;如果靜態引用了非靜態的,根本無法從記憶體中找到非靜態的程式碼段,勢必會出錯,這種做法是Java虛擬機器決不允許的。
大家有什麼疑問歡迎在下方評論留言給我,小樹會在第一時間回覆的。
<script>
(function(){
function setArticleH(btnReadmore,posi){
var winH = $(window).height();
var articleBox = $("div.article_content");
var artH = articleBox.height();
if(artH > winH*posi){
articleBox.css({
'height':winH*posi+'px',
'overflow':'hidden'
})
btnReadmore.click(function(){
articleBox.removeAttr("style");
$(this).parent().remove();
})
}else{
btnReadmore.parent().remove();
}
}
var btnReadmore = $("#btn-readmore");
if(btnReadmore.length>0){
if(currentUserName){
setArticleH(btnReadmore,3);
}else{
setArticleH(btnReadmore,1.2);
}
}
})()
</script>
</article>