類與對象
面向對象的編程思想力圖在程序中對事物的描述與該事物在現實中的形態保持一致。為了做到這一點,面向對象的思想中提出了兩個概念,即類與對象。其中,類是對某一類事物的抽象描述,而對象用於表示現實中該事物的個體。
- 對象:對象是類的一個實例(對象不是找個女朋友),有狀態和行為。例如,一條狗是一個對象,它的狀態有:顏色、名字、品種;行為有:搖尾巴、叫、吃等。
- 類:類是一個模板,它描述一類對象的行為和狀態。
下圖中男孩(boy)、女孩(girl)為類(class),而具體的每個人為該類的對象(object):

一、類的定義
在面向對象的思想中最核心的就是對象,為了在程序中創建對象,首先需要定義一個類。類是對象的抽象,它用於描述一組對象的共同特征和行為。類中可以定義成員變量和成員方法,其中成員變量用於描述對象的特征,也被稱為屬性,成員方法用於描述對象的行為,可簡稱為方法。

范例:Person類
1 public class Person { 2 //定義int類型的變量age 3 int age; 4 //定義speak方法 5 void speak(){ 6 System.out.println("大家好,我今年" + age +"歲!"); 7 } 8 }
Person是類名,age是成員變量,speak()是成員方法。在成員方法speak()中可以直接訪問成員變量age。
一個類可以包含以下類型變量:
- 局部變量:在方法、構造方法或者語句塊中定義的變量被稱為局部變量。變量聲明和初始化都是在方法中,方法結束后,變量就會自動銷毀。
- 成員變量:成員變量是定義在類中,方法體之外的變量。這種變量在創建對象的時候實例化。成員變量可以被類中方法、構造方法和特定類的語句塊訪問。
- 類變量:類變量也聲明在類中,方法體之外,但必須聲明為 static 類型。

在speak()方法中有一條打印語句,訪問了變量age,此時訪問的是局部變量。
二、對象的創建與使用
應用程序想要完成具體的功能,僅有類是遠遠不夠的,還需要根據類創建實例對象,
對象是根據類創建的。在Java中,使用關鍵字 new 來創建一個新的對象。創建對象需要以下三步:
- 聲明:聲明一個對象,包括對象名稱和對象類型。
- 實例化:使用關鍵字 new 來創建一個對象。
- 初始化:使用 new 創建對象時,會調用構造方法初始化對象。
對象的定義:
一個類要想真正的進行操作,則必須依靠對象,對象的定義格式如下:

如果要想訪問類中的屬性或方法(方法的定義),則可以依靠以下的語法形式:
訪問類中的屬性:對象.屬性 ;
調用類中的方法:對象.方法();
1 public class Example { 2 public static void main(String[] args) { 3 Person p1 = new Person(); //創建第一個Person對象 4 Person p2 = new Person(); //創建第二個Person對象 5 p1.age = 18; //為age屬性賦值 6 //調用對象的speak()方法 7 p1.speak(); 8 p2.speak(); 9 } 10 }
運行結果:

通過p1.age =18將p1對象的age屬性賦值為18,但並沒有對p2對象的age屬性賦值,所以會按成員變量類型的初始值進行賦值。

注意:局部變量必須初始化,即賦值,才能使用(它沒有默認值)
三、類的設計
在Java中,對象都是通過類創建出來的。因此,在程序設計時,最重要的就是類的設計。
假設在程序中描述一個學校所有學生的信息,可以先設計一個學生類(Student),在這個類中定義兩個屬性name和age分別表示學生的姓名和年齡,定義一個方法introduce()表示學生做自我介紹。
1 public class Student { 2 String name; 3 int age; 4 public void introduce(){ 5 //打印屬性name和age的值 6 System.out.println("大家好,我叫" + name +",我今年"+age +"歲!"); 7 } 8 }
針對設計的Student類創建對象,並訪問該對象的成員
1 public class Example { 2 public static void main(String[] args) { 3 Student stu = new Student(); //創建學生對象 4 stu.name ="張三";//為name屬性賦值 5 stu.age = -18; //為age屬性賦值 6 //調用對象的introduce()方法 7 stu.introduce(); 8 } 9 }
運行結果:

將年齡賦值為一個負數-18,這在程序中不會有任何問題,但在現實生活中明顯是不合理的。為了解決年齡不能為負的問題,在設計一個類時,應該對成員變量的訪問做出一些限定,不允許外界隨意訪問,這就需要實現類的封裝。
四、類的封裝
所謂類的封裝是指在定義一個類時,將類中的屬性私有化,即用private關鍵字來修飾,有屬性只能在它所在類中被訪問。為了能讓外界訪問私有屬性,需要提供一些public修飾的公共方法,其中包括用於獲取屬性值的getXxx()方法和設置屬性值的setXxx()方法。
1 public class Student { 2 private String name; 3 private int age; 4 5 //下面是公有的getXxx()和setXxx()方法 6 public String getName() { 7 return name; 8 } 9 10 public void setName(String name) { 11 this.name = name; 12 } 13 14 public int getAge() { 15 return age; 16 } 17 18 public void setAge(int age) { 19 //下面是對傳入的參數進行檢查 20 if (age <= 0){ 21 System.out.println("年齡不合法!"); 22 }else { 23 this.age = age; 24 } 25 } 26 27 public void introduce(){ 28 //打印屬性name和age的值 29 System.out.println("大家好,我叫" + name +",我今年"+age +"歲!"); 30 } 31 } 32 33 class Example { 34 public static void main(String[] args) { 35 Student stu = new Student(); //創建學生對象 36 stu.setName("張三"); //為name屬性賦值 37 stu.setAge(-18); //為age屬性賦值 38 //調用對象的introduce()方法 39 stu.introduce(); 40 } 41 }
運行結果:

在上面的Student類中,使用private關鍵字將屬性name和age聲明為私有,對外界提供了幾個公有的方法,其中getName()方法用於獲取name屬性的值,setName()用於設置name屬性的值;同理,getAge()和setAge()用於獲取和設置age屬性的值。在main()方法中創建Student對象,並調用setAge()方法傳入一個負數-18,在setAge()方法中會對參數setAge的值進行檢查,由於當前傳入的值小於0,因此會打印“年齡不合法!”的 信息,age的屬性沒有被賦值,仍為默認值0。
