Java講課筆記09:類與對象

零、本講學習目標

1、理解面向對象的概念

2、熟悉面向對象的三個特點

3、掌握類和對象的定義和使用

4、熟悉訪問控制符

一、面向對象概述

1、什麼是面向對象?

面向對象是一種符合人類思維習慣的編程思想。現實生活中存在各種形態不同的事物,這些事物之間存在着各種各樣的聯繫。在程序中使用對象來映射現實中的事物,使用對象的關係來描述事物之間的聯繫,這種思想就是面向對象。

2、面向過程 vs. 面向對象

  • 面向過程就是分析出解決問題所需要的步驟,然後用函數把這些步驟一一實現,使用的時候依次調用就可以了。(POP:Procedure-Oriented Programming)
  • 面向對象則是把構成問題的事務按照一定規則劃分爲多個獨立的對象,然後通過調用對象的方法來解決問題。(OOP:Object-Oriented Programming)

3、面向對象三大特點

面向對象是把構成問題的事務按照一定規則劃分爲多個獨立的對象,然後通過調用對象的方法來解決問題。一個應用程序會包含多個對象,通過多個對象的相互配合來實現應用程序的功能,這樣當應用程序功能發生變動時,只需要修改個別的對象就可以了,從而使代碼更容易得到維護。面向對象的特點主要可以概括爲封裝性、繼承性和多態性。

(1)封裝(encapsulation)

封裝是面向對象的核心思想,將對象的屬性(property)和行爲(behavior)封裝起來,不需要讓外界知道具體實現細節。

(2)繼承(inheritance)

繼承主要描述的就是類與類之間的關係,通過繼承,可以在無需重新編寫原有類的情況下,對原有類的功能進行擴展(extend)。

(3)多態(polymorphism)

多態指的是在一個類中定義的屬性和功能被其他類繼承後,當把子類對象直接賦值給父類引用變量時,相同引用類型的變量調用同一個方法所呈現出的多種不同行爲特性。

二、Java中的類與對象

1、類與對象的關係

面向對象的編程思想,力圖讓程序中對事物的描述與該事物在現實中的形態保持一致。爲了做到這一點,面向對象的思想中提出了兩個概念——類和對象。

類是對某一類事物的抽象描述,而對象用於表示現實中該類事物的個體。簡而言之,類是模板(template),對象是實例(instance)。
在這裏插入圖片描述

  • 分析: 可以將上圖人看作是一個類,將每個具體的人(如小韓、小石等)看作對象,從人與具體個人之間的關係便可以看出類與對象之間的關係。
  • 說明: 類用於描述多個對象的共同特徵,它是對象的模板,而對象用於描述現實中的個體,它是類的實例。對象是類的具體化,並且一個類可以對應多個對象。

2、類的定義

在面向對象的思想中,最核心的就是對象。爲了在程序中創建對象,首先需要定義一個類。類是對象的抽象,它用於描述一組對象的共同特徵和行爲,例如人都有姓名、年齡、性別等特徵,還有學習、工作、購物等行爲。

以面向對象的編程思想,就可以將某一類中共同的特徵和行爲封裝起來,把共同特徵作爲類的屬性(property),也叫成員變量(member variable),把共同行爲作爲類的方法(method),也叫成員方法(member method)。

(1)類的定義格式

在這裏插入圖片描述

(2)聲明成員變量

在這裏插入圖片描述

(3)聲明成員方法

在這裏插入圖片描述

(4)案例演示:創建Person1類

Person1類包含兩個屬性:姓名和人品,另外還包含一個自我介紹的方法。注意:要求人品值在[1, 10]。
在這裏插入圖片描述

package net.hw.lesson09;

/**
 * 功能:人類1
 * 作者:華衛
 * 日期:2020年4月25日
 */
public class Person1 {
    /**
     * 姓名
     */
    String name;
    /**
     * 人品
     */
    int character;

    /**
     * 自我介紹方法
     */
    public void speak() {
        System.out.println("Hello,我叫" + name + ",我的人品值:" + character);
    }
}

(5)成員變量與局部變量

在Java中,定義在類中的變量被稱爲成員變量(member variable),定義在方法中的變量被稱爲局部變量(local variable)。如果在某一個方法中定義的局部變量與成員變量同名,這種情況是允許的,此時方法中通過變量名訪問到的是局部變量,而並非成員變量。

public class Person {
    int character = 3;  // 類中定義的變量被稱作成員變量
    void speak() {
        int character  = 7;  // 方法內部定義的變量被稱作局部變量
        System.out.println("我的人品值:" + character);
    }
}

分析:上面的代碼中,speak()方法中所訪問的變量character,就是局部變量,也就是說,當有另外一個程序來調用speak()方法時,輸出的值爲7,而不是3。
在這裏插入圖片描述

3、對象的創建與使用

應用程序想要完成具體的功能,僅有類是遠遠不夠的,還需要根據類創建實例對象。

(1)對象創建語法格式

類名 對象名稱 = new 類名();

  • new 類名() 是基於指定類創建一個新的實例(對象)
  • 對象名稱是一個引用變量,指向創建的實例(對象)

(2)案例演示:創建並使用Person1對象

首先,創建Person1的測試類TestPerson1:
在這裏插入圖片描述
在主方法裏,實例化Person1對象,然後直接輸出對象:
在這裏插入圖片描述
直接打印對象變量,輸出的並不是對象的內容,而是對象名@哈希碼。如果要輸出對象的內容,那麼需要改寫Person1類的toString()方法,如下圖所示:

在這裏插入圖片描述
此時,再執行TestPerson1,結果如下:
在這裏插入圖片描述
設置對象的屬性與調用對象的方法:

package net.hw.lesson09;

/**
 * 功能:測試Person1類
 * 作者:華衛
 * 日期:2020年4月25日
 */
public class TestPerson1 {
    public static void main(String[] args) {
        // 實例化Person1對象
        Person1 person1 = new Person1();
        // 輸出person1對象
        System.out.println(person1);
        // 設置對象屬性
        person1.name = "李曉紅";
        person1.character = -1;
        // 調用對象的方法
        person1.speak();
    }
}

運行程序,查看結果:
在這裏插入圖片描述

顯然這樣做是不合理的,應該把屬性私有化,統一地提供訪問私有屬性的公共方法,包括設置與讀取私有屬性值。在下一講,我們會對Person1類進行改進。

(3)對象創建的內存分配

在這裏插入圖片描述
在創建對象時,程序會佔用兩塊內存區域,分別是棧內存和堆內存。其中Person類型的變量p被存放在棧內存中,它是一個引用,會指向真正的對象;通過new Person()創建的對象則放在堆內存中,這纔是真正的對象。

小提示: Java將內存分爲兩種,即棧內存堆內存。其中棧內存用於存放基本類型的變量和對象的引用變量(如Person p),堆內存用於存放由new創建的對象和數組。

(4)成員變量的調用

  • 通過對象的引用來訪問對象所有的成員:對象引用.對象成員
  • 直接使用創建的對象本身來引用對象成員:new 類名().對象成員
  • 對比說明:第2種方式,創建實例對象的同時就訪問了對象成員,並且在創建後只能訪問其中某一個成員,而不能像第1種方式那樣可以訪問多個對象成員。同時,由於沒有對象引用的存在,在完成某一個對象成員的訪問後,該對象就會變成垃圾對象。所以,在實際開發中,創建實例對象時多數會使用對象引用。

(3)成員變量的初始值

在這裏插入圖片描述

(4)垃圾對象的形成

  • 對象的引用超出作用域
{
    Person p1 = new Person();
    ......
}

說明:變量p1引用了一個Person類型的對象,當這段代碼運行完畢時,變量p1就會超出其作用域而被銷燬,這時Person類型的對象將因爲沒有被任何變量所引用而變成垃圾。

  • 對象的引用重新指向空地址(null)
{
    Person p2 = new Person();
    ......
    p2 = null;
    ......
}

說明:使用變量p2引用了一個Person類型的對象,接着將變量p2的值置爲null,被p2所引用的Person對象就會失去引用,成爲垃圾對象。
在這裏插入圖片描述
Java有垃圾自動回收機制。當然也可以調用System.gc()方法來顯式回收垃圾對象。

4、訪問控制符

在Java中,針對類、成員方法和屬性提供了四種訪問級別,分別是private、default、protected和public。
在這裏插入圖片描述

(1)private(當前類訪問級別)

如果類的成員被private訪問控制符來修飾,則這個成員只能被該類的其他成員訪問,其他類無法直接訪問。類的良好封裝就是通過private關鍵字來實現的。

(2)default(包訪問級別)

如果一個類或者類的成員不使用任何訪問控制符修飾,則稱它爲默認訪問控制級別,這個類或者類的成員只能被本包中的其他類訪問。

(3)protected(子類訪問級別)

如果一個類的成員被protected訪問控制符修飾,那麼這個成員既能被同一包下的其他類訪問,也能被不同包下該類的子類訪問。

(4)public(公共訪問級別)

這是一個最寬鬆的訪問控制級別,如果一個類或者類的成員被public訪問控制符修飾,那麼這個類或者類的成員能被所有的類訪問,不管訪問類與被訪問類是否在同一個包中。

在這裏插入圖片描述

(5)案例演示訪問權限

a. 演示default訪問權限

參看我們前面講的Person1類與TestPerson1類即可瞭解default權限。
在這裏插入圖片描述
在這裏插入圖片描述
注意,TestPerson1與Person1是在同一個包裏,所以TestPerson1裏的person1對象可以訪問默認的name與character屬性。假如將TestPerson1複製到包net.hw.lesson09.test裏,由於此包裏的TestPerson1與Person1不在同一包裏,於是TestPerson1裏的person1對象就不能訪問默認的name與character屬性了,如下圖所示:
在這裏插入圖片描述

b. 演示private訪問權限

將net.hw.lesson09裏的Person1類的name與character屬性的訪問權限修改爲private:
在這裏插入圖片描述
在這裏插入圖片描述
由於name與character是Person1類的私有屬性,只能在當前類裏被訪問,而不能被當前類以外其它對象訪問,即使是同一包裏的TestPerson1類也無法訪問Person1的私有屬性,也就是私有屬性被保護起來了,那麼對於私有屬性,該如何去訪問呢?下一講我們會學習如何創建setters和getters來訪問類的私有屬性。

c. 演示protected訪問權限

將net.hw.lesson09裏的Person1類的name與character屬性的訪問權限修改爲protected:
在這裏插入圖片描述

在同一包net.hw.lesson09裏的TestPerson1類可以訪問受保護的name與character屬性:
在這裏插入圖片描述
但是,在不同包net.hw.lesson09.test裏的TestPerson1就不能訪問受保護的name與character屬性:
在這裏插入圖片描述
前面講了,受保護的屬性可以被不同包裏該類的子類訪問,下面我們演示如何訪問。

首先在net.hw.lesson09.test裏繼承Person1,創建一個子類Person1Child:
在這裏插入圖片描述
然後在主方法裏實例化Person1Child,設置其屬性name與character(都是父類Person1裏受保護的屬性),調用其方法speak(),如下圖所示:
在這裏插入圖片描述

d. 演示public訪問權限

將net.hw.lesson09裏的Person1類的name與character屬性的訪問權限修改爲public:
在這裏插入圖片描述
此時,同一個包裏的TestPerson1可以訪問Person1的公共屬性name與character:
在這裏插入圖片描述
而且不同包裏的TestPerson1也可以訪問Person1的公共屬性name與character:
在這裏插入圖片描述

三、課後作業

1、採用面向對象方式計算三角形面積

創建三角形類Triangle,包含a、b、c三個默認屬性,一個公共方法getArea()。然後創建一個測試類TestTriangle,在其主方法裏創建Triangle對象,設置對象屬性,調用對象方法得到三角形面積。a、b、c暫時採用默認權限,下一講我們再設置爲private權限,再創建setters和getters來訪問私有屬性a、b、c。大家編寫獲取面積的方法getArea(),該方法有一個double類型的返回值。
在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

2、採用面向對象方式求解一元二次方程

創建一元二次方程類Equation,包含a、b、c三個默認屬性,一個公共方法solve()。然後創建一個測試類TestEquation,在其主方法裏創建Equation對象,設置對象屬性,調用對象方法求解方程。a、b、c暫時採用默認權限,下一講我們再設置爲private權限,再創建setters和getters來訪問私有屬性a、b、c。大家編寫求解方程的方法solve(),該方法沒有返回值。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章