學習Java中的類要有物件導向的思想,“一切皆對象”。物件導向要和面向過程區分開來。類是對現實事物的一種概念的抽象。用來表現某種具體事物的類,稱之為實體類。一個類中所包含的成員有成員變數和成員方法。其中類的成員變數有靜態變數和執行個體變數兩種,類的成員方法有構造方法、靜態方法(含靜態主方法)和一般的方法(主要有對成員變數的set和get方法,以及一些行為動作)。
類是具體對象產生的一個模板,而對象是類的一個具體執行個體。
區分靜態變數和執行個體變數:
靜態變數被static關鍵字修飾,也叫類變數,屬於類的,而不屬於某個執行個體對象。只要順序載入了類的位元組碼,不用建立任何執行個體對象,靜態變數就會被分配空間,就可以使用它了,存放在靜態區裡,可以被類的對象共用。靜態變數的生命週期同類的生命週期一樣,一般使用類名來調用,使用對象來調用也可以,不過不推薦使用。靜態成員變數在類中使用時可以不先初始化,類會直接預設給它初始化。
執行個體變數是屬於某個對象的屬性,必須建立了執行個體對象才會被分配空間,才能使用這個執行個體變數,存放在堆區。執行個體變數取決於類的執行個體,每建立一個執行個體,Java虛擬機器就會為執行個體變數分配一次記憶體,其生命週期取決於執行個體的生命週期。
構造方法的特點及其作用:
(1)構造方法的特點:
A.構造方法的方法名一定要和我們的類型一定要一致。構造方法是一個特殊的方法。
B.構造方法沒有傳回型別,自然沒有傳回值,當然在構造方法中不能使用return。
C.構造方法可以由系統提供一個預設的構造方法。
D.構造方法不需要對象去調用,在我們執行個體化對象時,系統會幫我們去執行構造方法。
(2)構造方法的作用:
A.向堆區申請用來存放該類對象的記憶體(一個類一旦設計完成之後,其執行個體所佔有的記憶體大小就確定了)。
B.對於類中的所有成員資料進行初始化(賦值)。成員資料可劃分為基本類型和參考型別,其中所有的參考型別的零值都是null。
C.構造一個該類的執行個體,即構造對象---這才是最後一步。
對類中無參構造方法的理解:
無參構造方法在類中不是顯示存在的,其樣式是固定的: public className{}在沒有任何構造方法的情況下,這個構造方法會由編譯器自動提供;當在類中定義了任何一個構造方法,則預設的這個構造方法就不複存在了。想讓一個類中具有多個構造方法,每個構造方法都要顯式提供出來。這樣多個構造方法形成了重載。
eg:建立一個Person類,有姓名和年齡兩個屬性,有兩個構造方法(一個無參和一個有參),有一個行為方法eat().
public class TestPerson{public static void main(String[] args){Person p1 = new Person(); //調用無參構造,屬性自動初始化System.out.println("count的值:"+Person.count);Person p2 = new Person("小明",2);System.out.println("count的值:"+Person.count);System.out.println("p1對象的內容:"+p1.getName()+","+p1.getAge());System.out.println("p2對象的內容:"+p2.getName()+","+p2.getAge()); p1.eat(); p2.eat();}}class Person{private String name; //姓名屬性private int age; //年齡屬性static int count; //靜態變數,用來統計對象數(類中預設初始化)public Person(){System.out.println("調用無參構造");count++;}public Person(String name,int age){this.name = name;this.age = age; System.out.println("調用有參構造") ; count++;}public String getName(){ return name;} public int getAge(){return age;} public void setName(String name){ this.name = name; } public void setAge(int age){ this.age = age; } public void eat(){ System.out.println(name+"吃東西"); }}
下面進行記憶體分析:
運行結果為:
調用無參構造 Count的值:1 調用有參構造 Count的值:2 P1對象的內容:null,0 P2對象的內容:小明,2 Null吃東西 小明吃東西 |