java靜態與非靜態
1. java中靜態方法與非靜態方法的區別
靜態方法和實例方法的區別主要體現在兩個方面:
在外部調用靜態方法時,可以使用"類名.方法名"的方式,也可以使用"對象名.方法名"的方式。而實例方法只有後面這種方式。也就是說,調用靜態方法可以無需創建對象。
靜態方法在訪問本類的成員時,只允許訪問靜態成員(即靜態成員變數和靜態方法),而不允許訪問實例成員變數和實例方法;實例方法則無此限制。
下面幾個例子展示了這一區別。
1、調用靜態方法示例。
//-----------文件名hasStaticMethod.java,程序編號1-----------------public class hasStaticMethod{//定義一個靜態方法public static void callMe(){System.out.println("This is a static method.");}}
下面這個程序使用兩種形式來調用靜態方法。
//-----------文件名invokeStaticMethod.java,2-----------------public class invokeStaticMethod{public static void main(String args[]){hasStaticMethod.callMe(); //不創建對象,直接調用靜態方法 hasStaticMethod oa = new hasStaticMethod(); //創建一個對象oa.callMe(); //利用對象來調用靜態方法}}
程序3.36兩次調用靜態方法,都是允許的,程序的輸出如下:
This is a static method.This is a static method.
允許不創建對象而調用靜態方法,是Java為了減少程序員調用某些常用方法時的麻煩,而允許程序員按照傳統的C語言中使用函數的方式來使用方法。典型的例子是前面某些程序中使用"Math.ramdon()"來獲取隨機數。
2、靜態方法訪問成員變數示例。
//-----------文件名accessMember.java,程序編號3.37-----------------class accessMember{private static int sa; //定義一個靜態成員變數private int ia; //定義一個實例成員變數//下面定義一個靜態方法static void statMethod(){int i = 0; //正確,可以有自己的局部變數sa = 10; //正確,靜態方法可以使用靜態變數otherStat(); //正確,可以調用靜態方法ia = 20; //錯誤,不能使用實例變數insMethod(); //錯誤,不能調用實例方法}static void otherStat(){} //下面定義一個實例方法 void insMethod(){int i = 0; //正確,可以有自己的局部變數sa = 15; //正確,可以使用靜態變數ia = 30; //正確,可以使用實例變數statMethod(); //正確,可以調用靜態方法}}
本例其實可以概括成一句話:靜態方法只能訪問靜態成員,實例方法可以訪問靜態和實例成員。之所以不允許靜態方法訪問實例成員變數,是因為實例成員變數是屬於某個對象的,而靜態方法在執行時,並不一定存在對象。同樣,因為實例方法可以訪問實例成員變數,如果允許靜態方法調用實例方法,將間接地允許它使用實例成員變數,所以它也不能調用實例方法。基於同樣的道理,靜態方法中也不能使用關鍵字this。
main()方法是一個典型的靜態方法,它同樣遵循一般靜態方法的規則,所以它可以由系統在創建對象之前就調用。
2. Java中為什麼要有靜態方法 和非靜態方法之分
站在「面向對象」的角度,static,也就是你說的靜態,是為了保持共性,大傢伙都用一個,而非靜態就是為了保持個性,這個個性需要使用實例來完成。例如
class Dog{
private static String color;
public static String getColor(){
return color;
}
}
這時候,Dog的color就只有共性,都是某種顏色,你想現實中Dog的顏色可能會有多種,要更加符合現實的話,這個修飾color的static最好是去掉,方法也是如此。在java中方法有一個更好的取名——行為,欄位也叫——屬性。使用靜態方法更多的用的是共性,她不需要個性,就像工具類中的對外提供的方法(API)一樣都是靜態的,而我們的一般類,都是為了保持個性而使用非靜態方法的。C語言中的確不需要這么考慮。
3. 什麼是Java語言中所說的非靜態方法,它和靜態方法有何區別
非靜態方法是相對於靜態方法來說的。靜態方法使用static關鍵字來標示,非靜態方法沒有此關鍵字。
他們之間最大的區別在於它們生命周期的不同,靜態方法屬於全局方法,當靜態方法第一次被訪問的時候,就將常駐內存直到整個系統被銷毀;而非靜態方法則與類有關,只有該方法所在的類被實例化之後,該方法才能被訪問,類被銷毀的同時方法也被銷毀。生命周期的不同決定了它們的調用方式的不同,靜態方法使用(類名.方法名)來調用,而非靜態方法則需要(new類名().方法名)來調用。
同時與之相關的就是,靜態方法不能調用非靜態方法和屬性。在了解了它們生命周期的不同後,這一點也比較好理解,因為靜態方法生命周期比非靜態方法和屬性長,當調用非靜態方法和屬性時就會產生非靜態方法和屬性已經被銷毀的情況導致程序出錯。
4. java 靜態類和非靜態類的區別
靜態類和非靜態類的主要區別:
主要區別在於靜態類不能實例化,靜態類編譯器能夠執行檢查確保不是偶然的添加實例成員,C#編譯器會自動把它標記為sealed,靜態類中不能創建非靜態的方法,即靜態方法中只能創建靜態方法,但在非靜態類中可以調用靜態方法。
靜態類的主要特性:
1:僅包含靜態成員。
2:無法實例化。
3:是密封的。
4:不能包含實例構造函數。
5:非靜態類可以包含靜態的方法、欄位、屬性或事件;
6:靜態方法和屬性不能訪問其包含類型中的非靜態欄位和事件
7:靜態方法只能被重載,而不能被重寫,因為靜態方法不屬於類的實例成員;
8:C# 不支持靜態局部變數(在方法內部定義靜態變數)。
非靜態類在使用時必須要實例化,每次使用時都要進行實例化,一般情況下使用比較頻繁的類,可以使用靜態類,比如LogClass,ConfigClass等等。
5. java調用靜態方法和非靜態方法的區別
靜態方法從屬於類,非靜態方法屬於對象,靜態方法在類載入的時候就已經初始化了,而非靜態方法語言對象實例化之後才能初始化。
內存分析:靜態內存是指在程序開始運行時由編譯器分配的內存,它的分配是在程序開始編譯時完成的,不佔用CPU資源