官术网_书友最值得收藏!

2.2 面向對象

Java是一種面向對象的程序設計語言,了解面向對象的編程思想對于學習Java開發尤其重要。面向對象技術是一種將數據抽象和信息隱藏的技術,它使軟件的開發更加簡單化,不僅符合人們的思維習慣,而且降低了軟件的復雜性,同時提高了軟件的生產效率,因此得到了廣泛的應用。

2.2.1 面向對象的三大特性

幾乎所有面向對象的編程設計語言都離不開封裝、繼承和多態。

1.封裝

面向對象的核心思想就是封裝。封裝是指將對象的屬性和行為進行封裝,不需要讓外界知道具體實現的細節。封裝可以使數據的安全性得到保證,當把過程和數據封裝后,只能通過已定義的接口對數據進行訪問。

(1)屬性:Java中類的屬性的訪問權限的默認值不是private,通過加private(私有)修飾符來隱藏該屬性或方法,從而只能在類的內部進行訪問。對于類中的私有屬性,要對其給出方法(如:getXxx(),setXxx())來訪問私有屬性,保證對私有屬性操作的安全性。

(2)方法的封裝:對于方法的封裝,既需要公開也需要隱藏。方法公開的是方法的聲明(定義),只需要知道參數和返回值就可以調用該方法;隱藏方法的實現會使已改變的內容對架構的影響最小化。

(3)封裝的優點:良好的封裝能夠減少耦合;類內部的結構可以自由修改;可以對成員變量進行更精確的控制;隱藏信息,實現細節。

2.繼承

繼承主要指的是類與類之間的關系。通過繼承,可以更高效地對原有類的功能進行擴展。繼承不僅增強了代碼的復用性,提高了開發效率,更為程序的修改補充提供了便利。

Java中的繼承要使用extends關鍵字,并且Java中只允許單繼承,即一個類只能有一個父類。這樣的繼承關系呈樹狀,體現了Java的簡單性。子類只能繼承在父類中可以訪問的屬性和方法,實際上父類中私有的屬性和方法也會被繼承,只是子類無法訪問。

子類并不能全部繼承父類的成員變量或成員方法,規則如下:

(1)能夠繼承父類的public和protected成員變量(方法),但不能繼承父類的private成員變量(方法)。

(2)對于父類的包的訪問成員變量(方法)的權限,如果子類和父類在同一個包下,則子類能夠繼承;否則,子類不能夠繼承。

(3)對于子類可以繼承父類的成員變量(方法),如果在子類中出現了同名稱的成員變量(方法),則會發生隱藏現象,即子類的成員變量(方法)會屏蔽掉父類的同名成員變量(方法)。如果要在子類中訪問父類中同名成員變量(方法),需要使用super關鍵字來進行引用。

3.多態

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

(2)多態是把子類型對象主觀地看作其父類型的對象,因此其父類型就可以是很多種類型。

(3)多態的特性:對象實例確定則不可改變(客觀不可改變);只能調用編譯時的類型所定義的方法;運行時會根據運行時的類型去調用相應類型中定義的方法。

2.2.2 類和對象

類是一個模板,它描述一類對象的行為和狀態。

對象是類的一個實例,有狀態和行為。

1.類

1)類的聲明

在使用類之前,必須先聲明,類的聲明格式如下:

    [標識符] class 類名稱
    {
        //類的成員變量
        //類的方法
    }

(1)聲明類需要使用關鍵字class,在class之后是類的名稱。

(2)標識符可以是public、private、protected或者完全省略。

(3)類名應該是由一個或多個有意義的單詞連綴而成,每個單詞首字母大寫,單詞之間不要使用其他分隔符。

2)類的方法

類的方法有四個要素,分別是方法名稱、返回值類型、參數和方法體。定義一個方法的語法格式如下:

    修飾符 返回值類型 方法名稱(參數列表)
    {
        //方法體
        return 返回值;
    }

方法包含一個方法頭和一個方法體。方法頭包括修飾符、返回值類型、方法名稱和參數列表。

(1)修飾符:定義了該方法的訪問類型,是可選的。

(2)返回值類型:指定了方法返回的數據類型。它可以是任意有效的類型,如果方法沒有返回值,則其返回類型必須是void,不能省略。方法體中的返回值類型要與方法頭中定義的返回值類型一致。

(3)方法名稱:要遵循Java標識符命名規范,通常以英文中的動詞開頭。

(4)參數列表:由類型、標識符組成的,每個參數之間使用逗號分隔開。方法可以沒有參數,但方法名后面的括號不能省略。

(5)方法體:指方法頭后{}內的內容,主要用來實現一定的功能。

2.對象

對象是根據類創建的。在Java中,使用關鍵字new來創建一個新的對象。創建對象的過程如下:

(1)聲明:聲明一個對象,包括對象名稱和對象類型。

(2)實例化:使用關鍵字new來創建一個對象。

(3)初始化:使用new創建對象時,會調用構造方法初始化對象。

對象(object)是對類的實例化。在Java的世界里,“一切皆為對象”,面向對象的核心就是對象。由類產生對象的格式如下:

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

訪問對象的成員變量或者方法格式如下:

    對象名稱.屬性名
    對象名稱.方法名()
3.構造方法

在創建類的對象時,對類中的所有成員變量都要初始化。Java允許對象在創建時進行初始化,初始化的實現是通過構造方法來完成的。

在創建類的對象時,使用new關鍵字和一個與類名相同的方法來完成,該方法在實例化過程中被調用,成為構造方法。構造方法是一種特殊的成員方法,主要特點如下:

(1)構造方法的名稱必須與類的名稱完全相同。

(2)構造方法不返回任何數據類型,也不需要使用void關鍵字聲明。

(3)構造方法的作用是創建對象并初始化成員變量。

(4)在創建對象時,系統會自動調用類的構造方法。

(5)構造方法一般用public關鍵字聲明。

(6)每個類至少有一個構造方法。如果不定義構造方法,Java將提供一個默認的不帶參數且方法體為空的構造方法。

注意類是對某一類事物的描述,是抽象的、概念上的定義,對象是實際存在的該類事物的個體。對象和對象之間可以不同,改變其中一個對象的某些屬性,不會影響到其他的對象。

2.2.3 抽象類和抽象方法

在面向對象中,所有的對象都是通過類來實現的,但是反過來,并不是所有的類都是用來描繪對象的,若一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。抽象方法指一些只有方法聲明,而沒有具體方法體的方法。抽象方法一般存在于抽象類或接口中。

1.抽象類

1)抽象類的使用原則

(1)抽象方法必須為public或者protected,默認為public。

(2)抽象類不能直接實例化,需要依靠子類采用向上轉型的方式處理。

(3)抽象類必須有子類,使用extends繼承,一個子類只能繼承一個抽象類。

(4)子類如果不是抽象類,則必須重寫抽象類之中的全部抽象方法。

(5)抽象類不能使用final關鍵字聲明,因為抽象類必須有子類,而final定義的類不能有子類。

2)抽象類在應用的過程中,需要注意以下幾點:

(1)抽象類不能被實例化,如果被實例化,就會報錯,編譯無法通過。只有抽象類的非抽象子類可以創建對象。

(2)抽象類中不一定包含抽象方法,但是有抽象方法的類必定是抽象類。

(3)抽象類中的抽象方法只是聲明,不包含方法體,就是不給出方法的具體實現,也就是方法的具體功能。

(4)構造方法,類方法(用static修飾的方法)不能聲明為抽象方法。

(5)抽象類的子類必須給出抽象類中的抽象方法的具體實現,除非該子類也是抽象類。

2.抽象方法

1)抽象方法的聲明

聲明一個抽象類的語法格式如下:

    abstract 返回類型 方法名([參數表]);

注意抽象方法沒有定義方法體,方法名后面直接跟一個分號,而不是花括號。

2)抽象方法的實現

繼承抽象類的子類必須重寫父類的抽象方法,否則,該子類也必須聲明為抽象類。最終,必須有子類實現父類的抽象方法,否則,從最初的父類到最終的子類都不能用來實例化對象。

2.2.4 接口

接口在Java編程語言中是一個抽象類型,是抽象方法的集合。接口通常以interface來聲明。一個類通過繼承接口的方式來繼承接口的抽象方法。

1.接口的聲明
    interface 接口名稱 [extends 其他的接口名] {
        //聲明變量
        //抽象方法
    }
2.接口的實現

當類實現接口時,類要實現接口中所有的方法。否則,類必須聲明為抽象類。類使用implements關鍵字實現接口。在類聲明中,implements關鍵字放在class聲明后面。

    class 類名稱 implements 接口名稱[,其他接口]{
        …
    }
3.接口與抽象類的異同

相同點:

(1)都可以被繼承。

(2)都不能被直接實例化。

(3)都可以包含抽象方法。

(4)派生類必須實現未實現的方法。

不同點:

(1)接口支持多繼承;抽象類不能實現多繼承。

(2)一個類只能繼承一個抽象類,而一個類卻可以實現多個接口。

(3)接口中的成員變量只能是public、static、final類型的;抽象類中的成員變量可以是各種類型的。

(4)接口只能定義抽象方法;抽象類既可以定義抽象方法,也可以定義實現的方法。

(5)接口中不能含有靜態代碼塊以及靜態方法(用static修飾的方法);抽象類可以有靜態代碼塊和靜態方法。

主站蜘蛛池模板: 鄂托克旗| 辉南县| 荔浦县| 新宁县| 堆龙德庆县| 尤溪县| 漯河市| 施甸县| 龙川县| 大悟县| 老河口市| 安徽省| 兰考县| 湖州市| 锡林浩特市| 镇赉县| 清镇市| 江安县| 泗阳县| 巨鹿县| 松原市| 湟源县| 峡江县| 融水| 汉川市| 吐鲁番市| 龙里县| 双桥区| 仙桃市| 双鸭山市| 邻水| 临潭县| 新兴县| 健康| 绥滨县| 舞钢市| 桂阳县| 巩留县| 新营市| 元氏县| 湖州市|