趣談Java之——與對象的初次約會



在這裏插入圖片描述

閱讀文本大概需要 6.66 分鐘。

前言

大家好,這是首發於公衆號「蝸牛永動機」的趣談 Java 系列教程。學習一門語言最好的辦法,就是教會別人。在這個公衆號,我會從最基礎的教程開始寫起,一方面是爲了更好地複習鞏固 Java 基礎,另一方面也是慢慢進階的過程。喜歡的朋友請點關注,每天一小步,一年後就是一大步。廢話不多說,開始今天的文章。


一、前世今生


學習一門語言之前,最好的方式是先了解這門語言的前世今生和用途,它有什麼特點。知己知彼,方能學好編程。

今天這篇文章沒有一上來就直接從 Java 的基礎語法開始,而是先介紹 Java 的前世今生和最核心的部分,即面向對象編程思想。這對我們後續的學習會有很大幫助,而不是一上來就先一頓猛如虎地騷操作,不管三七二十一直接三下五除二從基礎語法搞起,都不知道這門語言是幹嘛的,完全就是在盲目地學,很容易放棄。


1、Java 是什麼


Java 是一門解釋型、跨平臺、面向對象的編程語言,是目前最流行的編程語言之一,1996 年由 Sun 公司發佈第一個版本,也即 Java 1.0。截止目前 Java 迭代的版本如下:

在這裏插入圖片描述

2019 最新編程語言排名

在這裏插入圖片描述

這是比較權威的編程語言排行網站 TIOBE 上的最新排行,從上圖中我們可以看到,排行前十的編程語言中,Java 依舊寶刀未老,仍然穩坐鐵王座。


2、Java 有什麼特點

在這裏插入圖片描述

3、Java 的應用


在這裏插入圖片描述

早期 Java 在桌面應用的開發是很廣泛的,現在應用最廣泛的主要還是在 Web 開發和大數據開發上,在 Android 方面的應用越來飽和,新人不建議再入 Android 的坑。


二、面向對象 VS 面向過程


在接觸面向對象之前,我們首先回想下第一次接觸 C 語言的情景,會發現在學習 C 語言的時候,在設計一個計算機的程序時,我們會根據解決問題的步驟,將程序組織爲一系列的線性代碼或函數,然後依次調用訪問即可,這種編程的思想本質上就是面向過程的思想。

但是,面向對象的思想則有着本質的不同,思考方式不再是第一步先做什麼,第二步再做什麼。面向對象的思想要求我們面對一個問題時,從以下角度來思考問題:

  • 這個問題中可以抽象出哪些類和對象;
  • 這些類和對象具有哪些屬性和方法;
  • 這些類之間存在哪些關係。

三、面向對象編程思想


面向對象編程思想的關鍵是抽象。它將現實世界中的事物理解爲由屬性和對這些屬性實施的行爲的統一體。這句話怎麼理解呢?也就是說面向對象編程的思想主要如下:

  • 從現實世界中客觀存在的事物(也即對象)出發來構造軟件系統
  • 運用人類的自然思維方式來認識問題-如抽象、分類、繼承、多態等
  • 根據這些事物的本質特點來抽象表示爲系統中的類

那麼,我們要如何抽象出一個類呢?主要有兩個方面,一個是它的靜態屬性,一個則是它的動態屬性。分別對應對象中的屬性(或成員變量)方法

舉例

假設現在有一個錄音機類,那麼我們該如何抽象出這個錄音機類呢?一樣的道理,還是從兩方面入手:靜態屬性和動態屬性。首先,錄音機有哪些靜態屬性呢?有運轉速度、運轉方向和顏色等。有哪些動態屬性(方法)呢?錄音機可以播放,可以錄音,同時也就可以快進或者快退,這些都是它的方法。

在這裏插入圖片描述

對於類來說,它描述了具有相同特性(屬性)和行爲(方法)的對象集合,是同種對象的集合與抽象。但是具體到某一個對象來說,它有沒有相關的屬性呢?當然是有的,比如從錄音機這個類中實例化出來兩個錄音機:錄音機 A 和錄音機 B,它們都有運轉速度、運轉方向和顏色等屬性,只是相應的值不一樣。這樣,根據這些屬性的不同我們就可以區分出錄音機 A 和 錄音機 B。所以,可以根據屬性來區分不同的對象

那麼,是不是根據方法也可以區分不同的對象呢?答案是否定的。俗話說,甭管黑貓白貓,捉到老鼠就是好貓。現在問題來了,貓是一個類,現在有一隻黑貓和白貓,假設定義一個方法叫捉老鼠(),而不管是黑貓也好,白貓也好,都會捉老鼠。那麼,我們要怎麼根據捉老鼠這個方法來區分黑貓和白貓呢?很顯然區分不了。但如果按顏色分,那就是一目瞭然的事兒。

總結

1、類是一類事物(同種對象)的集合與抽象,類中定義了這一類對象所具有的靜態屬性和動態屬性;

2、對象可以看成這個類的一個具體實例,也就是一個對象。換句話說,實例和對象指的是一回事;

3、根據類的屬性可以區分這個類的不同對象,根據方法則不能區分。


四、面向對象的基本特徵


面向對象主要有三個基本特徵:封裝、繼承和多態。通常我們會認爲抽象也是面向對象的基本特徵之一,但其實抽象只是面向對象的重要部分,因爲所有的編程語言都需要抽象。

封裝: 將操作(方法)和操作所涉及的數據(成員變量)捆綁在一起,將對象的實現細節隱藏起來,然後通過公用的方法來暴露對象的功能。

繼承: 一個新類繼承原有類的基本特徵,直接獲得原有類的屬性和方法。其中,新類也叫子類或派生類,原有類則叫父類或基類。

多態: 也叫動態綁定、後期綁定或運行時綁定。多態主要指同一名稱的方法可以有多種不同的功能或相同的接口可以有多種實現方法。


五、Java 與面向對象


1、一切皆對象,對象是 Java 程序的核心;

2、靜態屬性(成員變量) + 動態屬性(方法)= 類定義,也就是說對象可以看成靜態屬性和動態屬性的封裝體;

3、每個對象都擁有其類型。類是用來創建同一類型的對象的模板,在一個類中定義了該類所具有的成員變量和方法;

從前面知識點的學習中我們知道了在 Java 中類和對象是分不開的。要向一個對象「發送消息」,我們得先定義一個類,然後纔有對象。緊接着我們可以在類中定義這個類的成員變量和方法,當向這個對象發送請求(消息)時,與之關聯的方法就會被調用。

那麼在 Java 中要怎麼抽象出一個類並寫成代碼呢?無非就是將一類事物抽象成一個類,然後在這個類中寫好它的成員變量和方法。

比如,現在我們要封裝一個籃球,抽象出籃球這個類,在 Java 中要怎麼寫代碼呢?代碼如下:

    /**
     * Java 裏面將一類事物封裝成一個類,首先得寫 class 來定義這個類,名字可以
     * 自取,遵循駝峯原則,但類的首字母要大寫。這裏命名爲 Basketball
     */
    public class Basketball {
        /**
         * 定義類的靜態屬性(成員變量)。比如這裏,籃球這個類的靜態屬性有顏色、
         * 形狀和重量等。定義的時候需要指明屬性的類型,比如重量這個屬性,類型
         * 爲 float
         */
        String color; // 定義屬性:籃球的顏色
        String shape; // 定義顏色:籃球的形狀
        float weight; // 定義屬性:籃球的重量
    
        /**
         * 上面定義了籃球這個類的靜態屬性,接下來定義它的方法。比如
         * 打氣這個方法,定義爲 pump()
         */
        void pump() {
            System.out.println("籃球已經充滿氣了!");
        }
    
        public static void main(String[] args) {
            Basketball b = new Basketball(); // 用 new 關鍵字創建一個籃球
            b.pump(); // 讓這個籃球去調用打氣的方法,給籃球打氣
        }
    }


六、爲什麼要使用面向對象編程


目的: 提高軟件開發的可重用性、可維護性和可擴展性

傳統的軟件開發主要是面向過程的,這意味着方法和屬性一般是分開的,當軟件系統比較大的時候想要複用相應的模塊就很麻煩,並且複用的層次基本也僅限於方法層面。而面向對象則不同,它將對象的方法和屬性封裝在一個類中,這讓我們可以直接複用方法和屬性的統一整體。換句話說,我們可以直接對一個類進行復用,這大大提高了軟件開發的可重用性。同時這意味着我們的代碼更易於維護和擴展。


寫在最後


至此「趣談 Java 之——與對象的初次約會」篇就已結束,接下來給自己三分鐘的時間回想一下,今天這篇都學習到了什麼。

如果你按我說的去做,你會發現你只能回憶起一些內容,很難把全部的知識都記住。這是很正常的情況,所以需要溫故而知新。最後,我把這篇文章的知識點整理成思維導圖送給大家。

在這裏插入圖片描述


推薦閱讀:

全網最全的編程學習資源,PDF 電子書大合集

歡迎關注我的公衆號「蝸牛永動機」,回覆 1024 免費獲取 5G 編程學習資源~

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