Java封裝、繼承、多態(tài)三大特征的理解
首先先簡(jiǎn)單的說(shuō)一下其3大特性的定義:
封裝:隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外公開(kāi)接口,控制在程序中屬性的讀和修改的訪問(wèn)級(jí)別。將抽象得到的數(shù)據(jù)和行為(或功能)相結(jié)合,形成一個(gè)有機(jī)的整體,也就是將數(shù)據(jù)與操作數(shù)據(jù)的源代碼進(jìn)行有機(jī)的結(jié)合,形成“類(lèi)”,其中數(shù)據(jù)和函數(shù)都是類(lèi)的成員。封裝的目的是增強(qiáng)安全性和簡(jiǎn)化編程,使用者不必了解具體的實(shí)現(xiàn)細(xì)節(jié),而只是要通過(guò)外部接口,一特定的訪問(wèn)權(quán)限來(lái)使用類(lèi)的成員。封裝的基本要求是: 把所有的屬性私有化,對(duì)每個(gè)屬性提供getter和setter方法,如果有一個(gè)帶參的構(gòu)造函數(shù)的話(huà),那一定要寫(xiě)一個(gè)不帶參的構(gòu)造函數(shù)。在開(kāi)發(fā)的時(shí)候經(jīng)常要對(duì)已經(jīng)編寫(xiě)的類(lèi)進(jìn)行測(cè)試,所以在有的時(shí)候還有重寫(xiě)toString方法,但這不是必須的。
繼承:通過(guò)繼承實(shí)現(xiàn)代碼復(fù)用。Java中所有的類(lèi)都是通過(guò)直接或間接地繼承java.lang.Object類(lèi)得到的。繼承而得到的類(lèi)稱(chēng)為子類(lèi),被繼承的類(lèi)稱(chēng)為父類(lèi)。子類(lèi)不能繼承父類(lèi)中訪問(wèn)權(quán)限為private的成員變量和方法。子類(lèi)可以重寫(xiě)父類(lèi)的方法,及命名與父類(lèi)同名的成員變量。但Java不支持多重繼承,即一個(gè)類(lèi)從多個(gè)超類(lèi)派生的能力。在開(kāi)發(fā)中盡量減少繼承關(guān)系,這樣做是為了把程序的耦合度降低。
多態(tài):多態(tài)又分為設(shè)計(jì)時(shí)多態(tài)和運(yùn)行時(shí)多態(tài),例如重載又被稱(chēng)為設(shè)計(jì)時(shí)多態(tài),而對(duì)于覆蓋或繼承的方法,JAVA運(yùn)行時(shí)系統(tǒng)根據(jù)調(diào)用該方法的實(shí)例的類(lèi)型來(lái)決定選擇調(diào)用哪個(gè)方法則被稱(chēng)為運(yùn)行時(shí)多態(tài)??偠灾?,面向?qū)ο蟮脑O(shè)計(jì)的典型特點(diǎn)就是繼承,封裝和多態(tài),這些特點(diǎn)也是面向?qū)ο笾阅苋绱耸⑿械年P(guān)鍵所在。
封裝
java中類(lèi)的屬性的訪問(wèn)權(quán)限默認(rèn)值不是private,要想隱藏該屬性的方法,就可以加private修飾符,來(lái)限制只能夠在類(lèi)的內(nèi)部進(jìn)行訪問(wèn)。
對(duì)于類(lèi)中的私有屬性,要對(duì)其給出一對(duì)方法(getXXX,setXXX())訪問(wèn)私有屬性,保證對(duì)私有屬性的操作和安全性。
方法的封裝,該公開(kāi)的公開(kāi),該隱藏的隱藏。
java的繼承
繼承,是對(duì)有著共同特性的多類(lèi)事物,進(jìn)行再抽象成一個(gè)類(lèi)。
java中的繼承要使用extends關(guān)鍵字,并且java中指允許單繼承,也就是一個(gè)類(lèi)只能有一個(gè)父類(lèi)。
構(gòu)造方法不能被繼承。
java方法中的覆蓋
子類(lèi)中有和父類(lèi)中可訪問(wèn)的同名同返回同參數(shù)列表的方法時(shí),就會(huì)覆蓋從父類(lèi)繼承來(lái)的方法。
super()關(guān)鍵字
super(),表示在子類(lèi)的構(gòu)造方法調(diào)用父類(lèi)的構(gòu)造方法時(shí),super()也只能在構(gòu)造方法中的第一句。
java中的多態(tài)
有兩種多態(tài)的機(jī)制:編譯時(shí)多態(tài)、運(yùn)行時(shí)多態(tài)
1、方法的重載:重載是指同一類(lèi)中有多個(gè)同名的方法,但這些方法有著不同的參數(shù)。,因此在編譯時(shí)就可以確定到底調(diào)用哪個(gè)方法,它是一種編譯時(shí)多態(tài)。
2、方法的覆蓋:子類(lèi)可以覆蓋父類(lèi)的方法,因此同樣的方法會(huì)在父類(lèi)中與子類(lèi)中有著不同的表現(xiàn)形式。在java語(yǔ)言中,基類(lèi)的引用變量不僅可以指向基類(lèi)的實(shí)例對(duì)象,也可以指向子類(lèi)的實(shí)例對(duì)象,同樣,接口中的引用變量也可以指向其實(shí)現(xiàn)類(lèi)的實(shí)例對(duì)象。
public class A {
public String show(D obj) {
return ("A and D");
}
public String show(A obj) {
return ("A and A");
}
}
public class B extends A{
public String show(B obj){
return ("B and B");
}
public String show(A obj){
return ("B and A");
}
}
public class C extends B{
}
public class D extends B{
}
public 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("1--" + a1.show(b));
System.out.println("2--" + a1.show(c));
System.out.println("3--" + a1.show(d));
System.out.println("4--" + a2.show(b));
System.out.println("5--" + a2.show(c));
System.out.println("6--" + a2.show(d));
System.out.println("7--" + b.show(b));
System.out.println("8--" + b.show(c));
System.out.println("9--" + b.show(d));
}
}
1--A and A
2--A and A
3--A and D
4--B and A
5--B and A
6--A and D
7--B and B
8--B and B
9--A and D
當(dāng)超類(lèi)對(duì)象引用變量引用子類(lèi)對(duì)象時(shí),被引用對(duì)象的類(lèi)型而不是引用變量的類(lèi)型決定了調(diào)用誰(shuí)的成員方法,但是這個(gè)被調(diào)用的方法必須是在超類(lèi)中定義過(guò)的,也就是說(shuō)被子類(lèi)覆蓋的方法。
這我們用一個(gè)例子來(lái)說(shuō)明這句話(huà)所代表的含義:a2.show(b);
這里a2是引用變量,為A類(lèi)型,它引用的是B對(duì)象,因此按照上面那句話(huà)的意思是說(shuō)有B來(lái)決定調(diào)用誰(shuí)的方法,所以a2.show(b)應(yīng)該要調(diào)用B中的show(B obj),產(chǎn)生的結(jié)果應(yīng)該是“B and B”,但是為什么會(huì)與前面的運(yùn)行結(jié)果產(chǎn)生差異呢?這里我們忽略了后面那句話(huà)“但是這兒被調(diào)用的方法必須是在超類(lèi)中定義過(guò)的”,那么show(B obj)在A類(lèi)中存在嗎?根本就不存在!所以這句話(huà)在這里不適用?那么難道是這句話(huà)錯(cuò)誤了?非也!其實(shí)這句話(huà)還隱含這這句話(huà):它仍然要按照繼承鏈中調(diào)用方法的優(yōu)先級(jí)來(lái)確認(rèn)。所以它才會(huì)在A類(lèi)中找到show(A obj),同時(shí)由于B重寫(xiě)了該方法所以才會(huì)調(diào)用B類(lèi)中的方法,否則就會(huì)調(diào)用A類(lèi)中的方法。
以上所述是小編給大家介紹的Java封裝、繼承、多態(tài)三大特征的理解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
SpringMVC源碼解析之消息轉(zhuǎn)換器HttpMessageConverter
本篇文章主要介紹了SpringMVC源碼解析之消息轉(zhuǎn)換器HttpMessageConverter ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
Java使用PDFBox實(shí)現(xiàn)操作PDF文檔
這篇文章主要為大家詳細(xì)介紹了Java如何使用PDFBox實(shí)現(xiàn)操作PDF文檔,例如添加本地圖片、添加網(wǎng)絡(luò)圖片、圖片寬高自適應(yīng)、圖片水平垂直居中對(duì)齊等功能,需要的可以了解下2024-03-03
使用mybatis進(jìn)行數(shù)據(jù)插入時(shí)返回自增id的方法及注意點(diǎn)
這篇文章主要給大家介紹了關(guān)于使用mybatis進(jìn)行數(shù)據(jù)插入時(shí)返回自增id的方法及注意點(diǎn),在插入一條數(shù)據(jù)之后需要返回它的自增主鍵id,因?yàn)椴迦氲膶?shí)體類(lèi)數(shù)據(jù)id為空,后面的邏輯還需要這個(gè)id,需要的朋友可以參考下2023-09-09
spring cloud feign不支持@RequestBody+ RequestMethod.GET報(bào)錯(cuò)的解決方法
這篇文章主要介紹了spring cloud feign不支持@RequestBody+ RequestMethod.GET報(bào)錯(cuò)的解決方法,需要的朋友可以參考下2018-01-01
java中switch case語(yǔ)句需要加入break的原因解析
這篇文章主要介紹了java中switch case語(yǔ)句需要加入break的原因解析的相關(guān)資料,需要的朋友可以參考下2017-07-07
基于JVM 調(diào)優(yōu)的技巧總結(jié)分析
本篇文章是對(duì)JVM 調(diào)優(yōu)的技巧進(jìn)行了總結(jié)和分析。需要的朋友參考下2013-05-05
SpringMVC整合SSM實(shí)現(xiàn)異常處理器詳解
SpringMVC是一種基于Java,實(shí)現(xiàn)了Web MVC設(shè)計(jì)模式,請(qǐng)求驅(qū)動(dòng)類(lèi)型的輕量級(jí)Web框架,即使用了MVC架構(gòu)模式的思想,將Web層進(jìn)行職責(zé)解耦?;谡?qǐng)求驅(qū)動(dòng)指的就是使用請(qǐng)求-響應(yīng)模型,框架的目的就是幫助我們簡(jiǎn)化開(kāi)發(fā),SpringMVC也是要簡(jiǎn)化我們?nèi)粘eb開(kāi)發(fā)2022-10-10

