- 程序員面試筆試通關寶典
- 聚慕課教育研發中心
- 3366字
- 2021-12-10 16:52:09
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修飾的方法);抽象類可以有靜態代碼塊和靜態方法。
- Spring Cloud Alibaba微服務架構設計與開發實戰
- 造個小程序:與微信一起干件正經事兒
- 數據結構和算法基礎(Java語言實現)
- Java Web程序設計
- Scratch真好玩:教小孩學編程
- Python數據分析(第2版)
- Python:Master the Art of Design Patterns
- 自然語言處理Python進階
- 利用Python進行數據分析(原書第3版)
- Go語言底層原理剖析
- C++ Application Development with Code:Blocks
- OpenCV Android Programming By Example
- AutoCAD基礎教程
- Java Web開發教程:基于Struts2+Hibernate+Spring
- Koa與Node.js開發實戰