⑴ 類中靜態方法和實例方法的區別
靜態方法依賴於類,通過類.靜態方法調用;實例方法依賴於類的對象,需要創建對象後,對象.實例方法使用
實例方法內部不能定義靜態變數,會出現編譯錯誤;實例方法可以直接調用靜態方法;靜態方法內部可以定義和使用實例變數,靜態方法無法直接調用實例方法(因靜態方法載入時類還沒有實例化,實例方法依賴於類的對象)
一般認為靜態方法常駐內存,實例方法只有在使用時才分配內存。但事實上,是一樣的,都是在類被載入時常駐內存。static方法和non-static方法在創建實例對象時,屬性的值對各個對象各不相同(每個實例對象的所有欄位在內存中有一個拷貝,用於區分操作哪個對象的欄位),new一個實例時,會把實例屬性放在GCHeap裡面,同時new的對象放在堆棧上,堆棧指針指向剛才拷貝的的內存地址;而靜態方法中的靜態欄位只有一份;對於static和non-static方法代碼都是一樣的,所以只需要一份代碼,佔用一份內存空間。調用速度上因實例方法需要實例化分配內存,靜態方法則不用,故靜態方法會快一點,但也可忽略不計
早期結構化編程幾乎所有方法都是靜態方法,引入實例化方法的概念是在面向對象概念出現以後,區分靜態方法和實例方法不能單單從性能上理解。創建c++、java、c#這樣面向對象語言的大師引入實例化方法一定不是要解決什麼性能、內存的問題,而是為了讓開發更加模式化、面向對象化。這樣說的話,靜態方法和實例化方式的區分是為了解決模式的問題
靜態方法:一個方法與類的對象無關,如工具類等
實例方法:一個方法依賴於類的對象;多線程場景下,如果靜態方法中含有靜態變數,如果對靜態變數進行更改操作易造成線程安全問題
如果一個方法與對象的實例無關用靜態方法,反之採用實例方法,但如果方法和對象的實例有關,又想維護一份實例時,需要用單例模式。如系統運行時,需要載入一些的配置和屬性,是公共的,需要在整個生命周期存在,只需要一份就可以,但此時這些配置和屬性又是通過面向對象的編碼方式得到的,雖然用靜態方法也能解決,但最好的方式是採用單例模式
⑵ 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()方法是一個典型的靜態方法,它同樣遵循一般靜態方法的規則,所以它可以由系統在創建對象之前就調用。
⑶ java靜態方法(方法前冠以static)和實例方法(未冠以static)的區別
靜態方法(方法前冠以static)和實例方法(前面未冠以static)的區別
調用靜態方法或說類方法時,可以使用類名做前綴,也可以使用某一個具體的對象名;通常使用類名。
非static的方法是屬於某個對象的方法,而static的方法是屬於整個類的,不被任何一個對象單獨擁有;
由於static方法是屬於整個類的,所以它不能操縱和處理屬於某個對象的成員變數,而只能處理屬於整個類的成員變數,也即,static方法只能處理static域或靜態方法。實例方法可以訪問實例域, 靜態域或靜態方法, 記住都行。
聲明為static的方法有以下幾條限制: 1.它們僅能調用其他的static方法。
2.它們只能訪問static數據。
3.它們不能以任何方式引用this或super(關鍵 字super與繼承有關,在下一章中描述)。
static method Have No this Reference
All instance methods have a hidden parameter—this
So,
Static method can』t access instance methods and fields; it can only
invoke other static class
members.It can access class members only.
instance can use static method.
Instance methods:
If a method is declared without the static modifier keyword,
that method is known as an instance method. Instance methods
are associated with objects – not classes.
It can access either instance or class members.
本章源碼
class StaticExa {
static int a = 4;
static int b = 9;
static void call() {
System.out.println("a = " + a);//靜態方法可以訪問靜態屬性
}
}
public class Test {
static int c = 43;
public static void main(String args[]) {
/*剛運行到這一步時,debug觀察,StaticExa.a的值就等於42,Test.c的值就等於43,
說明系統在我們的程序一開始時,就會給所有的類變數賦值。如果是對象參考, 就是null,
見photoshop的例子*/
。。。。。。。。。。。。。。。。詳情網上找「馬克-to-win」,參考他的網站或他的網路空間:java第2章的內容
⑷ Java靜態方法和實例方法在內存的分布情況
像類、靜態(static)變數還有代碼塊都存儲在方法區里,棧中存儲的是靜態方法、實例方法和變數,堆中存儲的是實例對象和實例變數。
⑸ java 調用靜態方法和實例方法的區別
在外部調用靜態方法時,可以使用"類名.方法名"的方式,也可以使用"對象名.方法內名"的方式。而實例容方法只有後面這種方式。也就是說,調用靜態方法可以無需創建對象。
靜態方法在訪問本類的成員時,只允許訪問靜態成員(即靜態成員變數和靜態方法),而不允許訪問實例成員變數和實例方法;實例方法則無此限制。
⑹ Java中靜態方法和實例方法的區別
從使用上來來說,主要有源3點區別: 1、在外部調用靜態方法時,可以使用"類名.方法名"的方式,也可以使用"對象名.方法名"的方式。而實例方法只有後面這種方式。也就是說,調用靜態方法可以無需創建對象。 2、靜態方法在訪問本類的成員時
⑺ java靜態方法和實例方法的區別
靜態方法是用來操作這個類型的,方法被該類的所有實例共享。
而實例方內法用來操作容單個實例,不被該類所有實例共享。
靜態方法中不能調用實例方法,也不能訪問實例變數。
實例方法可以調用靜態方法,也能訪問靜態變數。
總之靜態方法對應的是類型,即Class,類。但是實例方法對應的是實例,即object,對象。
⑻ java 靜態方法和實例方法的區別
調用靜態方法,以"類名.方法名"的形式,或者用"對象名.方法名"的形式。
但是實例方法只有後面方式
靜態方法只允許訪問靜態成員。