Java SE 08(接口的多實(shí)現(xiàn)撕彤、多繼承鱼鸠、多態(tài)、final羹铅、權(quán)限修飾符)

接口的多實(shí)現(xiàn):Java中是單繼承 多實(shí)現(xiàn)蚀狰,一個(gè)類可以實(shí)現(xiàn)多個(gè)接口 ;一個(gè)類能繼承一個(gè)父類同時(shí)實(shí)現(xiàn)多個(gè)接口职员。

多實(shí)現(xiàn)的格式:

    class 類名 [extends 父類名] implements 接口1麻蹋,接口2.。焊切。扮授。{
         }

多實(shí)現(xiàn):
1.必須重寫接口中所有的抽象方法
2.重寫接口中的默認(rèn)方法
多實(shí)現(xiàn)注意:
1.如果抽象方法有重名的,只需重寫一次就可以

public interface Liveable {
    //多實(shí)現(xiàn)抽象方法重名
    public void show("Show()重寫");
}

public interface Pet {
    // 多實(shí)現(xiàn)抽象方法重名
    public void show();
    }
}


public class Dog extends Animal implements Liveable,Pet {
    @Override
    public void show() {
        System.out.println("show()重寫");
    }
}

public class InterfaceTest {
    public static void main(String[] args) {
        Dog dog = new Dog();
       dog.show();
    }
}

2.如果默認(rèn)方法有重名的专肪,必須重寫一次

public interface Liveable {
    //多實(shí)現(xiàn)默認(rèn)方法重名
    public default void method() {
        System.out.println("Liveable!");
    }
}

public interface Pet {
    //多實(shí)現(xiàn)默認(rèn)方法重名
    public default void method() {
        System.out.println("Pet");
    }
}


public class Dog extends Animal implements Liveable,Pet {
 @Override
    public void method() {
        System.out.println("Dog");
    }
}


public class InterfaceTest {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.method();
    }
}

3.存在同名的靜態(tài)方法不會(huì)沖突刹勃,因?yàn)橹荒芡ㄟ^(guò)接口名去訪問(wèn)靜態(tài)方法
4.當(dāng)一個(gè)類既繼承了一個(gè)父類,又實(shí)現(xiàn)了多個(gè)接口嚎尤,父類中的成員方法與接口中默認(rèn)方法重名荔仁,子類就近執(zhí)行父類的成員方法

public interface A {
    public default void method(){
        System.out.println("AAAAAAAAAAAAA");
    }
}

public class D {
    public void method() {
        System.out.println("DDDDDDDDD");
    }
}

public class C extends D implements A {
    //未重寫method方法,執(zhí)行輸出為"DDDDDDDDDD"

    //重寫method方法,執(zhí)行C類的method方法
    public void method(){
        System.out.println("CCCCCCCCCC");
    }

}

public class InterfaceTest1 {
    public static void main(String[] args) {
        C c = new C();
        c.method();
    }
}

接口的多繼承

  • 一個(gè)接口可以繼承多個(gè)接口
  • 如果父接口中默認(rèn)方有重名的乏梁,那么子接口需要重寫一次
public interface F {
    public default void method(){
        System.out.println("FFFFFFFFFF");
    }
}

public interface G {
    public default void method(){
        System.out.println("GGGGGGGGGGG");
    }
}

public interface H extends F,G{
    @Override
    default void method() {              //子接口繼承父接口 接口默認(rèn)方法是寫default
    }
}

//public class K implements F,G {
//    @Override
 //   public  void method() {  //類接口默認(rèn)方法是不能寫default

//    }
//}

其他成員特點(diǎn):

1.接口中次洼,無(wú)法定義成員變量,但是可以定義常量掌呜,其值不可以改變滓玖,默認(rèn)使用public static final修飾
2.沒(méi)有構(gòu)造方法,所以不能創(chuàng)建對(duì)象质蕉,也就是不能被new
3.沒(méi)有靜態(tài)代碼塊

多態(tài)

1.同一種行為具有不同的表現(xiàn)形式

public abstract class Animal {
    public  abstract void eat();
}

public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("Dog 在造狗糧");
    }
}

public class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("Cat 在喵喵的吃貓糧");
    }
}

  public class DynamicTest {
    public static void main(String[] args) {
    //    多態(tài)形式
        Dog dog = new Dog();
     //   格式:父類類型 對(duì)象名 = new 子類對(duì)象
        Animal dog = new Dog();
        dog.eat();
        Animal cat = new Cat();
        cat.eat();
       }
}
多態(tài)的好處(接上面):
public class DynamicTest {
    public static void main(String[] args) {
  //多態(tài)的好處
        Dog dog = new Dog();
        Cat cat = new Cat();
        //調(diào)用showCatEat
        showCatEat(cat);
        showDogEat(dog);
                  等于||
        showAnimalEat(dog);
        showAnimalEat(cat);
    }



 public static void showCatEat(Dog dog){
        dog.eat();
    }
    public static void showDogEat(Cat cat){
        cat.eat();
    }
              等于||
    public static void showAnimalEat(Animal animal){
        animal.eat();
    }
}

2.前提:

  • 繼承或者實(shí)現(xiàn)
  • 方法的重寫
  • 父類引用指向子類對(duì)象

3.體現(xiàn):格式:父類類型 對(duì)象名 = new 子類對(duì)象
子類類型 對(duì)象名 = (子類類型)new 父類對(duì)象

多態(tài)的轉(zhuǎn)型:

1.向上轉(zhuǎn)型:默認(rèn)的;多態(tài)本身是子類類型向父類類型轉(zhuǎn)化的過(guò)程 格式:父類類型 對(duì)象名 = new 子類對(duì)象 (轉(zhuǎn)成更大的類型)
2.向下轉(zhuǎn)型: 父類轉(zhuǎn)成子類的類型(強(qiáng)制轉(zhuǎn)化) 格式:子類類型 對(duì)象名 = (子類類型)new 父類對(duì)象

1.instanceof 判斷對(duì)象是或否屬于某種類型 是true 否 false
2.轉(zhuǎn)型異常時(shí)會(huì)發(fā)生 ClassCastException

轉(zhuǎn)型案例:
public class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("Cat 在喵喵的吃貓糧");
    }
}

public class JiaFei extends Cat{
    @Override
    public void eat() {
        System.out.println("JiaFei 大口的吃貓糧");
    }

}

public class DynamicTest2 {
    public static void main(String[] args) {
       //向上轉(zhuǎn)型
        Animal cat = new Cat();
//        cat.eat();
        //向下轉(zhuǎn)型
        //        格式:子類類型 對(duì)象名 = (子類類型)new 父類對(duì)象
//        Cat cat1 = new Cat();
//        cat1.eat();
        // 注:轉(zhuǎn)型的異常   ClassCastException
        Dog dog = (Dog) cat;
        dog.eat(); //Dog 和 cat 屬于Animal下的兩個(gè)分支翩肌,不能強(qiáng)制轉(zhuǎn)換
//instance of 判斷對(duì)象屬于某種類型
//        if (cat instanceof  Animal){
//            Cat c = (Cat) cat;
//            c.eat();
//        }else {
//            System.out.println("不是父類類型不能強(qiáng)制轉(zhuǎn)換");
//        }
        Cat jiaFei = new JiaFei();
        if (jiaFei instanceof Cat){
            JiaFei fei = (JiaFei) jiaFei;
            fei.eat();
        }else {
            System.out.println("不是父類類型不能強(qiáng)制轉(zhuǎn)換");
        }
    }
}

練習(xí)1:

練習(xí)1
public interface USB {
    void open(); //開啟功能
    void close();//關(guān)閉功能
}

public class Mouse implements USB {
    @Override
    public void open() {
        System.out.println("鼠標(biāo)開啟模暗,小燈閃閃閃");
    }

    @Override
    public void close() {
        System.out.println("鼠標(biāo)關(guān)閉,小燈熄滅");
    }
    public void click(){
        System.out.println("鼠標(biāo)點(diǎn)擊");
    }
}

public class KeyBoard implements USB {

    @Override
    public void open() {
        System.out.println("鍵盤開啟念祭,小彩燈閃閃閃");
    }

    @Override
    public void close() {
        System.out.println("鍵盤關(guān)閉兑宇,小燈熄滅");
    }
    public void input(){
        System.out.println("鍵盤在瘋狂的輸入");
    }
}

public class Laptop  {
    public void run(){
        System.out.println("筆記本運(yùn)行中");
    }
    public void useUSB(USB usb){
        //判斷是否有usb設(shè)備
        if (usb != null){
            usb.open();
            if (usb instanceof Mouse){
                Mouse mouse = (Mouse) usb;
                mouse.click();
            }else if (usb instanceof KeyBoard){
                KeyBoard keyboard = (KeyBoard) usb;
                keyboard.input();
            }
            usb.close();
        }
    }
    public void shutDown(){
        System.out.println("筆記本關(guān)閉");
    }
}

public class LaptopTest {
    public static void main(String[] args) {
        Laptop laptop = new Laptop();
        //開啟
        laptop.run();
//        使用鼠標(biāo)
        USB mouse = new Mouse();
        laptop.useUSB(mouse);
        //使用鍵盤
        USB keyBoard = new KeyBoard();
        laptop.useUSB(keyBoard);

        //筆記本關(guān)閉
        laptop.shutDown();
    }
}

練習(xí)2:

練習(xí)2
public interface Universe {
    void doAnything();
}

public class Star {
    public void shine(){
        System.out.println("star:星星一閃一閃亮晶晶");
    }
}

public class Sun extends Star implements Universe {

    @Override
    public void doAnything() {
        System.out.println("sun:太陽(yáng)吸引著9大行星旋轉(zhuǎn)");
    }

    @Override
    public void shine() {
        System.out.println("sun:光照八分鐘,到達(dá)地球");
    }
}

public class Test {
    public static void main(String[] args) {
        Star star = new Star();
        star.shine();
        System.out.println("==================");
        Universe sun = new Sun();
        sun.doAnything();

        Sun sun1 = (Sun)sun;
        sun1.shine();
    }
}

練習(xí)3:

練習(xí)3
public interface A {
   public abstract void showA();
   private static void show10(String str){
       for (int i = 0; i < 10; i++) {
           System.out.print(str + " \t");
       }
   }
   public static void showB10(){
       System.out.println("static BBBB");
       show10("BBBB");
       System.out.println();
   }

    public static void showC10(){
        System.out.println("static CCCC");
        show10("CCCC");
    }
}

public class B implements A {

    @Override
    public void showA() {
        System.out.println();
        System.out.println("AAA");
    }
    public static void showD(){
        System.out.println("DDDD");
    }
}

public class Test  {
    public static void main(String[] args) {
        A.showB10();
        A.showC10();
        B b = new B();
        b.showA();
        B.showD();
    }

}

final :

1.開放擴(kuò)展粱坤,關(guān)閉修改
2.用于修飾不可改變的內(nèi)容 格式:final class 類名()
3.修飾對(duì)象 :
1)類:被修飾的類不能被繼承 final class 類名() 目的是僅限使用隶糕,不允許修改
2)方法:被修飾的方法不能被重寫 修飾符 final 返回值類型 方法名(參數(shù)列表){}
3)變量:被修飾的變量不能被重新賦值

final 修飾變量 :

1.局部變量:
-基本類型 :

public class FinalDemo1 {
    public static void main(String[] args) {
        //聲明一個(gè)變量,使用final修飾
        final int al;
        al = 40;
        System.out.println(al);
        //  al = 20; 報(bào)錯(cuò) 不可重新賦值
        final int b = 100;
//        b = 111; 報(bào)錯(cuò) 不可重新賦值
//        final int c = 0;
//        for (int i = 0; i < 10; i++) {
//            c = i;
//            System.out.println(c);
//        }
        //可以通過(guò)編譯站玄,可以運(yùn)行枚驻,c是局部變量每次循環(huán)都是創(chuàng)建了一個(gè)新的變量c
        for (int i = 0; i < 10; i++) {
            final int c = i;
            System.out.println(c);
        }

    }
}

-引用類型:

public class User {
    private String name = "張三";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class FinalDemo2 {
    public static void main(String[] args) {
        //引用類型的局部變量,被final修飾株旷,只能指向一個(gè)對(duì)象再登,地址值是不能改變的
        //但是,不影響對(duì)象內(nèi)部成員變量值的修改
       final User user1 = new User(); //user1地址值不能改變
        System.out.println(user1.getName());
////         user1 = new User();
        user1.setName("李四");
        System.out.println(user1.getName());
//        User user = new User();
//        User user1 = new User();
//        System.out.println(user == user1); //false 被final修飾晾剖,只能指向一個(gè)對(duì)象锉矢,地址值是不能改變的
    }
}

2.成員變量:
1)顯示初始化

public class UserF {
    //顯示初始化
    final String USERNAME = "張三"; //常量所有字母大寫
    private int age;
}

2)構(gòu)造方法初始化

public class UserF2 {
    final String USERNAME;
    private int age;

    public UserF2(String username,int age) {
        this.USERNAME = username;
        this.age = age;
    }
}

權(quán)限修飾符:

  • public
  • protected
  • default
  • private


    權(quán)限修飾符修飾權(quán)限
權(quán)限使用建議:

1.成員變量使用 private 隱藏細(xì)節(jié)
2.構(gòu)造方法使用 public 方便創(chuàng)建對(duì)象
3.成員方法使用 public 方便調(diào)用方法
:權(quán)限使用建議符合JavaBean

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市齿尽,隨后出現(xiàn)的幾起案子沽损,更是在濱河造成了極大的恐慌,老刑警劉巖循头,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绵估,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡贷岸,警方通過(guò)查閱死者的電腦和手機(jī)壹士,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)偿警,“玉大人躏救,你說(shuō)我怎么就攤上這事。” “怎么了盒使?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵崩掘,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我少办,道長(zhǎng)苞慢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任英妓,我火速辦了婚禮挽放,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蔓纠。我一直安慰自己辑畦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布腿倚。 她就那樣靜靜地躺著纯出,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敷燎。 梳的紋絲不亂的頭發(fā)上暂筝,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音硬贯,去河邊找鬼焕襟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛澄成,可吹牛的內(nèi)容都是我干的胧洒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼墨状,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼卫漫!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起肾砂,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤列赎,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后镐确,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體包吝,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年源葫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诗越。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡息堂,死狀恐怖嚷狞,靈堂內(nèi)的尸體忽然破棺而出块促,到底是詐尸還是另有隱情,我是刑警寧澤床未,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布竭翠,位于F島的核電站,受9級(jí)特大地震影響薇搁,放射性物質(zhì)發(fā)生泄漏斋扰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一啃洋、第九天 我趴在偏房一處隱蔽的房頂上張望传货。 院中可真熱鬧,春花似錦宏娄、人聲如沸损离。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至貌踏,卻和暖如春十饥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背祖乳。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工逗堵, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人眷昆。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓蜒秤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親亚斋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子作媚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348