天天看點

從零開始學Java之面向對象中的類到底是什麼?

作者:Java解白

一. 類的簡介

1. 概念

要掌握面向對象,我們就不得不先了解一下什麼是類。類是對表示客觀世界中某類群體的一些基本特征的抽象。它會在一組相同或相似的對象中,抽取出共性的特征和行為,保留我們所關注的部分。

當然,這個概念對于小白來說很難了解,壹哥必須給大家舉個栗子。

從零開始學Java之面向對象中的類到底是什麼?

壹哥很久以前上大學時,去生産手機裝置的電子廠做過暑假工。當時那個廠子是給摩托羅拉生産手機殼的,你們知道手機殼是怎麼生産的嗎?肯定不是靠人力把一個個殼子給雕刻出來,而是利用專門的“模具”來生産。就是每一款手機設計出來之後,就會針對該款手機的外形進行“開模”,先生産出一款手機外殼的“模具”。接下來工廠裡面就調制出所需的塑膠(液體形态),把這個液體的塑膠往模具裡一倒一壓,等冷卻後摳出來就是一個個的手機殼了。

其實這樣的場景,壹哥相信很多人都見過,我們家裡做飯用的大鐵鍋、洗臉盆等用品,也都是通過對應的模具生産出來的。

那麼大家想一下,這個“模具”不就是“對某類群體的一些基本特征的抽象”嗎?把所有手機殼或者是鍋碗瓢盆的“共性的特征和行為抽取出來”!是以,“模具”就是一個“類”,“類”就是一個“模具”!我們可以利用“類”生産出很多同類的“産品”,這些個産品就是“對象”。

從零開始學Java之面向對象中的類到底是什麼?

2. 類與對象的關系

類是對象的抽象,對象是類的具體。也就是說,類是一種概念模型,定義了對象的所有特性和所需的操作。而對象是一個真實的模型,是一個具體的實體。是以類是描述了一組具有相同特性(屬性)和相同行為(方法)的一組對象的集合。

類是構造面向對象程式的基本機關,是抽取了同類對象的共同屬性和方法所形成的對象或實體的“模闆”。而對象則是現實世界中實體的描述,對象要建立才存在,有了對象才能對對象進行操作。概括總結就是:

類定義了對象應具有的特征和行為,類是對象的模闆;

對象是擁有多個相同特征和行為的實體,對象是類的執行個體。

是以,類是對象的模闆,對象是類的執行個體。 面想對象其實就是從具體到抽象,再從抽象到具體的過程 。 就好比“人類”是一個類别的統稱,但并不是某個具體的對象“張三、李四”;而“張三、李四”則是一個個具體的“對象”,不是“人類”。

從零開始學Java之面向對象中的類到底是什麼?

3. 類的組成

在一個類中,主要包括兩個核心要素,即屬性和行為。屬性其實就是類中的各種變量,行為其實就是類中的各種方法。

屬性:對應着各種變量,包括成員變量、類變量等;

行為:對應着各種方法,包括執行個體方法、靜态方法、靜态代碼塊等。

接下來壹哥會給大家講解如何建立一個類,并介紹以上這些概念該如何用代碼定義,另外我們也會在後面通過專門的文章來學習這些内容。

二. 類的建立

1. 建立步驟

從零開始學Java之面向對象中的類到底是什麼?

我們要用代碼建立一個類,可以按如下幾個步驟進行實作:

确定類名;編寫成員變量;編寫成員方法。

通過以上步驟,一個類就可以建立出來了。

2. 基本文法

在 Java 中,定義一個類需要使用 class 關鍵字、類名和一對表示程式體的大括号,基本文法如下:

[public][abstract|final]class<class_name>[extends<class_name>][implements<interface_name>] {
    //屬性部分
    <property_type> <property1>;
    <property_type> <property2>;
    <property_type> <property3>;
    ......
    
    //方法部分
    method1();
    method2();
    method3();
    ......
}
複制代碼           

在上述文法中,“[]”中括号裡的部分是可選的,可以省略,中括号外面的部分則是必須的。“|”豎線表示“或的關系”,比如abstract|final,說明可以使用abstract 或 final 關鍵字,但這兩個關鍵字不能同時出現。

3. 關鍵字

在上述文法中,出現的各關鍵字含義如下:

public : 表示“公共的”,使用 public 修飾,該類就可以被其他類和程式通路。Java程式的主類必須是 public類,凡是需要作為公共工具供其他類和程式使用的類都應定義為 public類。abstract : 表示“抽象的”,被abstract修飾的類是抽象類。抽象類不能被執行個體化,抽象類中可以有抽象方法(使用 abstract修飾的方法) 和具體方法(沒有使用 abstract修飾的方法)。繼承抽象類的所有子類,都必須實作該抽象類中所有的抽象方法(除非子類也是抽象類)。final : 常量修飾符。被final修飾的類不允許被繼承。class : 聲明類的關鍵字。class_name : 類的名稱。extends : 表示繼承的關鍵字,表示一個類繼承其他類。implements : 表示實作的關鍵字,表示一個類實作某些接口。property_type : 成員變量的類型。property : 成員變量的名稱。method() : 成員方法的名稱。

4. 命名規則與規範

既然我們要建立一個類,必須給該類起一個名字,這就是“類名”。Java類名的命名規則,也要遵循我們前面學過的Java命名規範,讓我們再來複習一下Java的命名規則與規範吧:

①. 辨別符由 **字母(含英、中、日、俄等)、數字、下劃線"_" 和 美元符号∗∗∗∗(音:������)組成,∗∗如���、�7、�����、∗∗∗∗(音:dollar)組成,∗∗如age、G7、value、salary ;

②. 不能以數字開頭, 如123abc ;

③. 嚴格區分大小寫, 如class與Class是不同的 ;

④. 長度無限制(一般不要超過15個字元);

⑤. 不能是Java中的保留字和關鍵字。

以上這些是必須要遵循的規則,還有一些建議我們遵守的規範,如下:

辨別符命名習慣:盡量做到見名知意,如Order訂單類,不要寫a、b、c這種名稱;變量名/方法名/參數名:首字母要小寫。如果名稱由多個單詞組成,第一個單詞的首字母應小寫,剩下的單詞首字母應大寫(駝峰式命名法),例如:xxxYyyZzz、numCounter;類名: 單詞首字母應大寫,如果類名由多個單詞組成,每個單詞的首字母都應大寫(帕斯卡命名法),例如:XxxYyyZzz、OrderCancel;

是以我們在給類進行命名時,也要遵守以上規則和規範。

5. 基本案例

學習了以上這些理論内容之後,我們通過一個小案例來感受一下如何建立一個類。

/**
 * @author 一一哥Sun 
 */
public class Person {//類名首字母大寫,要見名知意
    //定義屬性
    // 姓名
    public String name;
    // 性别
    private String sex;
    // 年齡
    private int age;

    //定義方法
    /**
    * 吃飯
    */
    public void eat() {
	System.out.println("我會吃飯...");
    }

    /**
    * 說話
    */
    public void speak(String name, String sex, int age) {
	System.out.println("我會說話...我的名字是:" + name + ",性别:" + sex + ",年齡=" + age);
    }
}
複制代碼           

我們在上面的代碼中,就是按照建立類的3個核心步驟進行實作的:

聲明類: 給類起一個合格的名字。編寫類的屬性: 類的屬性就是類中的變量,通過在類的主體中定義變量來描述類所具有的特征。類中聲明的變量分為類的成員變量和靜态變量。編寫類的方法: 類的方法描述了類所具有的行為,它們是類的成員方法,我們可以簡單地把方法了解成可以獨立完成某個功能的單元子產品。

大家注意,類中的屬性和方法都是類的成員。

三. 屬性的定義

壹哥在上面給大家講了,類的成員包括屬性和方法,其中方法的定義我會放在以後進行專門地講解,今天我們先來學習一下屬性的定義。

1. 屬性簡介

類中的屬性,其實就是類中的變量,通過在類的主體中定義變量來描述類所具有的特征。類中聲明的變量分為類的成員變量(執行個體變量)和靜态變量(類變量) 。

2. 基本文法

我們要想定義類的屬性,應該遵循一定的文法格式,如下:

[public|protected|private][static][final]<type><variable_name>
複制代碼           

上面文法中,各參數的含義如下:

public、protected、private:通路修飾符。用于表示成員變量的通路權限。static:靜态修飾符。表示該成員變量為類變量,也稱為靜态變量。final:常量修飾符。表示将該成員變量為常量,其值無法被改變。type:變量的類型。variable_name:變量名稱。

我們可以在聲明變量的同時對其進行初始化,如果聲明變量時沒有對其進行初始化,則系統會使用預設值進行初始化。接下來我們就通過一個代碼案例來學習屬性的定義。

3. 基本案例

/**
 * @author 一一哥Sun 
 */
public class Car {

    // 汽車品牌
    public String logo;

    // 汽車顔色
    private String color;

    // 汽車價格
    private double price;
	
    //靜态常量:定義一個字元串常量
    public static final String CAR_MANUFACTURER="大衆";

    /**
    * 為私有的成員變量提供對外的公開方法,友善其他類對該屬性進行通路。
    * 擷取汽車的logo
    */
    public String getLogo() {
	return logo;
    }
    
    /**
    * 為汽車的logo重新指派
    * @param logo
    */
    public void setLogo(String logo) {
	this.logo = logo;
    }

    public String getColor() {
	return color;
    }

    public void setColor(String color) {
	this.color = color;
    }

    public double getPrice() {
	return price;
    }

    public void setPrice(double price) {
	this.price = price;
    }
	
    //複寫toString方法,傳回汽車資訊
    @Override
    public String toString() {
	return "[Logo]=" + logo + ",[Color]=" + color + ",[Price]=" + price;
    }
}
複制代碼           

在上述Car汽車類中,我們定義了 3個成員變量和1個靜态變量。一般情況下,像這種類的成員變量,通路修飾符都是private私有的,表示該成員變量隻是被該類自己通路,不能被外界通路。如果我們想要被外界通路,可以對外提供一些該屬性對應的公開方法,如setXXX和getXXX(),而不是被其他類來直接通路該屬性。

另外我們還定義了一個公開靜态的字元串常量。一般情況下,一個常量都是可以被其他類直接通路的,是以經常設定成公開的和靜态的,這樣友善直接調用。而常量的值一旦被設定之後,就不能在運作時被修改了,這也就是常量的含義:保持常态不變!

4. 成員變量與局部變量的對比

我們在上面說過,類中的屬性其實就是變量,有成員變量和靜态變量。但是我們知道,還有一種局部變量,那麼成員變量與局部變量有什麼差別呢?我們來看下表:

差別 局部變量 成員變量
位置 定義在方法内 定義在方法外,類的裡面
預設值 沒有預設值 系統提供預設值,與之前講的數組一緻
作用域 所在的{} 在整個類中
重名 在不同的作用域可以重名 不能重名
生命周期 方法執行完被銷毀 當對象被銷毀的時候銷毀

另外我們還要注意,局部變量是可以與執行個體變量重名的。如果成員變量和局部變量的名稱相同,Java會遵循就近原則,就是哪個近采用哪個變量。

------------------------------正片已結束,來根事後煙----------------------------

四. 結語

至此,壹哥就把與類相關的内容給大家講解完畢了,現在你知道該如何建立一個類了嗎?我們在建立類時,要遵守定義類時的命名規則和基本文法,掌握常用關鍵字的基本含義,多寫多練自然就會啦。

在下一篇文章中,壹哥會繼續講解面向對象中關于對象的内容,敬請期待哦。如果你獨自學習覺得有很多困難,可以加入壹哥的學習互助群,大家一起交流學習。

五. 配套視訊

如果你不習慣閱讀技術文章,或是對文中的技術概念不能很好地了解,可以來看看壹哥幫你篩選出的視訊教程。與本文配套的Java學習視訊,連結如下:

player.bilibili.com/player.html…

六. 今日作業

1. 第一題

設計一個學生類,并設計出一個學生應有的屬性,請把實作代碼在評論區貼出來哦。