Java語言之物件導向—類與物件(上)

化成風發表於2019-03-23

物件導向

物件導向簡介:
程式導向程式設計少了可重複用性設計
三大特徵

  • 封裝性:就是把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱蔽。簡而言之就是:內部操作對外部而言不可見(保護性)
  • 繼承性:首先繼承是一種能力它可以使用現有類的所有的功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件。(必須滿足is-a原則,賦用)
  • 多型性:一個類例項的想同方法在不能情形有不能的表現形式。多型機制是具有不同內部結構的物件可以共享相同的外部介面。(利用多型可以得到良好的設計)
    物件導向名詞擴充套件
  • OOA:物件導向分析
  • OOD:物件導向設計
  • OOP:物件導向程式設計
  • 物件導向最大的特徵:可以對現實生活進行抽象。

類與物件的定義與使用

類指的是共性的概念(人類),而物件是類的一個具體的可以使用的事物(某個人)。
首先產生類(類是產生物件的藍圖),而後產生物件。物件所有的行為一定在類中進行了完整的定義。(屬性和行為一致)
類的組成:
屬性:描述物件的具體特點
方法:操作的行為
語法:
class 類名稱{
屬性1;
屬性2;
屬性n……;

方法1(){}
方法2(){}
方法(){}

class Person{
public String name;
public int age;
public Person(String name,int age){
this.name = name ;
this.age = age ;
}
public String getPersonInfo(){
return "姓名:"+this.name+",年齡:"+this.age;
}
}

類中定義的普通屬性與方法不在由主類直接呼叫,而是通過該類的物件的呼叫。
產生物件的語法:
類名稱 物件名稱=new 類名稱()

Person p1 = new Person();
Person p2 = new Person("Steven",25);

物件記憶體分析:
堆記憶體:方法的區域性變數,方法形參,引用
堆記憶體(所有方法共享記憶體):陣列物件、所有類的物件
當看見關鍵字new,一定在堆記憶體上開闢了新的空間
物件的引用傳遞:多個棧記憶體指向同一個堆記憶體
物件的空指標問題:所有引用資料變數必須先賦值後使用,否則會丟擲NullPointerException(執行時異常)

封裝和構造方法

private實現封裝
若類中屬性直接暴露給物件操作,存在不安全(由於物件可以直接操作類中屬性,無法限制屬性是否正常設定)
使用private實現堆屬性封裝
修飾屬性或方法,表示該屬性和方法只能在本類中使用,其他類無法直接使用private封裝的屬性或方法。
defalut許可權
class Person{
String name

Person類與name屬性都是default許可權(包訪問許可權,在同一個 原始檔中可以訪問)
使用方法
若private封裝的屬性要被外部訪問,需要提供setter/getter方法
setter方法用於設定屬性值
getter方法用於取得屬性值
類的設計原則

  • 編寫類時,所有屬性必須被private封裝
  • 屬性要被外部訪問,必須定義相應的getter和setter方法
    類的構造方法
    定義:構造方法是在使用關鍵字new例項化新的物件時呼叫的方法
    person per = new person
    類名稱 物件引用 堆上開闢新空間 構造方法
    構造方法特點
  • 構造方法名稱必須與類名稱相同
  • 沒有返回值型別說明
  • 每個類至少存在一個構造方法無參構造(沒有明確定義,則系統自動生成一個無參構造)
    構造方法作用
    為類中屬性初始化,避免多次使用setter呼叫
    方法過載:僅限於引數個數不同

this關鍵字

this表示構造方法
this(方法引數);
在構造方法首行使用this()表示呼叫本類的構造方法
this呼叫構造方法必須在構造方法首行
this呼叫構造方法不能成環
this表示本類普通方法
this.方法名稱(方法引數)
若在本類中呼叫本類方法,一般將this(尤其是在有繼承的情況,使用this可以明確是本類方法)
this表示當前物件
當前呼叫的屬性和方法是通過那個物件呼叫的,this就指代他。

static關鍵字

修飾本類屬性—成為靜態屬性(類屬性),所有物件共享此屬性值
非static屬性成為成員變數或物件屬性,每個物件都有此屬性且值都一樣
要描述國家著中共享屬性,可以使用static修飾屬性靜態屬性一般同過類名直接呼叫,所有該類物件共享此屬性值。
修飾本類方法
使用static修飾方法,稱為類方法,直接通過類名稱呼叫,與物件例項化無關。
靜態方法常見於工具方法。
eg:java.util.Arrays.sort();
System.arraycopy();
靜態方法不能訪問類中普通屬性。 靜態無物件
靜態方法可以訪問類中靜態屬性。
普通方法可以訪問類中靜態屬性。
修飾內部類
沒有外部類直接建立

相關文章