java基础知识——面向对象基本概念
文章目錄
- Java基本概念
- 源文件聲明規(guī)則
- Java包
- Import語句
- 繼承類型
- 繼承的特性
- 繼承關(guān)鍵字
- super 與 this 關(guān)鍵字
- 構(gòu)造器
- 方法的重寫規(guī)則
- 重載(Overload)
- 重寫與重載之間的區(qū)別
- java 接口
- 接口與類相似點:
- 接口與類的區(qū)別:
- 接口特性
- 抽象類和接口的區(qū)別
- 接口的聲明
- 接口的實現(xiàn)
- 接口的繼承
- 接口的多繼承
- 標(biāo)記接口
Java基本概念
Java作為一種面向?qū)ο笳Z言。支持以下基本概念:
- 多態(tài)
多態(tài)是同一個行為具有多個不同表現(xiàn)形式或形態(tài)的能力。
多態(tài)就是同一個接口,使用不同的實例而執(zhí)行不同操作
- 繼承
繼承是java面向?qū)ο缶幊碳夹g(shù)的一塊基石,因為它允許創(chuàng)建分等級層次的類。
繼承就是子類繼承父類的特征和行為,使得子類對象(實例)具有父類的實例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。繼承需要符合的關(guān)系是:is-a,父類更通用,子類更具體。
類的繼承格式
在 Java 中通過 extends 關(guān)鍵字可以申明一個類是從另外一個類繼承而來的,一般形式如下:
- 封裝
在面向?qū)ο蟪淌皆O(shè)計方法中,封裝(英語:Encapsulation)是指一種將抽象性函式接口的實現(xiàn)細(xì)節(jié)部份包裝、隱藏起來的方法。
封裝可以被認(rèn)為是一個保護屏障,防止該類的代碼和數(shù)據(jù)被外部類定義的代碼隨機訪問。
要訪問該類的代碼和數(shù)據(jù),必須通過嚴(yán)格的接口控制。
封裝最主要的功能在于我們能修改自己的實現(xiàn)代碼,而不用修改那些調(diào)用我們代碼的程序片段。
適當(dāng)?shù)姆庋b可以讓程式碼更容易理解與維護,也加強了程序源代碼的安全性。
1.修改屬性的可見性來限制對屬性的訪問(一般限制為private)
2.對每個值屬性提供對外的公共方法訪問,也就是創(chuàng)建一對賦取值方法,用于對私有屬性的訪問
- 抽象
在面向?qū)ο蟮母拍钪?#xff0c;所有的對象都是通過類來描繪的,但是反過來,并不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。
1.抽象類除了不能實例化對象之外,類的其它功能依然存在,成員變量、成員方法和構(gòu)造方法的訪問方式和普通類一樣。
2.由于抽象類不能實例化對象,所以抽象類必須被繼承,才能被使用。也是因為這個原因,通常在設(shè)計階段決定要不要設(shè)計抽象類。
3.父類包含了子類集合的常見的方法,但是由于父類本身是抽象的,所以不能使用這些方法。
4.在Java中抽象類表示的是一種繼承關(guān)系,一個類只能繼承一個抽象類,而一個類卻可以實現(xiàn)多個接口。
5.在Java語言中使用abstract class來定義抽象類
- 類
類:類是一個模板,它描述一類對象的行為和狀態(tài)。類可以看成是創(chuàng)建Java對象的模板。
- 對象
對象:對象是類的一個實例(對象不是找個女朋友),有狀態(tài)和行為。例如,一條狗是一個對象,它的狀態(tài)有:顏色、名字、品種;行為有:搖尾巴、叫、吃等。
對象是根據(jù)類創(chuàng)建的。在Java中,使用關(guān)鍵字new來創(chuàng)建一個新的對象。創(chuàng)建對象需要以下三步:
1.聲明:聲明一個對象,包括對象名稱和對象類型。
2.實例化:使用關(guān)鍵字new來創(chuàng)建一個對象。
3.初始化:使用new創(chuàng)建對象時,會調(diào)用構(gòu)造方法初始化對象。
- 實例
- 方法
- 重載
源文件聲明規(guī)則
當(dāng)在一個源文件中定義多個類,并且還有import語句和package語句時,要特別注意這些規(guī)則。
- 一個源文件中只能有一個public類
- 一個源文件可以有多個非public類
- 源文件的名稱應(yīng)該和public類的類名保持一致。例如:源文件中public類的類名是Employee,那么源文件應(yīng)該命名為Employee.java。
- 如果一個類定義在某個包中,那么package語句應(yīng)該在源文件的首行。
- 如果源文件包含import語句,那么應(yīng)該放在package語句和類定義之間。如果沒有package語句,那么import語句應(yīng)該在源文件中最前面。
- import語句和package語句對源文件中定義的所有類都有效。在同一源文件中,不能給不同的類不同的包聲明。
- 類有若干種訪問級別,并且類也分不同的類型:抽象類和final類等。
Java包
包主要用來對類和接口進行分類。當(dāng)開發(fā)Java程序時,可能編寫成百上千的類,因此很有必要對類和接口進行分類
Import語句
在Java中,如果給出一個完整的限定名,包括包名、類名,那么Java編譯器就可以很容易地定位到源代碼或者類。Import語句就是用來提供一個合理的路徑,使得編譯器可以找到某個類。
繼承類型
需要注意的是 Java 不支持多繼承,但支持多重繼承。
繼承的特性
1.子類擁有父類非 private 的屬性、方法。
2.子類可以擁有自己的屬性和方法,即子類可以對父類進行擴展。
3.子類可以用自己的方式實現(xiàn)父類的方法。
4.Java 的繼承是單繼承,但是可以多重繼承,單繼承就是一個子類只能繼承一個父類,多重繼承就是,例如 A 類繼承 B 類,B 類繼承 C 類,所以按照關(guān)系就是 C 類是 B 類的父類,B 類是 A 類的父類,這是 Java 繼承區(qū)別于 C++ 繼承的一個特性。
5.提高了類之間的耦合性(繼承的缺點,耦合度高就會造成代碼之間的聯(lián)系越緊密,代碼獨立性越差)。
繼承關(guān)鍵字
繼承可以使用 extends 和 implements 這兩個關(guān)鍵字來實現(xiàn)繼承,而且所有的類都是繼承于 java.lang.Object,當(dāng)一個類沒有繼承的兩個關(guān)鍵字,則默認(rèn)繼承object(這個類在 java.lang 包中,所以不需要 import)祖先類。
- extends關(guān)鍵字
在 Java 中,類的繼承是單一繼承,也就是說,一個子類只能擁有一個父類,所以 extends 只能繼承一個類。 - implements關(guān)鍵字
使用 implements 關(guān)鍵字可以變相的使java具有多繼承的特性,使用范圍為類繼承接口的情況,可以同時繼承多個接口(接口跟接口之間采用逗號分隔)。
super 與 this 關(guān)鍵字
- super關(guān)鍵字:我們可以通過super關(guān)鍵字來實現(xiàn)對父類成員的訪問,用來引用當(dāng)前對象的父類。
- this關(guān)鍵字:指向自己的引用。
構(gòu)造器
子類是不繼承父類的構(gòu)造器(構(gòu)造方法或者構(gòu)造函數(shù))的,它只是調(diào)用(隱式或顯式)。如果父類的構(gòu)造器帶有參數(shù),則必須在子類的構(gòu)造器中顯式地通過 super 關(guān)鍵字調(diào)用父類的構(gòu)造器并配以適當(dāng)?shù)膮?shù)列表。
如果父類構(gòu)造器沒有參數(shù),則在子類的構(gòu)造器中不需要使用 super 關(guān)鍵字調(diào)用父類構(gòu)造器,系統(tǒng)會自動調(diào)用父類的無參構(gòu)造器
方法的重寫規(guī)則
- 參數(shù)列表必須完全與被重寫方法的相同。
- 返回類型與被重寫方法的返回類型可以不相同,但是必須是父類返回值的派生類(java5 及更早版本返回類型要一樣,java7 及更高版本可以不同)。
- 訪問權(quán)限不能比父類中被重寫的方法的訪問權(quán)限更低。例如:如果父類的一個方法被聲明為 public,那么在子類中重寫該方法就不能聲明為 protected。
- 父類的成員方法只能被它的子類重寫。
- 聲明為 final 的方法不能被重寫。
- 聲明為 static 的方法不能被重寫,但是能夠被再次聲明。
- 子類和父類在同一個包中,那么子類可以重寫父類所有方法,除了聲明為 private 和 final 的方法。
- 子類和父類不在同一個包中,那么子類只能夠重寫父類的聲明為 public 和 protected 的非 final 方法。
- 重寫的方法能夠拋出任何非強制異常,無論被重寫的方法是否拋出異常。但是,重寫的方法不能拋出新的強制性異常,或者比被重寫方法聲明的更廣泛的強制性異常,反之則可以。
- 構(gòu)造方法不能被重寫。
- 如果不能繼承一個方法,則不能重寫這個方法。
重載(Overload)
重載(overloading) 是在一個類里面,方法名字相同,而參數(shù)不同。返回類型可以相同也可以不同。
每個重載的方法(或者構(gòu)造函數(shù))都必須有一個獨一無二的參數(shù)類型列表。
最常用的地方就是構(gòu)造器的重載。
重載規(guī)則:
- 被重載的方法必須改變參數(shù)列表(參數(shù)個數(shù)或類型不一樣);
- 被重載的方法可以改變返回類型;
- 被重載的方法可以改變訪問修飾符;
- 被重載的方法可以聲明新的或更廣的檢查異常;
- 方法能夠在同一個類中或者在一個子類中被重載。
- 無法以返回值類型作為重載函數(shù)的區(qū)分標(biāo)準(zhǔn)。
重寫與重載之間的區(qū)別
| 參數(shù)列表 | 必須修改 | 一定不能修改 |
| 返回類型 | 可以修改 | 一定不能修改 |
| 異常 | 可以修改 | 可以減少或刪除,一定不能拋出新的或者更廣的異常 |
| 訪問 | 可以修改 | 一定不能做更嚴(yán)格的限制(可以降低限制) |
方法的重寫(Overriding)和重載(Overloading)是java多態(tài)性的不同表現(xiàn),重寫是父類與子類之間多態(tài)性的一種表現(xiàn),重載可以理解成多態(tài)的具體表現(xiàn)形式。
1.方法重載是一個類中定義了多個方法名相同,而他們的參數(shù)的數(shù)量不同或數(shù)量相同而類型和次序不同,則稱為方法的重載(Overloading)。
2.方法重寫是在子類存在方法與父類的方法的名字相同,而且參數(shù)的個數(shù)與類型一樣,返回值也一樣的方法,就稱為重寫(Overriding)。
3.方法重載是一個類的多態(tài)性表現(xiàn),而方法重寫是子類與父類的一種多態(tài)性表現(xiàn)。
java 接口
接口(英文:Interface),在JAVA編程語言中是一個抽象類型,是抽象方法的集合,接口通常以interface來聲明。一個類通過繼承接口的方式,從而來繼承接口的抽象方法。
接口并不是類,編寫接口的方式和類很相似,但是它們屬于不同的概念。類描述對象的屬性和方法。接口則包含類要實現(xiàn)的方法。
除非實現(xiàn)接口的類是抽象類,否則該類要定義接口中的所有方法。
接口無法被實例化,但是可以被實現(xiàn)。一個實現(xiàn)接口的類,必須實現(xiàn)接口內(nèi)所描述的所有方法,否則就必須聲明為抽象類。另外,在 Java 中,接口類型可用來聲明一個變量,他們可以成為一個空指針,或是被綁定在一個以此接口實現(xiàn)的對象。
接口與類相似點:
- 一個接口可以有多個方法。
- 接口文件保存在 .java 結(jié)尾的文件中,文件名使用接口名。
接口的字節(jié)碼文件保存在 .class 結(jié)尾的文件中。 - 接口相應(yīng)的字節(jié)碼文件必須在與包名稱相匹配的目錄結(jié)構(gòu)中。
接口與類的區(qū)別:
- 接口不能用于實例化對象。
- 接口沒有構(gòu)造方法。
- 接口中所有的方法必須是抽象方法。
- 接口不能包含成員變量,除了 static 和 final 變量。
- 接口不是被類繼承了,而是要被類實現(xiàn)。
- 接口支持多繼承。
接口特性
- 接口中每一個方法也是隱式抽象的,接口中的方法會被隱式的指定為 public abstract(只能是 public abstract,其他修飾符都會報錯)。
- 接口中可以含有變量,但是接口中的變量會被隱式的指定為 public static final 變量(并且只能是 public,用 private 修飾會報編譯錯誤)。
- 接口中的方法是不能在接口中實現(xiàn)的,只能由實現(xiàn)接口的類來實現(xiàn)接口中的方法。
抽象類和接口的區(qū)別
- 抽象類中的方法可以有方法體,就是能實現(xiàn)方法的具體功能,但是接口中的方法不行。
- 抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是 public static final 類型的。
- 接口中不能含有靜態(tài)代碼塊以及靜態(tài)方法(用 static 修飾的方法),而抽象類是可以有靜態(tài)代碼塊和靜態(tài)方法。
- 一個類只能繼承一個抽象類,而一個類卻可以實現(xiàn)多個接口。
注:JDK 1.8 以后,接口里可以有靜態(tài)方法和方法體了。
接口的聲明
接口的聲明語法格式如下:
[可見度] interface 接口名稱 [extends 其他的接口名] {// 聲明變量// 抽象方法 }Interface關(guān)鍵字用來聲明一個接口。下面是接口聲明的一個簡單例子。
import java.lang.*; //引入包public interface NameOfInterface {//任何類型 final, static 字段//抽象方法 }接口有以下特性:
- 接口是隱式抽象的,當(dāng)聲明一個接口的時候,不必使用abstract關(guān)鍵字。
- 接口中每一個方法也是隱式抽象的,聲明時同樣不需要abstract關(guān)鍵字。
- 接口中的方法都是公有的。
實例
接口的實現(xiàn)
當(dāng)類實現(xiàn)接口的時候,類要實現(xiàn)接口中所有的方法。否則,類必須聲明為抽象的類。
類使用implements關(guān)鍵字實現(xiàn)接口。在類聲明中,Implements關(guān)鍵字放在class聲明后面。
實現(xiàn)一個接口的語法,可以使用這個公式:
...implements 接口名稱[, 其他接口名稱, 其他接口名稱..., ...] ...實例
public class MammalInt implements Animal{public void eat(){System.out.println("Mammal eats");}public void travel(){System.out.println("Mammal travels");}public int noOfLegs(){return 0;}public static void main(String args[]){MammalInt m = new MammalInt();m.eat();m.travel();} }以上實例編譯運行結(jié)果如下:
Mammal eats Mammal travels重寫接口中聲明的方法時,需要注意以下規(guī)則:
- 類在實現(xiàn)接口的方法時,不能拋出強制性異常,只能在接口中,或者繼承接口的抽象類中拋出該強制性異常。
- 類在重寫方法時要保持一致的方法名,并且應(yīng)該保持相同或者相兼容的返回值類型。
- 如果實現(xiàn)接口的類是抽象類,那么就沒必要實現(xiàn)該接口的方法。
在實現(xiàn)接口的時候,也要注意一些規(guī)則:
- 一個類可以同時實現(xiàn)多個接口。
- 一個類只能繼承一個類,但是能實現(xiàn)多個接口。
- 一個接口能繼承另一個接口,這和類之間的繼承比較相似。
接口的繼承
一個接口能繼承另一個接口,和類之間的繼承方式比較相似。接口的繼承使用extends關(guān)鍵字,子接口繼承父接口的方法。
下面的Sports接口被Hockey和Football接口繼承:
// 文件名: Sports.java public interface Sports {public void setHomeTeam(String name);public void setVisitingTeam(String name); }// 文件名: Football.java public interface Football extends Sports {public void homeTeamScored(int points);public void visitingTeamScored(int points);public void endOfQuarter(int quarter); }// 文件名: Hockey.java public interface Hockey extends Sports {public void homeGoalScored();public void visitingGoalScored();public void endOfPeriod(int period);public void overtimePeriod(int ot); }Hockey接口自己聲明了四個方法,從Sports接口繼承了兩個方法,這樣,實現(xiàn)Hockey接口的類需要實現(xiàn)六個方法。
相似的,實現(xiàn)Football接口的類需要實現(xiàn)五個方法,其中兩個來自于Sports接口。
接口的多繼承
在Java中,類的多繼承是不合法,但接口允許多繼承。
在接口的多繼承中extends關(guān)鍵字只需要使用一次,在其后跟著繼承接口。 如下所示:
public interface Hockey extends Sports, Event以上的程序片段是合法定義的子接口,與類不同的是,接口允許多繼承,而 Sports及 Event 可能定義或是繼承相同的方法
標(biāo)記接口
最常用的繼承接口是沒有包含任何方法的接口。
標(biāo)記接口是沒有任何方法和屬性的接口.它僅僅表明它的類屬于一個特定的類型,供其他代碼來測試允許做一些事情。
標(biāo)記接口作用:簡單形象的說就是給某個對象打個標(biāo)(蓋個戳),使對象擁有某個或某些特權(quán)。
例如:java.awt.event 包中的 MouseListener 接口繼承的 java.util.EventListener 接口定義如下:
package java.util; public interface EventListener {}沒有任何方法的接口被稱為標(biāo)記接口。標(biāo)記接口主要用于以下兩種目的:
-
建立一個公共的父接口:
正如EventListener接口,這是由幾十個其他接口擴展的Java API,你可以使用一個標(biāo)記接口來建立一組接口的父接口。例如:當(dāng)一個接口繼承了EventListener接口,Java虛擬機(JVM)就知道該接口將要被用于一個事件的代理方案。 -
向一個類添加數(shù)據(jù)類型:
這種情況是標(biāo)記接口最初的目的,實現(xiàn)標(biāo)記接口的類不需要定義任何接口方法(因為標(biāo)記接口根本就沒有方法),但是該類通過多態(tài)性變成一個接口類型。
總結(jié)
以上是生活随笔為你收集整理的java基础知识——面向对象基本概念的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA中小细节(易忽视和易错点)
- 下一篇: 南昌工伤备案电话(南昌工伤备案)