面向物件基礎——類與物件的定義
阿新 • • 發佈:2019-01-10
面向物件的概念
封裝性:對外部不可見。可以保護程式中的某些內容。
繼承性:擴充套件功能的。
類與物件的關係:
定義類和物件的方法?
類圖的畫法:Person類圖
分為三層:
第一層表示類的名稱,類的名稱與之前一樣要求開頭首字母大寫。
第二層表示屬性的定義,按照" 訪問許可權 屬性名稱:屬性型別 " 的格式定義;
第三層表示類中方法的定義,按照" 訪問許可權 方法名稱():方法返回值型別 " 的格式定義。如下圖所示:
類與物件的進一步研究
掌握Java中的記憶體劃分,java引用傳遞 以及垃圾的產生分析。重點:物件是儲存在記憶體之中的(指標/引用),屬性是儲存在堆記憶體之中;而方法是儲存在全域性程式碼區之中的,此區中的內容是所有的物件共享的。 注意:在使用物件的時候,物件必須被例項化後才可以使用(並不是單單指的是直接通過new關鍵字進行實現,只要有其堆記憶體的空間指向,則就表示例項化成功)。如果不進行例項化就會出現空指標異常。
此時出現了一個空指向異常。在引用操作中,如果一個物件沒有堆記憶體的引用,而呼叫了類中的屬性或方法,就會出現此問題。所謂的引用資料型別時間上傳遞的是堆記憶體的使用權,可以同時為一個堆記憶體空間定義多個棧記憶體的引用操作。
class Person{ String name ; // 宣告姓名屬性 int age ; // 宣告年齡屬性 public void tell(){ // 取得資訊 System.out.println("姓名:" + name + ",年齡:" + age) ; } }; public class ClassDemo05{ public static void main(String args[]){ Person per1 = null ; // 宣告per1物件 Person per2 = null ; // 宣告per2物件 per1 = new Person() ; // 只例項化per1一個物件 per2 = per1 ; // 把per1的堆記憶體空間使用權給per2 per1.name = "張三" ; // 設定per1中的name屬性內容 per1.age = 30 ; // 設定per1中的age屬性內容 // 設定per2物件的內容,實際上就是設定per1物件的內容 per2.age = 33 ; // 設定per2中的age屬性內容 System.out.print("per1物件中的內容 --> ") ; per1.tell() ; // 呼叫類中的方法 System.out.print("per2物件中的內容 --> ") ; per2.tell() ; // 呼叫類中的方法 } };
class Person{ String name ; // 宣告姓名屬性 int age ; // 宣告年齡屬性 public void tell(){ // 取得資訊 System.out.println("姓名:" + name + ",年齡:" + age) ; } }; public class ClassDemo06{ public static void main(String args[]){ Person per1 = null ; // 宣告per1物件 Person per2 = null ; // 宣告per2物件 per1 = new Person() ; // 例項化per1物件 per2 = new Person() ; // 例項化per2物件 per1.name = "張三" ; // 設定per1中的name屬性內容 per1.age = 30 ; // 設定per1中的age屬性內容 per2.name = "李四" ; per2.age = 33 ; // 設定per2中的age屬性內容 per2 = per1 ; // 把per1的堆記憶體空間使用權給per2 System.out.print("per1物件中的內容 --> ") ; per1.tell() ; // 呼叫類中的方法 System.out.print("per2物件中的內容 --> ") ; per2.tell() ; // 呼叫類中的方法 } };
以為per2改變了指向,所以其原本指向的記憶體空間沒有任何棧記憶體的引用,則這樣的記憶體就被稱為垃圾,等待垃圾回收機制進行回收。 GC:垃圾回收機制的簡稱。
封裝性:
封裝就是保護內容。 保證某些屬性或方法可以不被外部看見。 封裝的實現:class Person{
private String name ; // 宣告姓名屬性
private int age ; // 宣告年齡屬性
public void setName(String n){ // 設定姓名
name = n ;
}
public void setAge(int a){ // 設定年齡
if(a>=0&&a<=150){ // 加入驗證
age = a ;
}
}
public String getName(){ // 取得姓名
return name ;
}
public int getAge(){ // 取得年齡
return age ;
}
public void tell(){
System.out.println("姓名:" + name + ",年齡:" + age) ;
}
};
public class EncDemo04{
public static void main(String arsgh[]){
Person per = new Person() ; // 宣告並例項化物件
per.setName("張三") ; // 呼叫setter設定姓名
per.setAge(-30) ; // 呼叫setter設定年齡
per.tell() ; // 輸出資訊
}
};
Setter方法中加入驗證,getter方法只需要簡單的取回即可。