Think in java 學(xué)習(xí)筆記:訪問權(quán)限控制,復(fù)用類(繼承)

1.protected使用

protected處理的是繼承的概念,如果創(chuàng)建了一個(gè)新包,并從另一個(gè)包中繼承類,可以訪問的成員有public和protected。protected 也提供包訪問權(quán)限。

package com.zhangyue.learn;

import static net.mindview.util.Print.*;

public class Test1 {
    protected int n;
    public int m;
    public static void main(String[] args) {
        print("aaaaa");
    }

}


package com.zhangyue.learn1;

import com.zhangyue.learn.Test1;

public class LearnProtect extends Test1{
    
    public static void main(String[] args) {
        LearnProtect l = new LearnProtect();
        l.m = 1;
        l.n = 2;
    }
}

class Other{
    void test(){
        Test1 t = new Test1();
        t.m = 2;
//      t.n = 1;
    }
}

2.訪問權(quán)限控制將權(quán)限的邊界化在了數(shù)據(jù)類型的內(nèi)部的原因

  • 第一,設(shè)定客戶端程序員可以使用和不可以使用的界限,可以在結(jié)構(gòu)中建立自己的內(nèi)部機(jī)制,不必?fù)?dān)心客戶端程序員把它當(dāng)做是自己可以使用的接口的一部分。
  • 第二,就是接口和具體實(shí)現(xiàn)進(jìn)行分離。如果一個(gè)結(jié)構(gòu)是用于程序中,而客戶端程序員除了可以向接口發(fā)送信息外什么也不可以做的話,就可以隨意更改所有不是public的東西而不會(huì)破壞客戶端代碼。

3. 復(fù)用類

即可以通過創(chuàng)建新類來(lái)復(fù)用代碼,而不必重頭開始編寫,可以使用別人已經(jīng)開發(fā)并且調(diào)試好的類,有兩種方法,組合語(yǔ)法和繼承語(yǔ)法。

  • 組合語(yǔ)法:新有的類是由現(xiàn)有的類的對(duì)象組合而成的,復(fù)用了現(xiàn)有代碼的功能,而不是它的形式。
  • 繼承語(yǔ)法:按照現(xiàn)有類的類型來(lái)創(chuàng)建新類。無(wú)需改變現(xiàn)有類的形式,采用現(xiàn)有類的形式并在其中添加新代碼。

5. 繼承

當(dāng)創(chuàng)建一個(gè)類時(shí),總是在繼承,除了明確指出繼承哪個(gè)類,都隱式地繼承Object類。

package com.zhangyue.learn;

class Cleanser{
    private String s = "Cleanser";
    public void append(String a){ s += a;}
    public void dilute(){ append(" dilute()");}
    public void apply(){ append(" apply()");}
    public void scrub(){ append(" scrub()");}
    public String toString(){return s;}
        //可以為每個(gè)類創(chuàng)建一個(gè)main()方法,方便測(cè)試
    public static void main(String[] args){
        Cleanser c = new Cleanser();
        c.dilute();c.apply();c.scrub();
        System.out.println(c);
    }
}
public class Detergent extends Cleanser{
    public void scrub(){
        append("Deprecated.scrub()");
        super.scrub();//super 表示超類的意思,當(dāng)前類就是從超類繼承過來(lái)的
    }
    public void foam(){
        append("foam()");
    }
    public static void main(String[] args) {
        Detergent d = new Detergent();
        d.apply();d.dilute();d.scrub();d.foam();
        System.out.println(d);
        System.out.println("Testing base class");
        Cleanser.main(args);
    }

}

6.基類初始化

  • 構(gòu)造器不帶參數(shù)
package com.zhangyue.learn;

class Art{
   public Art() {
       System.out.println("Art()");
   }
}
class Drawing extends Art{
   public Drawing() {
       System.out.println("Drawing()");
   }
}
public class Cartoon extends Drawing{
   public Cartoon() {
       System.out.println("Cartoon()");
   }
   public static void main(String[] args) {
       Cartoon c = new Cartoon();
   }

}
/*output
Art()
Drawing()
Cartoon()
*/

構(gòu)造過程從基類向外擴(kuò)散,基類在導(dǎo)出類可以訪問它之前就完成了初始化。即使不為Cartoon創(chuàng)建構(gòu)造器,編譯器也會(huì)合成默認(rèn)的構(gòu)造器調(diào)用基類構(gòu)造器。

  • 構(gòu)造器帶參數(shù)
package com.zhangyue.learn;

class Game{
    public Game(int i) {
        System.out.println("Game()");
    }
}
class BoardGame extends Game{
    public BoardGame(int i) {
        super(i);   //調(diào)用基類構(gòu)造器
        System.out.println("BoardGame()");
    }
}

public class Chess extends BoardGame{
    public Chess() {
        super(11);
        System.out.println("Chess()");
    }
    public static void main(String[] args) {
        Chess c = new Chess();
    }

}

如果不在BoardGame里調(diào)用基類構(gòu)造器,編譯器會(huì)抱怨無(wú)法找到符合Game()形式的構(gòu)造器,而且,調(diào)用基類構(gòu)造器必須是在導(dǎo)出類構(gòu)造器中要做的第一件事。

7. 向上轉(zhuǎn)型

“為新的類提供方法”并不是繼承中最重要的一面,其最重要的是用來(lái)表現(xiàn)新類和基類的關(guān)系,即“新類是現(xiàn)有類的一種類型”。

package com.zhangyue.learn;

class Instruction{
    public void paly(){}
    public static void tune(Instruction i){
        i.paly();
    }
}
public class Wing extends Instruction{

    public static void main(String[] args) {
        Wing w = new Wing();
        Instruction.tune(w);
    }

}

將Wing引用轉(zhuǎn)換為Instruction引用的動(dòng)作就是向上轉(zhuǎn)型。是安全的。

8. 選擇組合與繼承

到底使用組合還是繼承,一個(gè)最清晰的判斷方法就是問問自己是否需要從新類向基類進(jìn)行向上轉(zhuǎn)型。

9.final關(guān)鍵字

  • 說明
    對(duì)于基本數(shù)據(jù)類型,final使數(shù)據(jù)恒定不變;對(duì)于對(duì)象引用,final是引用恒定不變。一旦引用指向某個(gè)對(duì)象,就不能再指向另一個(gè)對(duì)象,但對(duì)象本身是可以修改的,java沒提供使對(duì)象恒定不變的途徑。
    典型的常量定義方式:
    public static final VALUE_ONE;
    public指可用于包之外,static強(qiáng)調(diào)只有一份 只在第一次創(chuàng)建對(duì)象時(shí)初始化一次,final則說明是常量。

  • final方法
    將方法鎖定,以防任何繼承類修改它的定義。在繼承中使方法行為保持不變并且不會(huì)被覆蓋。

*final類
將整個(gè)類定義為final時(shí),就表示不打算繼承該類,對(duì)該類的設(shè)計(jì)不需要做任何變動(dòng)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,670評(píng)論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,551評(píng)論 19 139
  • 1、.java源文件: 一個(gè)以”.java“為后綴的源文件:只能有一個(gè)與文件名相同的類,可以包含其他類。 2、類方...
    Hughman閱讀 1,742評(píng)論 1 9
  • 第一章 對(duì)象導(dǎo)論 對(duì)象具有狀態(tài)、行為和標(biāo)識(shí)。這意味著每一個(gè)對(duì)象都可以擁有內(nèi)部數(shù)據(jù)和方法,并且每一個(gè)對(duì)象都可以唯一地...
    niaoge2016閱讀 1,037評(píng)論 0 0
  • 第七章 復(fù)用類 1. 組合語(yǔ)法 1)對(duì)于非基本類型的對(duì)象,必須將其引用置于新的類中,但可以定義基本類型數(shù)據(jù)。2)每...
    FreeCode閱讀 612評(píng)論 0 0

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