Java中面向?qū)ο蟮闹R(shí)點(diǎn)總結(jié)
一、對(duì)象和類的概念
類:對(duì)具有相同屬性和方法的一類事物的抽象。
對(duì)象:具體的某一事物,代表自身的一些屬性和方法。
二、類(對(duì)象)之間的關(guān)系
關(guān)聯(lián)(組合、聚合),繼承,依賴、實(shí)現(xiàn)
三、面向?qū)ο笤O(shè)計(jì)思想
面向?qū)ο?--》考慮哪些類,對(duì)象---》類和對(duì)象有屬性、方法-----》類和類之間的關(guān)系
四、重載、重寫(xiě)和隱藏
1). 重載(overload):
方法重載就是多個(gè)方法名稱相同但是參數(shù)類型或者參數(shù)個(gè)數(shù)不同的方法,與返回值類型和修飾符無(wú)關(guān)
class Test { public int test(int a) { return a; } public String test(String a) { return a; } public float test(int a, String b) { return 0f; } public float test(String a, int b) { return 1.0f; } String test(float a) { return ""; } String test(int a) {//該方法不是重載 return ""; } }
前面五個(gè)互為重載,第一個(gè)和第六個(gè)雖然返回值類型不同,但參數(shù)相同,所以第一個(gè)和第六個(gè)參數(shù)不是重載
2). 重寫(xiě)(override):
子類繼承父類時(shí),子類的方法名稱、參數(shù)類型、參數(shù)個(gè)數(shù)與父類完全相同,則認(rèn)為子類重寫(xiě)了父類的方法。
方法重寫(xiě)規(guī)則:
- 參數(shù)列表和原方法完全相同
- 返回值類型和原方法相同或者為父類返回值類型的子類型
- 不能比原方法限制更嚴(yán)格的訪問(wèn)級(jí)別(舉例:父類方法為public,那么子類不能為protected、private)
- 父類方法被定義為final時(shí),則不能被重寫(xiě)
- 父類方法被定義為static時(shí),不能被重寫(xiě),但是可以重寫(xiě)聲明一個(gè)相同的方法(參考隱藏)
- 不能拋出新的異?;虮仍椒ǜ鼜V泛的異常(父類拋出IOException,重寫(xiě)方法不能拋出Exception只能拋出IOException或者IOException子類異常)
3). 隱藏:
隱藏是針對(duì)于父類的成員變量和靜態(tài)方法而言的。子類中聲明了和父類相同的變量名或靜態(tài)方法(方法名相同、參數(shù)列表相同、返回類型相同)則實(shí)現(xiàn)了對(duì)父類成員變量和靜態(tài)方法的隱藏,下面舉個(gè)例子有助理解:
class A { static int a = 1; static int b = 2; int c = 33; public static void printA() { System.out.print(a); } public static void printB() { System.out.print(b); } } class B extends A { static int a = 3; static int b = 4; int c = 44; public static void printB() { System.out.print(b); } } public class Test { public static void main(String[] args) { B.printA(); B.printB(); System.out.print(B.a); A a = new B(); B b = new B(); a.printB(); b.printB(); System.out.print(a.c); System.out.print(b.c); } }
輸出結(jié)果:
1 4 3 2 4 33 44
如果子類中有相同名稱的靜態(tài)方法或變量父類的會(huì)被隱藏,如果子類中存在同名的靜態(tài)方法或變量,則會(huì)隱藏父類中得靜態(tài)方法或變量,此時(shí)子類調(diào)用的就是子類中自己的靜態(tài)方法或變量;如果子類中不存在同名的靜態(tài)方法或變量,則會(huì)調(diào)用父類中的靜態(tài)方法或變量;父類調(diào)用的始終是其本身的靜態(tài)方法和變量。
五、封裝:
封裝是把對(duì)象的屬性和操作結(jié)合為一個(gè)獨(dú)立的整體,隱藏對(duì)象內(nèi)部操作的實(shí)現(xiàn),用戶只需要通過(guò)其對(duì)外提供的方法來(lái)訪問(wèn)該對(duì)象,無(wú)需知道其內(nèi)部實(shí)現(xiàn)細(xì)節(jié)。
優(yōu)點(diǎn):
- 隱藏內(nèi)部實(shí)現(xiàn)細(xì)節(jié),提供公共訪問(wèn)方式
- 類內(nèi)部可以自由修改不影響其調(diào)用者
- 減少耦合度,提高安全性
六、繼承:
繼承是一個(gè)對(duì)象獲取另一個(gè)對(duì)象屬性的過(guò)程,關(guān)鍵字為extends和implements。
1). IS-A關(guān)系(一個(gè)對(duì)象所屬于另一個(gè)對(duì)象):
方式一. 用extends來(lái)實(shí)現(xiàn)繼承:
public class Animal { public void eat() { System.out.println("Animal eating..."); } } public class Mammal extends Animal { public void eat() { System.out.println("Mammal eating..."); } } public class Dog extends Mammal { public void eat() { System.out.println("Dog eating..."); } }
方式二. 用implements來(lái)實(shí)現(xiàn)繼承:
public interface Animal { void eat(); } public class Mammal extends Animal { public void eat() { System.out.println("Mammal eating..."); } } public class Dog extends Mammal { public void eat() { System.out.println("Dog eating..."); } }
無(wú)論方式一還是方式二,我們都可以用instanceof關(guān)鍵字檢查得出:Mammal是一個(gè)Animal(哺乳動(dòng)物也是動(dòng)物);Dog既是一個(gè)Mammal,也是一個(gè)Animal(狗既是哺乳動(dòng)物也是動(dòng)物)。
public class Test { /** * instanceof關(guān)鍵字檢查代碼 */ public static void main(String[] args) { Mammal m = new Mammal(); Dog d = new Dog(); System.out.print(m instanceof Animal); System.out.print(d instanceof Mammal); System.out.print(d instanceof Animal); } }
輸出結(jié)果:
true true true
2). HAS-A關(guān)系(一個(gè)對(duì)象含有另一個(gè)對(duì)象的一些屬性):
public class Car{} public class Speed{} public class Benz extends Car{ private Speed sp; }
Benz含有Spend屬性,但Benz不是Spend
七、多態(tài):
實(shí)現(xiàn)多態(tài)的三個(gè)必要條件:繼承、重寫(xiě)、父類引用指向子類對(duì)象。
1). 向上轉(zhuǎn)型:
我們實(shí)例化一個(gè)Dog對(duì)象可以用 Dog d = new Dog();
我們也可以用 Animal d = new Dog();
,后者就是向上轉(zhuǎn)型(父引用指向子對(duì)象),上面兩種方式創(chuàng)建出來(lái)的對(duì)象d,調(diào)用d.eat();
輸出的結(jié)果都是Dog eating...,這就體現(xiàn)出了java得多態(tài)。向上轉(zhuǎn)型創(chuàng)建的對(duì)象會(huì)遺失掉和父類不同的方法和變量(不能用來(lái)調(diào)用子類特有的方法和變量)。
2). 舉例說(shuō)明:
class A { public String show(D obj) { return ("A and D"); } public String show(A obj) { return ("A and A"); } } class B extends A { public String show(B obj) { return ("B and B"); } public String show(A obj) { return ("B and A"); } } class C extends B {} class D extends B {} class Test { public static void main(String[] args) { A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C(); D d = new D(); System.out.println(a1.show(b)); // ① System.out.println(a1.show(c)); // ② System.out.println(a1.show(d)); // ③ System.out.println(a2.show(b)); // ④ System.out.println(a2.show(c)); // ⑤ System.out.println(a2.show(d)); // ⑥ System.out.println(b.show(b)); // ⑦ System.out.println(b.show(c)); // ⑧ System.out.println(b.show(d)); // ⑨ } }
輸出結(jié)果:
A and A // ①
A and A // ②
A and D // ③
B and A // ④
B and A // ⑤
A and D // ⑥
B and B // ⑦
B and B // ⑧
A and D // ⑨
前三個(gè)比較簡(jiǎn)單不容易出錯(cuò),看看下面幾個(gè):
- ④:a2是A的引用指向B對(duì)象,向上轉(zhuǎn)型創(chuàng)建的對(duì)象會(huì)遺失掉和父類不同的方法和變量,所以a2只能調(diào)用
show(D obj)
、show(A obj)
兩個(gè)方法,所以a2.show(b)
應(yīng)該調(diào)用show(A obj)
方法,B中重寫(xiě)了該方法,所以運(yùn)行時(shí)JVM會(huì)調(diào)用B類中重寫(xiě)的show(A obj)
方法,所以輸出B and A
; - ⑤: 原理同④;
- ⑥:
a2.show(d)
應(yīng)該調(diào)用show(D obj)
方法,B中沒(méi)有重寫(xiě)該方法所以調(diào)用的為A類中的該方法,所以輸出為A and D
; - ⑦⑧⑨:b為B類對(duì)象,可調(diào)用A類中
show(D obj)
、B類中show(B obj)
、B類中show(A obj)
方法,所以輸出如上。
總結(jié)
以上就是關(guān)于Java面向?qū)ο笾R(shí)點(diǎn)整理的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家學(xué)習(xí)或者使用java能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
相關(guān)文章
啟動(dòng)SpringBoot報(bào)錯(cuò)Input length = 1問(wèn)題及解決
這篇文章主要介紹了啟動(dòng)SpringBoot報(bào)錯(cuò)Input length = 1問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05SpringBoot+Redis實(shí)現(xiàn)消息的發(fā)布與訂閱的示例代碼
本文主要介紹了SpringBoot+Redis實(shí)現(xiàn)消息的發(fā)布與訂閱,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04Java數(shù)據(jù)結(jié)構(gòu)之List的使用總結(jié)
List是Java中比較常用的集合類,指一系列存儲(chǔ)數(shù)據(jù)的接口和類,可以解決復(fù)雜的數(shù)據(jù)存儲(chǔ)問(wèn)題,本文就來(lái)拿實(shí)際案例總結(jié)介紹一下List的使用方法,感興趣的朋友快來(lái)看看吧2021-11-11Spring Boot動(dòng)態(tài)加載Jar包與動(dòng)態(tài)配置實(shí)現(xiàn)
隨著項(xiàng)目的不斷演進(jìn)和業(yè)務(wù)需求的增長(zhǎng),很多場(chǎng)景下需要實(shí)現(xiàn)系統(tǒng)的動(dòng)態(tài)性和靈活性,本文主要介紹了Spring Boot動(dòng)態(tài)加載Jar包與動(dòng)態(tài)配置實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02Java動(dòng)態(tài)代理的兩種實(shí)現(xiàn)方式詳解【附相關(guān)jar文件下載】
這篇文章主要介紹了Java動(dòng)態(tài)代理的兩種實(shí)現(xiàn)方式,結(jié)合實(shí)例形式分析了java動(dòng)態(tài)代理的相關(guān)原理、實(shí)現(xiàn)方法與操作技巧,并附帶相關(guān)jar文件供讀者下載,需要的朋友可以參考下2019-03-03