04-02【接口认境、多態(tài)】

第一章接口


1.1 概述


接口,是Java語(yǔ)言中一種引用類型挟鸠,是方法的集合叉信,如果說(shuō)類的內(nèi)部封裝了成員變量、構(gòu)造方法和成員方法艘希,那么接口的內(nèi)部主要就是封裝了方法茉盏,包含抽象方法(JDK 7及以前),默認(rèn)方法和靜態(tài)方法(JDK 8)枢冤,私有方法(JDK 9)鸠姨。
接口的定義,它與定義類方式相似淹真,但是使用interface關(guān)鍵字讶迁。它也會(huì)被編譯成.class文件,但一定要明確它并不是類核蘸,而是另外一種引用數(shù)據(jù)類型巍糯。

引用數(shù)據(jù)類型:數(shù)組,類客扎,接口祟峦。

接口的使用,它不能創(chuàng)建對(duì)象徙鱼,但是可以被實(shí)現(xiàn)(implements ,類似于被繼承)宅楞。一個(gè)實(shí)現(xiàn)接口的類(可以看做是接口的子類),需要實(shí)現(xiàn)接口中所有的抽象方法袱吆,創(chuàng)建該類對(duì)象厌衙,就可以調(diào)用方法了,否則它必須是一個(gè)抽象類绞绒。

1.2 定義格式

public interface 接口名稱 {
    // 抽象方法
    // 默認(rèn)方法
    // 靜態(tài)方法
    // 私有方法
}?
含有抽象方法

抽象方法:使用abstract關(guān)鍵字修飾婶希,可以省略,沒(méi)有方法體蓬衡。該方法供子類實(shí)現(xiàn)使用喻杈。
代碼如下:

public interface InterFaceName { 
    public abstract void method();
}
含有默認(rèn)方法和靜態(tài)方法

默認(rèn)方法:使用default修飾,不可省略狰晚,供子類調(diào)用或者子類重寫筒饰。
靜態(tài)方法:使用static修飾,供接口直接調(diào)用家肯。
代碼如下:

public interface InterFaceName {
    public default void method() {
        // 執(zhí)行語(yǔ)句
    }
    public static void method2() {
        // 執(zhí)行語(yǔ)句
    }
}
含有私有方法和私有靜態(tài)方法

私有方法:使用private修飾龄砰,供接口中的默認(rèn)方法或者靜態(tài)方法調(diào)用。
代碼如下:

public interface InterFaceName {
    private void method() {
        // 執(zhí)行語(yǔ)句
    }
}

1.3 基本的實(shí)現(xiàn)


實(shí)現(xiàn)的概述

類與接口的關(guān)系為實(shí)現(xiàn)關(guān)系,即類實(shí)現(xiàn)接口换棚,該類可以稱為接口的實(shí)現(xiàn)類式镐,也可以稱為接口的子類。實(shí)現(xiàn)的動(dòng)作類似繼承固蚤,格式相仿娘汞,只是關(guān)鍵字不同,實(shí)現(xiàn)使用implements關(guān)鍵字夕玩。
非抽象子類實(shí)現(xiàn)接口:

  1. 必須重寫接口中所有抽象方法你弦。
  2. 繼承了接口的默認(rèn)方法,即可以直接調(diào)用燎孟,也可以重寫禽作。

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

class 類名 implements 接口名 {
        // 重寫接口中抽象方法【必須】
        // 重寫接口中默認(rèn)方法【可選】
}
抽象方法的使用

必須全部實(shí)現(xiàn),代碼如下:
定義接口:

public interface LiveAble { 
    // 定義抽象方法 
    public abstract void eat(); 
    public abstract void sleep();
}

定義實(shí)現(xiàn)類:

public class Animal implements LiveAble { 
    @Override 
    public void eat() {
        System.out.println("吃東西")揩页; 
    }
    @Override 
    public void sleep() {
        System.out.println("晚上睡");
    }
}

定義測(cè)試類:

public class InterfaceDemo { 
    public static void main(String[] args) {
        // 創(chuàng)建子類對(duì)象
        Animal a = new Animal();
        // 調(diào)用實(shí)現(xiàn)后的方法
        a.eat(); 
        a.sleep();
    }
}
輸出結(jié)果:
吃東西
晚上睡
默認(rèn)方法的使用

可以繼承旷偿,可以重寫,二選一爆侣,但是只能通過(guò)實(shí)現(xiàn)類的對(duì)象來(lái)調(diào)用

  1. 繼承默認(rèn)方法萍程,代碼如下:?
    定義接口:
public interface LiveAble { 
    public default void fly(){
        System.out.println("天上飛"); 
    }
}

定義實(shí)現(xiàn)類:

public class Animal implements LiveAble { 
    // 繼承,什么都不用寫兔仰,直接調(diào)用
}

定義測(cè)試類:

public class InterfaceDemo {
    public static void main(String[] args) {         
        // 創(chuàng)建子類對(duì)象
        Animal a = new Animal();
        // 調(diào)用默認(rèn)方法
        a.fly();
    }
}
輸出結(jié)果:
天上飛
  1. 重寫默認(rèn)方法茫负,代碼如下:

定義接口:

public interface LiveAble {
    public default void fly(){
        System.out.println("天上飛");
    }
}

定義實(shí)現(xiàn)類:

public class Animal implements LiveAble {
    @Override
    public void fly() {
        System.out.println("自由自在的飛");
    }
}

定義測(cè)試類:

public class InterfaceDemo {
    public static void main(String[] args) {
        // 創(chuàng)建子類對(duì)象
        Animal a = new Animal();
        // 調(diào)用重寫方法
        a.fly();
    }
}
輸出結(jié)果: 
自由自在的飛
靜態(tài)方法的使用

靜態(tài)與.class文件相關(guān),只能使用接口名調(diào)用乎赴,不可以通過(guò)實(shí)現(xiàn)類的類名或者實(shí)現(xiàn)類的對(duì)象調(diào)用忍法,代碼如下:
定義接口:

public interface LiveAble {
    public static void run(){
        System.out.println("跑起來(lái)");
    }
}

定義實(shí)現(xiàn)類:

public class Animal implements LiveAble {
    // 無(wú)法重寫靜態(tài)方法
}

定義測(cè)試類:

public class InterfaceDemo {
    public static void main(String[] args) {
        // Animal.run(); // 【錯(cuò)誤】無(wú)法繼承方法,也無(wú)法調(diào)用
        LiveAble.run(); //
    }
}
輸出結(jié)果:
跑起來(lái)~~~
私有方法的使用
  • 私有方法:只有默認(rèn)方法可以調(diào)用。
  • 私有靜態(tài)方法:默認(rèn)方法和靜態(tài)方法可以調(diào)用无虚。

如果一個(gè)接口中有多個(gè)默認(rèn)方法缔赠,并且方法中有重復(fù)的內(nèi)容,那么可以抽取出來(lái)友题,封裝到私有方法中,供默認(rèn)方法去調(diào)用戴质。從設(shè)計(jì)的角度講度宦,私有的方法是對(duì)默認(rèn)方法和靜態(tài)方法的輔助。同學(xué)們?cè)谝褜W(xué)技術(shù)的基礎(chǔ)上告匠,可以自行測(cè)試戈抄。
定義接口:

public interface LiveAble { 
    default void func(){ 
        func1(); 
        func2();
    }
    private void func1(){         
        System.out.println(" 跑起來(lái) ~~~");
    }
    private void func2(){ 
        System.out.println(" 跑起來(lái) ~~~");
    }
}

1.4 接口的多實(shí)現(xiàn)


之前學(xué)過(guò),在繼承體系中后专,一個(gè)類只能繼承一個(gè)父類划鸽。而對(duì)于接口而言,一個(gè)類是可以實(shí)現(xiàn)多個(gè)接口的,這叫做接口的多實(shí)現(xiàn)裸诽。并且嫂用,一個(gè)類能繼承一個(gè)父類,同時(shí)實(shí)現(xiàn)多個(gè)接口丈冬。
實(shí)現(xiàn)格式:

class 類名 [extends 父類名] implements 接口名1,接口名2,接口名3... { 
    // 重寫接口中抽象方法【必須】
    // 重寫接口中默認(rèn)方法【不重名時(shí)可選】
}

[ ]: 表示可選操作嘱函。

抽象方法

接口中,有多個(gè)抽象方法時(shí)埂蕊,實(shí)現(xiàn)類必須重寫所有抽象方法往弓。如果抽象方法有重名的,只需要重寫一次蓄氧。代碼如
下:
定義多個(gè)接口:

interface A {
    public abstract void showA(); 
    public abstract void show();
}
interface B {
    public abstract void showB(); 
    public abstract void show();
}

定義實(shí)現(xiàn)類:

public class C implements A,B{?
    @Override 
    public void showA() {
        System.out.println("showA"); 
    }
    @Override 
    public void showB() {
        System.out.println("showB");
    }
    @Override
    public void show() {
        System.out.println("show"); }
    }
}
默認(rèn)方法

接口中函似,有多個(gè)默認(rèn)方法時(shí),實(shí)現(xiàn)類都可繼承使用喉童。如果默認(rèn)方法有重名的撇寞,必須重寫一次。代碼如下:
定義多個(gè)接口:

interface A {
    public default void methodA(){}
    public default void method(){}
}
interface B {
    public default void methodB(){}
    public default void method(){}
}

定義實(shí)現(xiàn)類:

public class C implements A,B{
    @Override
    public void method() {
        System.out.println("method");
    }
}
靜態(tài)方法

接口中泄朴,存在同名的靜態(tài)方法并不會(huì)沖突重抖,原因是只能通過(guò)各自接口名訪問(wèn)靜態(tài)方法。

優(yōu)先級(jí)的問(wèn)題

當(dāng)一個(gè)類祖灰,既繼承一個(gè)父類钟沛,又實(shí)現(xiàn)若干個(gè)接口時(shí),父類中的成員方法與接口中的默認(rèn)方法重名局扶,子類就近選擇執(zhí)行父類的成員方法恨统。代碼如下:
定義接口:

interface A {
    public default void methodA(){          
        System.out.println("AAAAAAAAAAAA");         
    }
}

定義父類:

class D { 
    public void methodA(){
        System.out.println("DDDDDDDDDDDD");
    }
}

定義子類:

class C extends D implements A { 
    // 未重寫 methodA 方法
}

定義測(cè)試類:

public class Test {
    public static void main(String[] args) {     
        C c = new C(); 
        c.methodA();
    }
}
輸出結(jié)果:
DDDDDDDDDDDD

1.5 接口的多繼承【了解】


一個(gè)接口能繼承另一個(gè)或者多個(gè)接口,這和類之間的繼承比較相似三妈。接口的繼承使用extends關(guān)鍵字畜埋,子接口繼承父接口的方法。 如果父接口中的默認(rèn)方法有重名的畴蒲,那么子接口需要重寫一次悠鞍。代碼如下:
定義父接口:

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

定義子接口:

interface D extends A,B{ 
    @Override 
    public default void method() {
        System.out.println("DDDDDDDDDDDDDD"); 
    }
}

小貼士:
子接口重寫默認(rèn)方法時(shí),default關(guān)鍵字可以保留模燥。
子類重寫默認(rèn)方法時(shí)咖祭,default關(guān)鍵字不可以保留。

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

  • 接口中蔫骂,無(wú)法定義成員變量么翰,但是可以定義常量,其值不可以改變辽旋,默認(rèn)使用public static final修飾浩嫌。
  • 接口中檐迟,沒(méi)有構(gòu)造方法,不能創(chuàng)建對(duì)象码耐。
  • 接口中追迟,沒(méi)有靜態(tài)代碼塊。

第二章 多態(tài)


2.1 概述


引入

多態(tài)是繼封裝伐坏、繼承之后怔匣,面向?qū)ο蟮牡谌筇匦浴?/p>

生活中,比如跑的動(dòng)作桦沉,小貓每瞒、小狗和大象,跑起來(lái)是不一樣的纯露。再比如飛的動(dòng)作剿骨,昆蟲(chóng)、鳥(niǎo)類和飛機(jī)埠褪,飛起來(lái)也是不一樣的浓利。可見(jiàn)钞速,同一行為贷掖,通過(guò)不同的事物,可以體現(xiàn)出來(lái)的不同的形態(tài)渴语。多態(tài)苹威,描述的就是這樣的狀態(tài)。

定義
  • 多態(tài):是指同一行為驾凶,具有多個(gè)不同表現(xiàn)形式牙甫。
前提【重點(diǎn)】
  1. 繼承或者實(shí)現(xiàn)【二選一】
  2. 方法的重寫【意義體現(xiàn):不重寫,無(wú)意義】
  3. 父類引用指向子類對(duì)象【格式體現(xiàn)】

2.2 多態(tài)的體現(xiàn)


多態(tài)體現(xiàn)的格式:

父類類型 變量名 = new 子類對(duì)象调违;
變量名.方法名()窟哺;

父類類型:指子類對(duì)象繼承的父類類型,或者實(shí)現(xiàn)的父接口類型技肩。

代碼如下:

Fu f = new Zi()且轨;
f.method();

當(dāng)使用多態(tài)方式調(diào)用方法時(shí)虚婿,首先檢查父類中是否有該方法殖告,如果沒(méi)有,則編譯錯(cuò)誤雳锋;如果有,執(zhí)行的是子類重寫后方法羡洁。
代碼如下:
定義父類:

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

定義子類:

class Cat extends Animal {
    public void eat() {
        System.out.println("吃魚");
    }
}
class Dog extends Animal {
    public void eat() {
        System.out.println("吃骨頭");
    }
}

定義測(cè)試類:

public class Test {
    public static void main(String[] args) { 
        // 多態(tài)形式,創(chuàng)建對(duì)象
        Animal a1 = new Cat();
        // 調(diào)用的是 Cat 的 eat 
        a1.eat();

        // 多態(tài)形式,創(chuàng)建對(duì)象
        Animal a2 = new Dog();
        // 調(diào)用的是 Dog 的 eat 
        a2.eat();
    }
}

2.3 多態(tài)的好處


實(shí)際開(kāi)發(fā)的過(guò)程中辛蚊,父類類型作為方法形式參數(shù)粤蝎,傳遞子類對(duì)象給方法,進(jìn)行方法的調(diào)用袋马,更能體現(xiàn)出多態(tài)的擴(kuò)展性與便利初澎。代碼如下:
定義父類:

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

定義子類:

class Cat extends Animal {
    public void eat() {
        System.out.println("吃魚");
    }
}
class Dog extends Animal {
    public void eat() {
        System.out.println("吃骨頭");
    }
}

定義測(cè)試類:

public class Test {
    public static void main(String[] args) {
        // 多態(tài)形式,創(chuàng)建對(duì)象
        Cat c = new Cat();
        Dog d = new Dog();

        // 調(diào)用 showCa tEat
        showCatEat(c);
        // 調(diào)用 showDogEat?
        showDogEat(d);

        /*
        以上兩個(gè)方法虑凛,均可以被showAnimalEat (Animal a)方法所替代 而執(zhí)行效果一致
        */
        showAnimalEat(c); 
        showAnimalEat(d);
    }

    public static void showCatEat (Cat c){
        c.eat();
    }

    public static void showDogEat (Dog d){
        d.eat();
    }

    public static void showAnimalEat (Animal a){ 
        a.eat();
    }
}

由于多態(tài)特性的支持碑宴,showAnimalEat方法的Animal類型,是Cat和Dog的父類類型桑谍,父類類型接收子類對(duì)象延柠,當(dāng)然可以把Cat對(duì)象和Dog對(duì)象,傳遞給方法锣披。
當(dāng)eat方法執(zhí)行時(shí)贞间,多態(tài)規(guī)定,執(zhí)行的是子類重寫的方法雹仿,那么效果自然與showCatEat增热、showDogEat方法一致, 所以showAnimal Eat完全可以替代以上兩方法胧辽。
不僅僅是替代峻仇,在擴(kuò)展性方面,無(wú)論之后再多的子類出現(xiàn)票顾,我們都不需要編寫showXxxEat方法了础浮,直接使用 showAnimalEat都可以完成。
所以奠骄,多態(tài)的好處豆同,體現(xiàn)在,可以使程序編寫的更簡(jiǎn)單含鳞,并有良好的擴(kuò)展影锈。

2.4 引用類型轉(zhuǎn)換


多態(tài)的轉(zhuǎn)型分為向上轉(zhuǎn)型與向下轉(zhuǎn)型兩種:

向上轉(zhuǎn)型
  • 向上轉(zhuǎn)型:多態(tài)本身是子類類型向父類類型向上轉(zhuǎn)換的過(guò)程,這個(gè)過(guò)程是默認(rèn)的蝉绷。 當(dāng)父類引用指向一個(gè)子類對(duì)象時(shí)鸭廷,便是向上轉(zhuǎn)型。
    使用格式:
父類類型 變量名 = new 子類類型()熔吗;
如:Animal a = new Cat();
向下轉(zhuǎn)型
  • 向下轉(zhuǎn)型:父類類型向子類類型向下轉(zhuǎn)換的過(guò)程辆床,這個(gè)過(guò)程是強(qiáng)制的。
    一個(gè)已經(jīng)向上轉(zhuǎn)型的子類對(duì)象桅狠,將父類引用轉(zhuǎn)為子類引用讼载,可以使用強(qiáng)制類型轉(zhuǎn)換的格式轿秧,便是向下轉(zhuǎn)型。
    使用格式:
子類類型 變量名 = ( 子類類型 ) 父類變量名 ; 
如:Cat c =(Cat) a;
為什么要轉(zhuǎn)型

當(dāng)使用多態(tài)方式調(diào)用方法時(shí)咨堤,首先檢查父類中是否有該方法菇篡,如果沒(méi)有,則編譯錯(cuò)誤一喘。也就是說(shuō)驱还,不能調(diào)用子類擁有,而父類沒(méi)有的方法凸克。編譯都錯(cuò)誤议蟆,更別說(shuō)運(yùn)行了。這也是多態(tài)給我們帶來(lái)的一點(diǎn)"小麻煩"触徐。所以咪鲜,想要調(diào)用子類特有的方法,必須做向下轉(zhuǎn)型撞鹉。
轉(zhuǎn)型演示疟丙,代碼如下:
定義類:

abstract class Animal {
    abstract void eat();
}
class Cat extends Animal { 
    public void eat() {     
        System.out.println("吃魚");
    }
    public void catchMouse() {
        System.out.println("抓老鼠");
    }
}
class Dog extends Animal { 
    public void eat() {
        System.out.println("吃骨頭");
    }
    public void watchHouse() {
        System.out.println("看家");
    }
}

定義測(cè)試類:

public class Test {
    public static void main(String[] args) {
        // 向上轉(zhuǎn)型
        Animal a = new Cat();
        a.eat();    // 調(diào)用的是 Cat 的 eat
        // 向下轉(zhuǎn)型
        Cat c = (Cat)a;
        c.catchMouse(); // 調(diào)用的是Cat的     
        catchMouse
    }
}
轉(zhuǎn)型的異常

轉(zhuǎn)型的過(guò)程中,一不小心就會(huì)遇到這樣的問(wèn)題鸟雏,請(qǐng)看如下代碼:

public class Test {
    public static void main(String[] args) {
        // 向上轉(zhuǎn)型
        Animal a = new Cat();
        a.eat();    // 調(diào)用的是 Cat 的 eat
        // 向下轉(zhuǎn)型
        Dog d = (Dog)a;
        d.watchHouse(); // 調(diào)用的是 Dog 的     
        watchHouse 【運(yùn)行報(bào)錯(cuò)】
    }
}

這段代碼可以通過(guò)編譯享郊,但是運(yùn)行時(shí),卻報(bào)出了ClassCastException,類型轉(zhuǎn)換異常孝鹊!這是因?yàn)榇读穑髅鲃?chuàng)建了Cat類型對(duì)象,運(yùn)行時(shí)又活,當(dāng)然不能轉(zhuǎn)換成Dog對(duì)象的苔咪。這兩個(gè)類型并沒(méi)有任何繼承關(guān)系,不符合類型轉(zhuǎn)換的定義柳骄。
為了避免ClassCastException的發(fā)生团赏,Java提供了 instancef 關(guān)鍵字,給引用變量做類型的校驗(yàn)耐薯,格式如下:

變量名 instanceof 數(shù)據(jù)類型
如果變量屬于該數(shù)據(jù)類型舔清,返回true。
如果變量不屬于該數(shù)據(jù)類型曲初,返回false体谒。

所以,轉(zhuǎn)換前臼婆,我們最好先做一個(gè)判斷抒痒,代碼如下:

public class Test {
    public static void main(String[] args) {
        // 向上轉(zhuǎn)型
        Animal a = new Cat();
        a.eat();    // 調(diào)用的是 Cat 的 eat
        // 向下轉(zhuǎn)型
        if (a instanceof Cat){
            Cat c = (Cat)a;
            c.catchMouse(); // 調(diào)用的是 Cat 的 catchMouse
        } else if (a instanceof Dog){
            Dog d = (Dog)a;
            d.watchHouse(); // 調(diào)用的是 Dog 的 watchHouse
        }
    }
}

第三章 接口多態(tài)的綜合案例


3.1筆記本電腦


筆記本電腦(laptop)通常具備使用USB設(shè)備的功能。在生產(chǎn)時(shí)颁褂,筆記本都預(yù)留了可以插入U(xiǎn)SB設(shè)備的USB接口, 但具體是什么USB設(shè)備评汰,筆記本廠商并不關(guān)心纷捞,只要符合USB規(guī)格的設(shè)備都可以。
定義USB接口被去,具備最基本的開(kāi)啟功能和關(guān)閉功能。鼠標(biāo)和鍵盤要想能在電腦上使用奖唯,那么鼠標(biāo)和鍵盤也必須遵守 USB規(guī)范惨缆,實(shí)現(xiàn)USB接口,否則鼠標(biāo)和鍵盤的生產(chǎn)出來(lái)也無(wú)法使用丰捷。

3.2 案例分析


進(jìn)行描述筆記本類坯墨,實(shí)現(xiàn)筆記本使用USB鼠標(biāo)、USB鍵盤

  • USB接口歼培,包含開(kāi)啟功能壹店、關(guān)閉功能
  • 筆記本類侦高,包含運(yùn)行功能、關(guān)機(jī)功能耍攘、使用USB設(shè)備功能
  • 鼠標(biāo)類,要實(shí)現(xiàn)USB接口畔勤,并具備點(diǎn)擊的方法
  • 鍵盤類蕾各,要實(shí)現(xiàn)USB接口,具備敲擊的方法

3.3 案例實(shí)現(xiàn)


定義USB接口 :

interface USB { 
    void open();// 開(kāi)啟功能 
    void close();// 關(guān)閉功能
}

定義鼠標(biāo)類:

class Mouse implements USB { 
    public void open() {
        System.out.println("鼠標(biāo)開(kāi)啟庆揪,紅燈閃一閃");
    } 
    public void close() {
        System. out. println ("鼠標(biāo)關(guān)閉式曲,紅燈熄滅"); 
    } 
    public void click(){
        System.out.println(" 鼠標(biāo)單擊");
    } 
}

定義鍵盤類:

class KeyBoard implements USB { 
    public void open() {
        System.out.println ("鍵盤開(kāi)啟,綠燈閃一閃"); 
    } 
    public void close() {
        System.out.println ("鍵盤關(guān)閉缸榛,綠燈熄滅"); 
    }
    public void type(){
        System.out.println ("鍵盤打字");
    }
}

定義筆記本類:

class Laptop {
    // 筆記本開(kāi)啟運(yùn)行功能
    public void run() {
        System.out.println ("筆記本運(yùn)行");
    }
    //筆記本使用usb設(shè)備吝羞,這時(shí)當(dāng)筆記本對(duì)象調(diào)用這個(gè)功能時(shí),必須給其傳遞一個(gè)符合USB規(guī)則的USB設(shè)備 
    public void useUSB(USB usb) {
        //判斷是否有USB設(shè)備
        if (usb != null) {
            usb.open();
            // 類型轉(zhuǎn)換,調(diào)用特有方法
            if(usb instanceof Mouse){
                Mouse m = (Mouse)usb内颗; 
                m.click();
            }else if (usb instanceof KeyBoard){
                KeyBoard kb = (KeyBoard)usb;                 
                kb.type();
            }
            usb.close();
        }
    }
    public void shutDown() {
        System.out.println ("筆記本關(guān)閉");
    }
}

測(cè)試類钧排,代碼如下:

public class Test {
    public static void main(String[] args) { 
        // 創(chuàng)建筆記本實(shí)體對(duì)象
        Laptop lt = new Laptop();
        // 筆記本開(kāi)啟
        lt.run();

        // 創(chuàng)建鼠標(biāo)實(shí)體對(duì)象?
        Usb u = new Mouse();
        // 筆記本使用鼠標(biāo) 
        lt.useUSB(u);

        // 創(chuàng)建鍵盤實(shí)體對(duì)象
        KeyBoard kb = new KeyBoard();
        // 筆記本使用鍵盤 
        lt.useUSB(kb);
        // 筆記本關(guān)閉
        lt.shutDown();
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市起暮,隨后出現(xiàn)的幾起案子卖氨,更是在濱河造成了極大的恐慌,老刑警劉巖负懦,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筒捺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡纸厉,警方通過(guò)查閱死者的電腦和手機(jī)系吭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)颗品,“玉大人肯尺,你說(shuō)我怎么就攤上這事沃缘。” “怎么了则吟?”我有些...
    開(kāi)封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵槐臀,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我氓仲,道長(zhǎng)水慨,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任敬扛,我火速辦了婚禮晰洒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘啥箭。我一直安慰自己谍珊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布急侥。 她就那樣靜靜地躺著砌滞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缆巧。 梳的紋絲不亂的頭發(fā)上布持,一...
    開(kāi)封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音陕悬,去河邊找鬼题暖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛捉超,可吹牛的內(nèi)容都是我干的胧卤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拼岳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼枝誊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起惜纸,我...
    開(kāi)封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叶撒,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后耐版,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體祠够,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年粪牲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了古瓤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖落君,靈堂內(nèi)的尸體忽然破棺而出穿香,到底是詐尸還是另有隱情,我是刑警寧澤绎速,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布皮获,位于F島的核電站,受9級(jí)特大地震影響朝氓,放射性物質(zhì)發(fā)生泄漏魔市。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一赵哲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧君丁,春花似錦枫夺、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至印蔗,卻和暖如春扒最,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背华嘹。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工吧趣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耙厚。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓强挫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親薛躬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子俯渤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345