java面向物件(上)--類與物件
類與物件
面向物件的程式設計思想力圖在程式中對事物的描述與該事物在現實中的形態保持一致。為了做到這一點,面向物件的思想中提出了兩個概念,即類與物件。其中,類是對某一類事物的抽象描述,而物件用於表示現實中該事物的個體。
- 物件:物件是類的一個例項(物件不是找個女朋友),有狀態和行為。例如,一條狗是一個物件,它的狀態有:顏色、名字、品種;行為有:搖尾巴、叫、吃等。
- 類:類是一個模板,它描述一類物件的行為和狀態。
下圖中男孩(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。