Java 第9天 面向對象(上)繼承

寫在前言 :
1 、現在出去面試,面試官老是會問你一句話Java 怎麼樣?
不管是大數據崗位還是數據庫都會問一句。 回來痛下決心,決定探索下這門語言的精髓,大數據很多框架也都是Java 寫的,的確懂一門語言,比較穩妥。路也寬敞!!!不然就和喫飯沒筷子,那麼尷尬。把每天學習到的 Java知識分享到這裏會。直到能自己寫個複雜一點Dome得出來。
2、爲了監督自己探索這門語言的動力與決心。特此這段話放到前面!!!
3、挑戰下自己 到底是笨 還是學不會,還是不想學。 好運

一、繼承概述:

  • 多個類中存在相同屬性和行爲時,將這些內容抽取到單獨一個類中,那麼多個類無需再定義這些屬性和行爲,只要繼承那個類即可。
    通過extends關鍵字可以實現類與類的繼承
  • class 子類名 extends 父類名 {}
    單獨的這個類稱爲父類,基類或者超類;這多個類可以稱爲子類或者派生類。
    有了繼承以後,我們定義一個類的時候,可以在一個已經存在的類的基礎上,還可以定義自己的新成員。

繼承的好處:

  • 減少了代碼的冗餘,提高了代碼的複用性
  • 多個類相同的成員可以放到同一個類中
  • 提高了代碼的維護性
  • 如果功能的代碼需要修改,修改一處即可
  • 讓類與類之間產生了關係,是多態的前提
  • 其實這也是繼承的一個弊端:類的耦合性很強

Java中繼承的特點:

  • Java只支持單繼承,不支持多繼承。
    一個類只能有一個父類,不可以有多個父類。
    class SubDemo extends Demo{} //ok
    class SubDemo extends Demo1,Demo2…//error
  • Java支持多層繼承(繼承體系)
    class A{}
    class B extends A{}
    class C extends B{}

繼承的注意事項

子類只能繼承父類所有非私有的成員(成員方法和成員變量)
其實這也體現了繼承的另一個弊端:打破了封裝性
子類不能繼承父類的構造方法,但是可以通過super(後面講)關鍵字去訪問父類構造方法。
不要爲了部分功能而去繼承

我們到底在什麼時候使用繼承呢?
繼承中類之間體現的是:”is a”的關係。

理解繼承-1

子類繼承父類的什麼?
繼承public和protected修飾的屬性和方法,不管子類和父類是否在同一個包裏繼承默認權限修飾符修飾的屬性和方法,但子類和父類必須在同一個包裏

super關鍵字

  • super的用法和this很像
    1、this代表本類對應的引用。
    2、super代表父類存儲空間的標識(可以理解爲父類引用)
  • 用法(this和super均可如下使用)

- 訪問成員變量

this.成員變量 super.成員變量

  • 訪問構造方法(子父類的構造方法問題講)
    this(…) super(…)
  • 訪問成員方法(子父類的成員方法問題講)
    this.成員方法() super.成員方法()
    1、
    在這裏插入圖片描述
    2、在這裏插入圖片描述
    3、創建類的對象調用屬性方法。。

繼承中構造方法的關係:

  • 子類中所有的構造方法默認都會訪問父類中空參數的構造方法

爲什麼呢?
因爲子類會繼承父類中的數據,可能還會使用父類的數據。所以,子類初始化之前,一定要先完成父類數據的初始化。
每一個構造方法的第一條語句默認都是:super()

繼承中構造方法的關係:

如果父類中沒有構造方法,該怎麼辦呢?
子類通過super去顯示調用父類其他的帶參的構造方法
子類通過this去調用本類的其他構造方法
本類其他構造也必須首先訪問了父類構造
一定要注意:
super(…)或者this(….)必須出現在第一條語句上
否則,就會有父類數據的多次初始化

二、方法的重寫:

1、什麼是方法重寫

1、方法的重寫或方法的覆蓋(overriding)
2、子類根據需求對從父類繼承的方法進行重新編寫
3、重寫時,可以用super.方法的方式來保留父類的方法
4、構造方法不能被重寫

2、方法重寫的規則:

在這裏插入圖片描述

3、方法重寫概述

  • 子類中出現了和父類中一模一樣的方法聲明,也被稱爲方法覆蓋,方法複寫。
  • 使用特點:
    如果方法名不同,就調用對應的方法
    如果方法名相同,最終使用的是子類自己的

4、方法重寫的應用:

當子類需要父類的功能,而功能主體子類有自己特有內容時,可以重寫父類中的方法,這樣,即沿襲了父類的功能,又定義了子類特有的內容。

5、方法重寫的注意事項:

  • 父類中私有方法不能被重寫
  • 子類重寫父類方法時,訪問權限不能更低
  • 父類靜態方法,子類也必須通過靜態方法進行重寫。(其實這個算不上方法重寫,但是現象確實如此,至於爲什麼算不上方法重寫,多態中我會講解)

6、方法重寫vs方法重載

方法重寫與方法重載有何區別

在這裏插入圖片描述

三、遇到的問題:

如果繼承子類後,屬性爲私有的(private)的,那麼需要提供get set 方法。
但是我遇到一個問題是:子類繼承父類後,報錯如下:

Implicit super constructor ManKind() is undefined. Must explicitly invoke another constructor
在這裏插入圖片描述
如下翻譯:未明確定義構造方法,我定義了是,不解啊。。
在這裏插入圖片描述

解決辦法:

經過醞釀一陣排解:是因爲我的無參構造函數在父類中沒有定義。添加進行報錯也就沒有了。
也能正常運行了。。。

四、完整栗子代碼:

package com.it.iwork;

/**  
 * @author Administrator
 *    父類
 */
public class ManKind {
private int sex;
private  int salary;

public ManKind() {
super();
}



public ManKind(int sex, int salary) {
super();
this.sex = sex;
this.salary = salary;
}


public void manOrWoman() {
if(sex ==1) {
	System.out.println("性別爲男");
}else if(sex ==0){
	System.out.println("性別爲女");
	
}
 }

public void employeed() {
if (salary ==0) {
	System.out.println("no job");
}else if (salary ==1){
	System.out.println("job");
}
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
	this.sex = sex;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
}

小孩 子類:繼承父類 ManKind

在這裏插入圖片描述

測試類 :KidsTest

在這裏插入圖片描述

如果我的博客對你有幫助、如果你喜歡我的博客內容,請“點贊” “評論”“收藏”一鍵三連哦!聽說點讚的人運氣不會太差,每一天都會元氣滿滿呦!如果實在要白嫖的話,那祝你開心每一天,歡迎常來我博客看看。

 

 

【轉載註明出處,還望尊重原創 】

 

【作者水平有限,如有錯誤歡迎指正 .】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章