天天看點

靜态成員和執行個體成員

對象成員(執行個體成員):

 沒有加static修飾符的屬性和方法就是執行個體成員。執行個體成員每new一個對象都是建立一個記憶體位址,每個對象裡的執行個體成員指向的都是各自的記憶體位址。例如:

<a href="https://s4.51cto.com/wyfs02/M01/08/D3/wKiom1nnhVfC4qe0ABNODqooaiY591.png" target="_blank"></a>

  每個對象裡的執行個體成員指向的都是各自的記憶體位址,是以無論如何更改也不會影響到其他的對象執行個體屬性。

類成員(靜态成員):

  加上static修飾符的方法和屬性就是靜态成員。靜态成員的記憶體位址是共享的,每個對象裡的靜态成員指向的都是同一個。類每次加載都需要為類的成員也就是靜态成員配置設定記憶體,然後才進入main方法開始執行。例如一個Hello.java的類:

<a href="https://s2.51cto.com/wyfs02/M00/A7/82/wKioL1nngqmCbU4RAA7FfRT9GJo044.png" target="_blank"></a>

  類在java虛拟機内隻有一個模闆對象,隻會加載、初始化一次。在第一次new對象的時候會問這個類是否加載過了,如果加載過了的話就直接建立對象,沒有加載過的話,就先加載類,然後才建立對象。類隻會初始化一次,絕不會初始化兩次,因為類成員指向都是一個位址。

  靜态成員使用類名就可以通路,靜态成員不可以通路執行個體成員,因為類不知道會有多少個對象,執行個體成員則可以通路靜态成員,因為靜态成員隻有指向的是同一個記憶體位址。例如:

<a href="https://s1.51cto.com/wyfs02/M00/08/D3/wKiom1nnhWnx47SeABK0dbRwINU444.png" target="_blank"></a>

  靜态成員的記憶體位址隻有一個,無論是用類名通路的還是用對象通路的都是那一個記憶體位址,是以靜态成員的最終值才是它的值。

記憶體示意圖:

<a href="https://s1.51cto.com/wyfs02/M02/08/D3/wKiom1nnhXHQqZTXAA29j-kuFEQ498.png" target="_blank"></a>

構造器:

  構造器也稱之為構造函數、構造方法、初始化方法等,構造器沒有寫的情況下虛拟機會自動添加一個無參數的構造器,構造器必須與類名一直并且沒有傳回值。無參數構造器用于初始化方法和屬性。例如無參數構造器的寫法:

<a href="https://s3.51cto.com/wyfs02/M02/A7/82/wKioL1nngsvig7GoABWYG4lMc1s744.png" target="_blank"></a>

 構造器的大括号内可以寫任何代碼,和方法差不多。構造器就是new對象時所new的那個方法。也就是圖上的new Student();。

 有參數的構造器用于提供一些必要參數來進行初始化,在進行new對象的時候必須傳遞一個參數,才可以new對象,不然會報錯。

<a href="https://s1.51cto.com/wyfs02/M01/08/D3/wKiom1nnhY6CMHiIABWHpdYK9qk960.png" target="_blank"></a>

  有參數構造器一般在需要向構造器傳遞參數時使用,說白了就是new這個對象時需要一個條件,有參數構造器則可以用于提出這個條件,提出條件則new這個對象時就需要提供參數滿足這個條件才能建構成對象。

本文轉自 ZeroOne01 51CTO部落格,原文連結:http://blog.51cto.com/zero01/1974036,如需轉載請自行聯系原作者