1. 程式人生 > 其它 >面向物件詳解

面向物件詳解

面向物件

面向過程 & 面向物件

  1. 面向過程:第一步做什麼,第二步做什麼...(線性思維)
  2. 面向過程適合處理一些較為簡單的問題
  3. 面向物件:分類的思維分類,思考問題首先會解決問題需要哪些分類,然後對這些分類進行單獨思考。最後,才對某個分類下的細節進行面向過程的思索。
  4. 面向物件適合處理複雜的問題
  5. 對於描述複雜的事物,為了從巨集觀上把握,從整體上合理分析,我們需要使用面向物件的思路來分析整個系統。但是,具體到微觀操作,仍然需要面向過程的思路去處理。

什麼是面向物件

面向物件程式設計(OOP):面向物件程式設計的本質就是以類的方式組織程式碼,以物件的形式(封裝)資料

三大特性:封裝、繼承、多型

從程式碼執行角度考慮是先有類後有物件。類是物件的模板。

回顧方法及及加深

方法的定義

  • 修飾符
  • 返回型別
  • break:跳出switch,結束迴圈
  • 方法名:注意規範,見名知意
  • 引數列表:(引數型別,引數名)
  • 異常丟擲

方法的呼叫:遞迴

  • 靜態方法 static
  • 非靜態方法
  • 形參和實參(實際引數和形式引數的型別要對應)
  • 值傳遞和引用傳遞
  • this關鍵字

為什麼一個java原始檔中只能有一個public類

點選檢視答案

類與物件的關係

  1. 類是一種抽象的資料型別,它是對某一類事物整體描述/定義,但是並不能代表某一個具體的事物
  2. 物件是抽象概念的具體例項

創建於初始化物件

使用new關鍵字建立物件

使用new關鍵字建立的時候,除了分配記憶體空間之外,還會給建立好的物件進行預設的初始化以及對類中構造器的呼叫。

構造器必須要掌握

類中的構造器也稱為構造方法,是在進行建立物件的時候必須要呼叫的,並且構造器有以下倆個特點:

  1. 必須和類的名字相同

  2. 必須沒有返回型別,也不能寫void

  3. 一個類即使什麼都不寫,它也會存在一個方法

    //無參構造
    public class Person{
        public Person(){
            
        }
    }
    //作用:例項化初始值
    //1.使用new關鍵字,本質是在呼叫構造器
    //2.構造器用來初始化物件的值
    
  4. 有參構造:一旦定義了有參構造,無參構造必須顯示定義才能再次使用

    //有參構造
    public class Person{
        public Person(String name){
            this.name = name;
        }
    }
    
  5. Alt+Insert是呼叫構造器的快鍵鍵

java記憶體分析

小結

  1. 類與物件

    類是一個模板:抽象,物件是一個具體的例項

  2. 方法

    定義,呼叫

  3. 物件的引用

    引用型別:除了基本型別都是引用型別

    基本型別(8個)

  4. 屬性:欄位

    預設初始化:

    數字:0、0.0

    char: u0000

    boolean: false

    引用:null

    格式: 修飾符 屬性型別 屬性名 = 屬性值;

  5. 物件的建立和使用

    • 必須使用new關鍵字創造物件 Person person = new Person();
    • 物件的屬性 person.name
    • 物件的方法 person.study()
  6. 類:

    靜態的屬性 屬性

    動態的行為 方法

面向物件三大特徵:封裝

程式設計要求“高內聚,低耦合”。高內聚就是類的內部資料操作細節自己完成,不允許外部干涉;低耦合:僅暴露少量的方法給外部使用。

封裝(資料的隱藏):通常應禁止直接訪問一個物件中資料的實際表示,而應通過操作介面來訪問,這稱為資訊隱藏。

屬性私有,get/set

快鍵鍵:Alt+Insert

面向物件三大特徵:繼承

繼承的本質是對某一批類的抽象,從而實現對現實世界更好的建模

extends的意思是“擴充套件”。子類是父類的擴充套件。

java中類只有單繼承,沒有多繼承

繼承是類和類之間的一種關係。除此之外,類和類之間的關係還有依賴、組合、聚合等。

繼承關係的倆個類,一個為子類(派生類),一個為父類(基類)。子類繼承父類,使用關鍵字extends來表示。

子類和父類之間,從意義上講應該具有“is a”的關係。

object類:在java中,所有的類,都預設直接或間接繼承Object類(通過Ctrl+H檢視)

super

super注意點:

  1. super呼叫父類的構造方法,必須在構造方法的第一個
  2. super必須只能出現在子類的方法或者構造方法中
  3. super和this不能同時呼叫構造方法

this vs super:

  1. 代表的物件不同:

    this:本身呼叫者這個物件

    super:代表父類物件的引用

  2. 前提

    this:沒有繼承也可以使用

    super:只能在繼承條件下才可以使用

  3. 構造方法

    this();本類的構造

    super();父類的構造

方法重寫:子類的方法和父類必須一致:方法體不同!

  1. 需要有繼承關係,子類重寫父類的方法

  2. 方法名必須相同

  3. 引數列表必須相同

  4. 修飾符:範圍可以擴大但不能縮小

    public>protected>default>private

  5. 丟擲的異常:範圍可以被縮小,但不能擴大

為什麼需要重寫?

  1. 父類的功能,子類不一定需要,或者不一定滿足!(Alt+Insert)
//繼承程式碼
public class Student extends Person(){
    private String name = "lvcong";
    
    public void print(){
        System.out.println("Person");
    }
    
    public void test(String name){
        System.out.println(name);
        System.out.println(this.name);//lvcong
        System.out.println(super.name);//呂聰
    }
}

public class Person{
    protected String name = "小胖";
    
    public void print(){
        System.out.println("Person");
    }
}

靜態的方法和非靜態的方法區別很大

靜態方法:方法的呼叫只和左邊,定義的資料型別有關

非靜態方法:重寫

面向物件三大特徵:多型

即同一方法可以根據傳送物件的不同而採用多種不同的行為方式。

一個物件的實際型別是確定的,但可以指向物件的引用的型別有很多

  1. 子類能呼叫的方法都是自己的或者繼承父類的!
  2. 父類可以指向子類,但是不能呼叫子類獨有的方法

多型注意事項:

  1. 多型是方法的多型,屬性沒有多型

  2. 父類和子類,需有聯絡,否則報型別轉換異常:ClassCastException!

  3. 多型存在條件:

    • 首先要有繼承關係

    • 方法需要重寫(子類重寫父類的方法)

    • 父類引用指向子類物件

    Father f1 = new Son();

  4. 不能重寫和不能實現多型的情況

    • static 方法,它屬於類,不屬於例項
    • final 常量
    • private 方法

instanceof 和 型別轉換之間的關係

instanceof:用來測試一個物件是否為一個類的例項 x instanceof y

//型別之間的轉換:高轉換到低自動轉換
Person obj = new Student();
//但obj不能使用Student類中的方法
//將這個物件轉換為Student型別,我們就可以使用Student型別的方法了
((Student)obj).go();

抽象類

//abstract 抽象類
public abstract class Action {
    //抽象方法只有方法名字,沒有方法的實現!
    public abstract void doSomething();
    //抽象類的特點:
    //    1.不能new這個抽象類,只能靠子類去實現它
    //    2.抽象類中可以寫普通的方法
    //    3.抽象的方法必須在抽象類中

}

public class A extends Action{
    @Override
    public void doSomething() {

    }
}

介面

普通類、抽象類、介面的區別

普通類:只有具體實現

抽象類:具體實現和規範(抽象方法)都有!

介面:只有規範!自己無法寫方法;而且約束和實現分離:面向介面程式設計

介面的本質是契約

宣告介面的關鍵字是interface

介面的作用

  1. 約束
  2. 定義一些方法,讓不同的人實現
  3. 方法:public abstract
  4. 常量:public static final
  5. 介面不能被例項化,介面中沒有構造方法
  6. implements可以實現多個介面
  7. 必須要重寫介面中的方法

內部類

內部類就是在一個類的內部再定義一個類,比如,A類中定義一個B類,那麼B類相對A類來說就稱為內部類,而A類相對B類來說就是外部類了。

  1. 成員內部類
  2. 靜態內部類
  3. 區域性內部類
  4. 匿名內部類