1. 程式人生 > >Java使用static的方法和類與不使用的區別

Java使用static的方法和類與不使用的區別

一、靜態變數與例項變數的區別(對於常量和變數而言):

1. 區域性變數:

區域性變數是類的方法中的變數;

2. 例項變數:

例項變數也是類中獨立於方法之外的變數,不過沒有static修飾,也叫 物件變數

3. 類變數(靜態變數):

類變數是類中獨立於方法之外的變數,用static 修飾,也叫 靜態變數

package static_study;

/**
 * Created by Taoyongpan on 2017/5/3.
 */
public class Test {
    static String ss ;//類變數、靜態變數
    String s;//例項變數
    public static void main(String[] args)
    {
        String is ;//區域性變數
    }
}

 4.例項變數與靜態變數的區別:

       靜態變數也叫類變數,這種變數前加了static修飾符。可以直接用類名呼叫,也可以用物件呼叫,而且所

有物件的同一個類變數 都是共享同一塊記憶體空間。

        例項變數也叫物件變數,這種變數沒有加static修飾符。只能通過物件呼叫, 而且所有物件的同一個例項

變數是共享不同的記憶體空間的。

       靜態變數是所有物件共有的,某一個物件將它的值改變了,其他物件再去獲取它的值,得到的是改變後

的值;

       例項變數則是每一個物件私有的,某一個物件將它的值改變了,不影響其他物件取值的結果,其他物件

仍會得到例項變數一開始就被賦予的值。

package static_study;

/**
 * Created by Taoyongpan on 2017/5/3.
 */
public class Test02 {
    static int a = 0;
    int b = 0;
}

class test03{
    public static void main(String[] args){
        Test02 t1 = new Test02();
        Test02 t2 = new Test02();
        t1.a = 2;
        t1.b = 3;
        System.out.println(t2.a);//輸出結果是2,靜態變數是針對所有物件的,所以a1改變a,a2的a也改變
        System.out.println(t2.b);//輸出結果是0,例項只改變自身的,所以a1物件的b改變,不影響物件a2的b變數
    }
}

        解釋(一) :  在建立例項物件的時候,記憶體中會為每一個例項物件的每一個非靜態成員變數開闢一段內

存空間,用來儲存這個物件所有的非靜態成員變數值。即使兩個不同的例項物件是屬於同一個類,它們的同

名非靜態成員變數在記憶體中佔用的空間是不同的。 

       靜態成員變數有所不同。所有的例項物件都共用一個靜態變數,記憶體中只有同一處空間存放這個靜態變

量值的。因此,如果一個物件把靜態變數值改了,另外一個物件再取靜態變數值就是改過之後的值了。

      解釋(二):類的靜態變數在記憶體中只有一個,java虛擬機器在載入類的過程中為靜態變數分配記憶體,靜態

變數位於方法區,被類的所有例項共享。靜態變數可以直接通過類名進行訪問,其生命週期取決於類的生命

週期。

       而例項變數取決於類的例項。每建立一個例項,java虛擬機器就會為例項變數分配一次記憶體,例項變數位於

堆區中,其生命週期取決於例項的生命週期。

二、靜態方法和非靜態方法的區別(對於方法而言):

● 生命週期(Lifecycle):

     靜態方法(Static Method)與靜態成員變數一樣,屬於類本身,在類裝載的時候被裝載到記憶體(Memory),不自動進行銷燬,會一直存在於記憶體中,直到JVM關閉。

     非靜態方法(Non-Static Method)又叫例項化方法,屬於例項物件,例項化後才會分配記憶體,必須通過類的例項來引用。不會常駐記憶體,當例項物件被JVM 回收之後,也跟著消失。 

● 在記憶體中儲存位置

     靜態方法和靜態變數建立後始終使用同一塊記憶體,是連續的。

     非靜態方法會存在於記憶體的多個地方,是離散的。

● 效率

      靜態方法的使用效率比非靜態方法的效率高。

● 執行緒安全

     靜態方法是共享程式碼段,靜態變數是共享資料段。既然是“共享”就有併發(Concurrence)的問題。

非靜態方法是針對確定的一個物件的,所以不會存線上程安全的問題。

● 使用範圍

     靜態方法:⒈ 有靜態屬性的類,一般會定義靜態方法。⒉ 沒有屬性的類,一般會定義靜態方法。⒊ 如果一個方法與他所在類的例項物件無關,那麼它就應該是靜態的。靜態方法可以被繼承但是不能被覆蓋

●  總計

     如果靜態方法在系統中定義太多,會佔用大量的資源,最後造成記憶體溢位,所以靜態方法不能濫用。如果從執行緒安全、效能、相容性上來看,選用例項化方法為宜。

三、靜態工廠和構造器(對於類而言):

.主要優點:

①靜態工廠方法與構造器不同的第一大優勢在於,他們有名稱。

②靜態工廠方法與構造器不同的第二大優勢在於,不必每次呼叫他們的時候都建立一個新物件。

③靜態工廠方法與構造器不同的第三大優勢在於,他們可以返回型別的任何子型別的物件。

④靜態工廠方法與構造器不同的第四大優勢在於,在建立引數化型別例項的 時候,他們使程式碼變得更加簡潔。

.主要缺點:

①類如果不含共有的或者受保護的構造器,就不能被子類化;

②他們與 其他的靜態方法實際上沒有任何區別。