第7章 面向?qū)ο蟮奶匦?繼承和封裝

1. 構(gòu)造方法

構(gòu)造方法:方法名字必須與類名保持一致,方法不能有返回值類型的描述。如果一個類中,沒有聲明任何顯式的構(gòu)造方法,系統(tǒng)會提供一個默認(rèn)的無參數(shù)的構(gòu)造方法。如果一個類中顯式的聲明了構(gòu)造方法,系統(tǒng)不再提供默認(rèn)的無參構(gòu)造方法。

public 類名(參數(shù)列表){
}

構(gòu)造方法是在創(chuàng)建對象時完成調(diào)用,主要的任務(wù)是對對象中的內(nèi)容進(jìn)行初始化


對象內(nèi)存的變換

構(gòu)造方法就是在一開始就調(diào)用,同時完成類中屬性值的初始化賦值操作。

如果出現(xiàn)構(gòu)造方法的形參名字與類的屬性的名字一樣,需要借助this關(guān)鍵字來區(qū)分。this.sno表示的是屬性,sno表示的局部變量(形參或聲明的普通變量)

public class Student {  
    int sno; //學(xué)號
    String sname; //姓名  
    public Student(int sno, String sname) {
        this.sno = sno;
        this.sname = sname;
    }
}

this關(guān)鍵字:表示類當(dāng)前的引用對象

2. 繼承(extends)

2.1 繼承的理解

Java中的繼承不同于現(xiàn)實(shí)意義中的繼承,它表示擴(kuò)展的概念。
體現(xiàn)了現(xiàn)實(shí)世界中,事物之間一般類與特殊類之間的關(guān)系。
可以理解:一般的概念包含特殊的概念。判斷這個關(guān)系時使用ISA原則
B is a A(B是一種A)這句話成立 B是特殊,A是一般
X is a Y(X是一種Y)這句話不成立 不能判定兩者的關(guān)系
比如:

  • "燕子是一種鳥"這句話成立。燕子是特殊,鳥是一般。屬于繼承關(guān)系
  • "班長是一種狗"這句話不成立。 班長和狗沒有任何關(guān)系。

在Java中想使用繼承關(guān)系,必須首先滿足ISA原則。
特殊類(子類)擁有一般類(父類或超類)的屬性和行為
編程實(shí)現(xiàn):

public class B extends A{
}

B擁有A的屬性和行為,同時B可以擴(kuò)展出自己特有的屬性和行為

2.2 繼承的實(shí)例

以鳥類和燕子類為例,寫出一個實(shí)例,鳥類可以吃但不一定會飛。燕子是一種鳥而且會飛
鳥類

public class Bird { 
    String name;  //名字
    String color; //顏色  
    public void eat() {
        System.out.println(name+"正在吃東西");
    }
}

燕子類

public class Swallow extends Bird { 
    public void fly() {
        System.out.println(name+"正在飛翔");
    }
}

測試類

public class Test {
    public static void main(String[] args) {
        Bird b = new Bird();
        b.name = "鳥";
        b.color = "白";
        b.eat();    
        System.out.println("=============================");
        Swallow s = new Swallow();
        s.name = "燕子";
        s.color = "黑";
        s.eat();
        s.fly();
    }
}
2.3 Java中單繼承的特點(diǎn)

Java中繼承的特點(diǎn)

  • 一個類只能有一個直接的父類,這個被稱為單繼承。
  • 一個類如果作為父類,子類的數(shù)量是沒有限制的
  • 如果一個類沒有寫明顯式的父類,默認(rèn)繼承java.lang.Object類

以類圖體現(xiàn)2.2小節(jié)中的例子


類圖
2.4 子類構(gòu)造方法的特點(diǎn)

子類調(diào)用父類構(gòu)造方法時有下面三種情況

  • 父類和子類都沒有顯式地聲明構(gòu)造方法是OK的
  • 父類沒有顯式地聲明構(gòu)造方法,子類顯式地聲明了構(gòu)造方法是OK的
  • 父類顯式地聲明構(gòu)造方法,子類必須顯式地聲明構(gòu)造方法
    總結(jié)起來
    子類必須在構(gòu)造方法的第一句代碼調(diào)用父類的構(gòu)造方法,如果父類有默認(rèn)的無參構(gòu)造方法,子類這句調(diào)用可以省略(實(shí)際上是默認(rèn)調(diào)用)
    調(diào)用父類構(gòu)造方法的語法是:
super(參數(shù)列表);

- super關(guān)鍵字
表示繼承自父類的內(nèi)容(屬性,方法,構(gòu)造方法)
屬性: super.xxx
方法:super.xxx();
構(gòu)造:super();
- this關(guān)鍵字
表示調(diào)用自身的內(nèi)容(屬性,方法,構(gòu)造方法)
屬性:this.xxx
方法:this.xxx();
構(gòu)造:this();
一般情況下,this都被省略

this和super的理解

3. 封裝

對于類的封裝,即隱藏對象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對外公開接口,控制在程序中屬性的讀和修改的訪問級別;將抽象得到的數(shù)據(jù)和行為(或功能)相結(jié)合,形成一個有機(jī)的整體,也就是將數(shù)據(jù)與操作數(shù)據(jù)的源代碼進(jìn)行有機(jī)的結(jié)合,形成“類”。其中數(shù)據(jù)和函數(shù)都是類的成員。
對于包的封裝,對于實(shí)現(xiàn)同樣業(yè)務(wù)邏輯或者實(shí)現(xiàn)類似功能的類,將其放入到同一個package(類似于文件夾)中,形成模塊。

3.1 包的概念

包是一種類似于文件夾的層次結(jié)構(gòu),方便同類Java文件進(jìn)行整理或者管理。
聲明一個類,需要在類的上方聲明package表示該類放在哪個包中
對于下方示例1的分析

  • 聲明Test1類所在的包是:package com.neuedu.test4;
  • 聲明引入了java.util包下的所有類: import java.util.*
  • 聲明引入了com.neuedu.test1包下的Student類
  • System類和Object類都處于java.lang包,默認(rèn)java.lang包無需引包。

示例1:包的聲明和引入

package com.neuedu.test4;

import java.util.*; 
import com.neuedu.test1.Student;

public class Test1 {
    public static void main(String[] args) {
        Random r = new Random();
        Scanner sc = new Scanner(System.in);
        Student s1 = new Student(101, "");
        System.out.println(s1);
        Object o = new Object();
    }
}

系統(tǒng)中常見預(yù)設(shè)的包

  • java.lang包:系統(tǒng)中常用類,這個包無需引包即可使用
  • java.util包: 工具性質(zhì)的類,提供了各種方便的功能
  • java.io包: 內(nèi)容(流)的輸入輸出及文件的操作
  • java.sql包:與數(shù)據(jù)庫交互的類
  • java.net包:與網(wǎng)絡(luò)操作相關(guān)的類
  • java.awt包和java.swing包:與圖形界面相關(guān)的類
3.2 訪問權(quán)限

Java中有兩種訪問權(quán)限,控制的可見范圍"默認(rèn)"和“public公有”
Java中有四種訪問權(quán)限,控制屬性方法的可見范圍。

權(quán)限 類的內(nèi)部 同一包中 不同包的子類中 不同包的類中
private(私有) x x x
什么都不寫(默認(rèn)) x x
protected(保護(hù)) x
public(公有)
類的內(nèi)部訪問時,所有的屬性和方法都能訪問到
同一個包的類中,private私有不可見
不同包的子類中,只能看見protected保護(hù)和public公有
不同包的非子類,只能看見public公有

筆試題:Test類中某個屬性需要被它的子類訪問,這個屬性的訪問權(quán)限至少應(yīng)該設(shè)置為什么? 答案:protected

3.3 訪問器

也被稱為“set方法和get方法”或者“setter和getter”
主要用于私有屬性的訪問:

  • 為私有屬性設(shè)置公有g(shù)et方法,外界就可以看到私有屬性。
    將屬性名作為方法名,首字母大寫后,前面加上get
    比如:屬性name的get方法:getName
public int getSno() {
    return this.sno;
}
  • 為私有屬性設(shè)置公有set方法,外界就可以更改私有屬性。
    將屬性名作為方法名,首字母大寫后,前面加上set
    比如:屬性name的set方法:setName
public void setSno(int sno) {
    this.sno = sno;
}

一般通過右鍵代碼空白處,"source"->"Generate Getters and Setters"

set和get的主要存在意義

  • 可以提供“半權(quán)限”,比如某個屬性只能看不能改。
  • 框架底層實(shí)現(xiàn),要求屬性必須有set和get方法。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容