Java OOP三大特征之封裝繼承與多態(tài)詳解
OOP語(yǔ)言的三大特征即:面向?qū)ο蟮娜齻€(gè)比較重要的思想
封裝
官話:將數(shù)據(jù)和操作數(shù)據(jù)的方法進(jìn)行有機(jī)結(jié)合,隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外公開(kāi)接口進(jìn)行交互
通俗講,不讓類(lèi)外看到實(shí)現(xiàn)的細(xì)節(jié),通過(guò)技術(shù)手段對(duì)這些細(xì)節(jié)包裝一個(gè)外殼,同時(shí)提供幾個(gè)公開(kāi)的接口,讓你進(jìn)行交互即可(例如:手機(jī),內(nèi)部的具體零件,不會(huì)讓你觀察到,使用者只能看到外殼,通過(guò)外殼的顯示屏,充電口進(jìn)行交互)簡(jiǎn)而言之——套殼屏蔽細(xì)節(jié)
實(shí)際上通過(guò)private來(lái)實(shí)現(xiàn)
例如:

繼承
面向?qū)ο蟮乃枷胫刑岢隽死^承的概念,專(zhuān)門(mén)用來(lái)進(jìn)行共性抽取,實(shí)現(xiàn)代碼復(fù)用。
通俗來(lái)講,就是將兩個(gè)或多個(gè)類(lèi)(“子類(lèi)”或者叫“派生類(lèi)”)的共同的特點(diǎn)抽取出來(lái),放在一個(gè)類(lèi)(“父類(lèi)”或叫“基類(lèi)”或叫“超類(lèi)”)里面,對(duì)具有共同特點(diǎn)的代碼實(shí)現(xiàn)重復(fù)利用,大大的減少了代碼量。
例如:人與人之間具有相同的屬性(都有名字,年齡...),但同時(shí)也有不一樣的地方(每個(gè)人具體的特點(diǎn),有人會(huì)彈鋼琴...)



父與子的繼承順序:
故名思意,肯定是先有父后有子,所以在子類(lèi)構(gòu)造對(duì)象時(shí),他們的初始化順序是先完成父類(lèi)的初始化,再調(diào)用子類(lèi)的構(gòu)造方法,{ super()將父類(lèi)初始化好的內(nèi)存地址傳入 },最后完成子類(lèi)初始化。
super關(guān)鍵字:
1.super.data訪問(wèn)父類(lèi)中的屬性
2.super.func() 訪問(wèn)父類(lèi)的方法
3.super() 訪問(wèn)父類(lèi)的構(gòu)造方法
注意:
this()用來(lái)調(diào)用本類(lèi)的構(gòu)造方法,super()用于調(diào)用父類(lèi)的構(gòu)造方法,這兩不能同時(shí)出現(xiàn)!
父類(lèi)與子類(lèi)同名時(shí),在子類(lèi)調(diào)用同名變量時(shí)采用就近原則(調(diào)用子類(lèi))
當(dāng)你未給子類(lèi)提供構(gòu)造方法時(shí)(或者是父類(lèi)有不帶參數(shù)的構(gòu)造方法,子類(lèi)也有構(gòu)造方法,會(huì)自動(dòng)給子類(lèi)補(bǔ)上super),編譯器會(huì)自動(dòng)補(bǔ)上一個(gè)不帶參數(shù)的構(gòu)造方法(前提是,父類(lèi)的構(gòu)造方法中不帶參數(shù),因?yàn)榫幾g器只會(huì)自動(dòng)不上不帶參數(shù)的構(gòu)造方法),如下:
class A{
A(){
System.out.println("A");
}
}
class B extends A{
B(){
super();//如果程序原沒(méi)寫(xiě)構(gòu)造方法,編譯器會(huì)自己提供一個(gè)這樣的不帶參數(shù)的構(gòu)造方法
}
}
public class Test{
public static void main(String[] args){
new B();
}
}class A{
A(){
System.out.print("A");
}
}
class B extends A{
B(){ //程序會(huì)自動(dòng)補(bǔ)上super,最終打印AB
System.out.print("B");
}
}
public class Test{
public static void main(String[] args){
new B();
}
}class A{
A(int a){
System.out.println("A");
}
}
class B extends A{
//若父類(lèi)構(gòu)造方法帶參數(shù),子類(lèi)不會(huì)自動(dòng)補(bǔ)構(gòu)造方法
//程序編譯失敗
}
public class Test{
public static void main(String[] args){
new B();
}
}經(jīng)典筆試題:以下代碼會(huì)打印什么?(初始化順序是什么?)
class Character{
public int data1;
public int data2;
static{
System.out.println("父類(lèi)的靜態(tài)內(nèi)部類(lèi)初始化完成!");
}
{
System.out.println("父類(lèi)的實(shí)例內(nèi)部類(lèi)初始化完成!");
}
public Character(){
System.out.println("父類(lèi)的構(gòu)造方法初始化完成!");
}
}
class Art extends Character{
public int data3;
public int data4;
static{
System.out.println("子類(lèi)的靜態(tài)內(nèi)部類(lèi)初始化完成!");
}
{
System.out.println("子類(lèi)的實(shí)例內(nèi)部類(lèi)初始化完成!");
}
public Art(){
super();
System.out.println("子類(lèi)的構(gòu)造方法初始化完成!");
}
}
public class Test{
public static void main(String[] args){
Art art = new Art();
}
}運(yùn)行結(jié)果:

分析:

多態(tài)
通俗來(lái)講就是:不同人的通過(guò)同一種工具可以做出不同的事情
例如:一個(gè)音樂(lè)生和一個(gè)美術(shù)生看到一架鋼琴的反應(yīng)是不同的,音樂(lè)生可能會(huì)上去彈鋼琴,而美術(shù)生則可能將他畫(huà)下來(lái)...
實(shí)現(xiàn)多態(tài)的條件:
- 在父子的繼承關(guān)系下;
- 子對(duì)父進(jìn)行重寫(xiě);
- 用一個(gè)方法調(diào)用父類(lèi)被重寫(xiě)的方法;
代碼如下:
//人類(lèi)
class Human{
private String name;
Human(String name){
setName(name);
}
public void action(){
System.out.println(name + "看到一架鋼琴~");
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
}
//美術(shù)生
class Art extends Human{
Art(String name){
super(name);
}
public void action(){
System.out.println(getName() + "開(kāi)始繪畫(huà)鋼琴~");
}
}
//音樂(lè)生
class Music extends Human{
Music(String name){
super(name);
}
public void action(){
System.out.println(getName() + "開(kāi)始彈鋼琴~");
}
}
public class Test{
public static void function(Human human){
human.action();
}
public static void main(String[] args){
Human human1 = new Art("美術(shù)生");
Human human2 = new Music("音樂(lè)生");
function(human1);
function(human2);
}
}分析:

發(fā)生重寫(xiě)的條件:
- 方法名相同;
- 返回類(lèi)型相同;
- 形參類(lèi)列表相同(個(gè)數(shù)、順序、類(lèi)型都要一致!);
- static 和 private 修飾的方法不能重寫(xiě);
- 子類(lèi)訪問(wèn)修飾符必須大于等于父類(lèi)訪問(wèn)修飾符(后面會(huì)出文章專(zhuān)門(mén)討論);
此時(shí)會(huì)發(fā)生動(dòng)態(tài)綁定(運(yùn)行時(shí)綁定),其實(shí)此過(guò)程編譯的時(shí)候還是調(diào)用父類(lèi)的,但運(yùn)行時(shí)發(fā)生動(dòng)態(tài)綁定,運(yùn)行子類(lèi)的;也就是說(shuō),父類(lèi)引用了子類(lèi)的對(duì)象,調(diào)用了這個(gè)重寫(xiě)的方法,如下圖:


拓展:
向下轉(zhuǎn)型,也有,也就是子類(lèi)當(dāng)父類(lèi)用也可,但是比較危險(xiǎn),如下代碼:
public class Test{
public static void function(Human human){
human.action();
}
public static void main(String[] args){
Human human = new Human("音樂(lè)生");
Music music = (Music)human;
}
}運(yùn)行結(jié)果:

可以這樣理解,不是所有人都是音樂(lè)生,所以需要如下改法:(有的人是音樂(lè)生)
public class Test{
public static void function(Human human){
human.action();
}
public static void main(String[] args){
Human human = new Music("音樂(lè)生");//這樣寫(xiě)便是有些人是音樂(lè)生
if(human instanceof Music) {//保證安全性,向下轉(zhuǎn)型
Music music = (Music) human;
};
}
}到此這篇關(guān)于Java OOP三大特征之封裝繼承與多態(tài)詳解的文章就介紹到這了,更多相關(guān)Java 封裝 繼承 多態(tài)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot集成redis實(shí)現(xiàn)共享存儲(chǔ)session
這篇文章主要介紹了SpringBoot集成redis實(shí)現(xiàn)共享存儲(chǔ)session的流程步驟,文中通過(guò)代碼示例介紹的非常詳細(xì),并總結(jié)了一些常見(jiàn)的錯(cuò)誤及解決方法,需要的朋友可以參考下2024-03-03
Mybatis 實(shí)現(xiàn)一個(gè)搜索框?qū)Χ鄠€(gè)字段進(jìn)行模糊查詢(xún)
這篇文章主要介紹了Mybatis 實(shí)現(xiàn)一個(gè)搜索框?qū)Χ鄠€(gè)字段進(jìn)行模糊查詢(xún),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
手寫(xiě)簡(jiǎn)版kedis分布式key及value服務(wù)的實(shí)現(xiàn)及配置
這篇文章主要為大家介紹了手寫(xiě)簡(jiǎn)版的kedis分布式key及value服務(wù)的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02
springboot 接口返回字符串帶引號(hào)的問(wèn)題解決
本文主要介紹了springboot 接口返回字符串帶引號(hào)的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
Java動(dòng)態(tài)代理靜態(tài)代理實(shí)例分析
這篇文章主要介紹了Java動(dòng)態(tài)代理靜態(tài)代理實(shí)例分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
RestTemplate自定義請(qǐng)求失敗異常處理示例解析
這篇文章主要為大家介紹了RestTemplate自定義請(qǐng)求失敗異常處理的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-03-03
MyBatis中基于別名typeAliases的設(shè)置
這篇文章主要介紹了MyBatis中基于別名typeAliases的設(shè)置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07

