第5篇 Java物件導向

來源:互聯網
上載者:User

標籤:特徵   print   img   src   bsp   命名法   簡化   初始化   pre   

Java物件導向類

具有相同屬性和方法的一系列對象的集合,是對對象的一個描述。類的內部包括屬性和方法兩個部分。

類是建立對象的一個模板。

命名規範:帕斯卡命名法類的聲明:
class Dog{    //屬性    private String name;    private int age;    private float height;    //構造方法    public Dog() {    }        public Dog(String name, int age, float height) {        super();        this.name = name;        this.age = age;        this.height = height;    }        //方法    public void eat() {        System.out.println("這隻狗會吃飯...");    }        //Getter & Setter    public String getName() {        return name;    }        public void setName(String name) {        this.name = name;    }        public int getAge() {        return age;    }        public void setAge(int age) {        this.age = age;    }        public float getHeight() {        return height;    }        public void setHeight(float height) {        this.height = height;    }    }
屬性

一般情況下,所有屬性設定為private(只能在本類進行訪問)

屬性是對對象特徵的一個描述。在描述對象時,不需要對對象的所有特徵都進行描述,只需用到什麼就描述什麼。

方法

方法包括五部分:限定詞+傳回值類型+方法名+參數+方法體

方法在定義時的參數為形參,只起到佔位作用。形參是一個局部變數,範圍僅僅限於方法體內有效,出了方法體,便被銷毀。

方法在被調用的時候傳入的參數稱為實參,它的值被賦給形參,通過形參參與方法體中的運算。這種值的傳遞是單向的,只有從實參傳遞給形參,方法執行完畢之後,形參的值並不會被傳遞給實參。

方法重載
  • 方法名相同
  • 方法參數列表不同
  • 與傳回值和限定修飾符無關
  • 發生在同一個類當中
public class Calc{    //被重載的方法    public int  add(int num1, int num2) {        return num1+num2;    }    //參數列表不同,方法名相同    public int add(int num1, int num2, int num3) {        return add(num1, num2)+num3;    }    //參數名與傳回值都不同,方法名相同    public float add(float num1, float num2) {        return num1+num2;    }    }
構造方法

每個類都有自己的構造方法。如果沒有顯式地為類定義構造方法,Java編譯器將會為該類提供一個預設的無參構造方法。

構造方法的幾個特點:

  • 方法名與類名相同
  • 沒有傳回值
  • 建立對象時自動被調用 
  • 一個類至少有一個到多個構造方法
對象

對象是系統中用來描述客觀事物的一個實體,它是構成系統的一個基本單位。一個對象由一組屬性和對這組屬性進行操作的一組服務組成。

對象是類所描述的一個實體,是類的一個執行個體化。

建立對象
  1. 聲明:聲明一個對象,包括對象名、物件類型、
  2. 執行個體化:使用關鍵字new來建立一個對象
  3. 初始化:使用new建立對象時,會調用建構函式來對對象進行初始化

樣本:

//調用無參構造方法執行個體化對象Dog dog1 = new Dog();//調用帶參構造方法執行個體化對象,同時對對象進行初始化Dog dog2 = new Dog("大黃", 2, 12.9f);
訪問對象

由於對象的屬性被設定為私人的,所以只能通過set和get方法來訪問。

通過已建立的對象來訪問成員變數和成員方法,如下所示:

Dog dog2 = new Dog("大黃", 2, 12.9f);System.out.println("狗的名字是:"+dog2.getName());System.out.println("狗的年齡是:"+dog2.getAge()+"歲");System.out.println("狗的體重是:"+dog2.getHeight()+"kg");

列印結果如下:

狗的名字是:大黃狗的年齡是:2歲狗的體重是:12.9kg
物件導向基本特徵
  • 封裝
  • 繼承
  • 多態
物件導向的特點
  • 一種常見的思想,符合人們的思考習慣
  • 將複雜問題簡單化
  • 從執行者變為指揮者
設計過程
  • 發現類
  • 發現類的屬性
  • 發現類的方法
  • 最佳化過程

設計的原則:關注所需要的屬性和方法

Java 封裝優點:
  • 良好的封裝可以減少耦合
  • 類內部結構可以自由修改
  • 可以對成員變數進行更精確的控制
  • 隱藏資訊,實現細節
存取權限

一般情況下,將屬性值全部設定為private,通過set和get方法來對屬性進行訪問:

public class Person{    private String name;    private int age;?    public int getAge(){      return age;    }?    public String getName(){      return name;    }?    public void setAge(int age){      this.age = age;    }?    public void setName(String name){      this.name = name;    }}

將類的某些資訊隱藏在類內部,不允許外部程式直接存取,而是通過該類提供的方法實現對隱藏資訊的訪問和操作。

Java 繼承

繼承就是子類繼承父類的特徵和行為,使得子類對象(執行個體)具有父類的執行個體域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。同時,子類可以在父類的基礎上進行擴充,加入自己專屬的屬性和方法。

  • Java中通過extends關鍵字來表明一個類與其父類的繼承關係
  • 子類將會繼承父類除私人以外所有的屬性和方法(個人認為私人的仍然被繼承,但是由於範圍的原因無法被使用)
  • 子類可以在父類的基礎上進行擴充
  • 繼承關係中方法的執行順序:先從子類中尋找該方法,如果在子類中找不到該方法則再去父類中尋找
  • Java中屬於單繼承,一個子類只能擁有一個父類,一個父類可以擁有N個子類
  • 構造方法不能也無需被繼承,因為在調用子類的構造方法時會預設先調用父類的構造方法
  • 繼承的初始化順序:父類構造方法 --> 父類屬性初始化 --> 子類構造方法 -->子類屬性初始化
  • Java中super關鍵字代表父類,子類中可以使用super來調用父類的共有屬性和方法
  • Java中this關鍵字代表當前類,通過this關鍵字可訪問本類中所有屬性和方法
class Animals{    private String name;    //父類構造方法    public Animals(String name) {        this.name = name;    }        public void eat() {        System.out.println("動物吃東西");    }}class Dogs extends Animals{    //子類構造方法。父類沒有無參構造方法,子類執行個體化時必須調用父類構造方法    public Dogs(String name) {        super(name);    }    public void run() {        System.out.println("狗會跑");    }}

上面例子中,Animals為父類,而Dogs作為子類。

Animals中只有一個Animals(String name)的構造方法。子類構造方法中,如果沒有使用super來調用父類構造方法,編譯器會預設調用一個super()的方法,但由於父類中不存在這個構造方法,所以編譯器會報錯。此時要求我們調用父類唯一的帶參構造方法。

子類構造方法中必須且只能一次地調用父類的構造方法,並且位置是在構造方法所有操作之前。

run方法是Dogs類在Animals類的基礎上所進行的擴充,eat方法將在Dogs類中被繼承。

繼承後對Dogs對象的使用樣本:

Dogs dogs = new Dogs("大黃");dogs.eat();dogs.run();

列印結果如下:

動物吃東西狗會跑
方法的重寫

子類中可以對從父類繼承的方法進行重寫(Alt+Shift+s, v),重寫後子類對象在調用時會優先調用子類中被重寫的方法

class Dogs extends Animals{    public Dogs(String name) {                super(name);            }    //對父類方法進行重寫,通過@verride標識    @Override    public void eat() {        System.out.println("狗會吃骨頭");    }}

這裡調用dogs.eat()方法時,會列印“狗會吃骨頭”,而不是“動物吃東西”。

super、this關鍵字

super代表的是父類,this代表的是本類

class Dogs extends Animals{    public Dogs(String name) {                super(name);    }    @Override    public void eat() {                System.out.println("狗會吃骨頭");    }        public void animalEat() {        super.eat();        this.eat();    }}

調用animalEat方法後列印的結果為:

動物吃東西狗會吃骨頭
final關鍵字

final,意為最後的,最終的。

  • 被final修飾的類不能被繼承
  • 被final修飾的方法不能被重寫
  • 被final修飾的屬性被能被修改(常量)
繼承與組合的區別

B extends A : 從邏輯上來說,是 “B is a A” 的關係。例如狗繼承自動物,說明狗是一種動物;衣服繼承自商品,說明衣服是一種商品。

組合:是一種 “A has B” 的關係。在一個類中,可以用別的對象來作為自己的屬性。例如人有名字,而這個名字本身是一個String類型的對象,我們可以同過它來描述一個人。

Java 多態
  • 多態即父類的引用執行子類對象
  • 多態必須建立在繼承的基礎上(對介面的實現上)
  • 多態中方法調用時現在子類尋找該方法,沒有找到則再去父類中尋找

所為多態,即多種形態。

多態是同一個行為具有多個不同表現形式或形態的能力。

比如說兩台印表機,一台為黑白印表機,一台為彩色印表機。當我們使用黑白印表機時,它將給我們列印黑白的材料,而使用彩色印表機時列印的卻是彩色的。

abstract class Printer {    //父類的列印方法    public abstract void print();}class BWPrinter extends Printer {    @Override    public void print() {        System.out.println("列印了一份黑白材料");            }}class ColorfulPrinter extends Printer {    @Override    public void print() {        System.out.println("列印了一份彩色材料");    }}public class Main {    public static void print(Printer printer) {        printer.print();    }        public static void main(String[] args) {                BWPrinter bwPrinter = new BWPrinter();        ColorfulPrinter colorfulPrinter = new ColorfulPrinter();        //使用黑白印表機進行列印        print(bwPrinter);        //使用彩色印表機進行列印        print(colorfulPrinter);    }}

列印結果為:

列印了一份黑白材料列印了一份彩色材料
多態的優點
  • 消除類型之間的耦合
  • 可替換性
  • 可擴充性
  • 介面性
  • 靈活性
  • 簡化性
多態存在的三個必要條件
  • 繼承
  • 重寫
  • 父類引用指向子類對象

第5篇 Java物件導向

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.