1. 程式人生 > 其它 >java學習——抽象類與介面的應用

java學習——抽象類與介面的應用

技術標籤:javaSE抽象類java介面設計模式

抽象類與介面的區別

抽象類應用——模板設計模式
介面的實際應用——標準
介面的應用——工廠設計模式(Factory)
介面的應用——代理設計模式(Proxy)

NO.#####區別 ######抽象類介面
1關鍵字abstract classinterface
2組成構造方法、普通方法、抽象方法、static方法、常量、變數抽象方法、全域性變數
3子類使用class子類 extends 抽象類class 子類 implements 介面,介面,…
4許可權可以使用各種許可權只能使用public許可權
5關係抽象類可以實現多個介面介面不能繼承抽象類,卻可以繼承多個父介面
6限制但繼承侷限沒有但繼承侷限
7子類抽象類和介面都必須有子類,子類必須要重寫全部的抽象方法抽象類和介面都必須有子類,子類必須要重寫全部的抽象方法
8例項化物件依靠子類物件的向上轉型進行物件的例項化依靠子類物件的向上轉型進行物件的例項化

抽象類應用——模板設計模式

package test;

public class testAbstract {
    public static void main(String[] args) {
        fun(new Robot());  //傳遞機器人行為子類
        fun(new Person()); //傳遞人類行為子類
        fun
(new Pig()); //傳遞豬行為子類 } public static void fun(Action act){ act.command(Action.EAT); act.command(Action.SLEEP); act.command(Action.WORK); } } abstract class Action{ //定義一個抽象的行為類,行為不是具體的 public static final int EAT = 1; public static final int SLEEP = 2; public
static final int WORK = 4; public void command(int flag){ switch (flag){ case EAT:this.eat();break; case SLEEP:this.sleep();break; case WORK:this.work();break; } } //定義三個抽象方法 public abstract void eat(); public abstract void sleep(); public abstract void work(); } class Robot extends Action{ //重寫父類的抽象方法 @Override public void eat() { System.out.println("機器人靠充電補充能量"); } @Override public void sleep() { } @Override public void work() { System.out.println("機器人可以不停的工作"); } } class Person extends Action{ @Override public void eat() { System.out.println("人類靠吃飯補充能量"); } @Override public void sleep() { System.out.println("人類需要睡覺"); } @Override public void work() { System.out.println("人類需要工作"); } } class Pig extends Action{ @Override public void eat() { System.out.println("豬隻知道吃"); } @Override public void sleep() { System.out.println("豬吃完就睡"); } @Override public void work() { } }

執行截圖

介面的實際應用——標準

package test;
//介面的實際應用----標準
public class testInterface {
    public static void main(String[] args) {
        Computer computer = new Computer();//例項化電腦物件
        computer.plugin(new flash()); //插入USB介面裝置
        computer.plugin(new print()); //插入USB介面裝置
    }
}
//定義USB標準
interface USB{
    public void start();//USB開始工作
    public void stop();//USB停止工作
}
//定義計算機類
class Computer{
    public void plugin(USB usb){  //插入USB介面裝置(子類物件)
        usb.start();
        usb.stop();
    }
}
//定義U盤子類
class flash implements USB{

    @Override
    public void start() {
        System.out.println("U盤開始使用");
    }

    @Override
    public void stop() {
        System.out.println("U盤停止使用");
    }
}

//定義印表機
class print implements USB{

    @Override
    public void start() {
        System.out.println("印表機開始工作");
    }

    @Override
    public void stop() {
        System.out.println("印表機停止工作");
    }
}

執行截圖

介面的應用——工廠設計模式(Factory)

package test;
//工廠設計模式
public class testFactory {
    public static void main(String[] args) {
        fruit f = Factory.getInstance("Apple");
        f.eat();
        f = Factory.getInstance("Orange");
        f.eat();
    }
}
//定義工廠類,此類不再產生新的屬性
class Factory{
    /**
     * 取得指定型別的介面物件
     * @param className 要取得的類例項化物件標記
     * @return 如果指定標記存在,則返回fruit介面的例項化物件,否則返回null
     */
    public static fruit getInstance(String className){
        if ("Apple".equals(className)){  //是否為蘋果類
            return new Apple();
        }else if ("Orange".equals(className)){  //是否為橘子類
            return new Orange();
        }else {
            return null;
        }
    }
}
interface fruit{
    public abstract void eat(); //定義抽象方法
}
class Apple implements fruit{  //定義介面子類

    @Override
    public void eat() {   //重寫抽象方法
        System.out.println("jack正在吃蘋果");
    }
}
class Orange implements fruit{

    @Override
    public void eat() {
        System.out.println("tom正在吃橘子");
    }
}

執行結果
介面的應用——代理設計模式(Proxy)

package test;
//介面的應用----代理
public class testProxy {
    public static void main(String[] args) {
        network net = null;  //定義介面物件
        net = new Proxy(new Real()); //例項化代理,同時傳入代理的真實操作
        net.browser();  //客戶只關心上網瀏覽這一個功能
    }
}
//定義network介面
interface network{
    public void browser(); //定義瀏覽的抽象方法
}
class Real implements network{  //真實的上網操作
    @Override
    public void browser() {  //重寫抽象方法
        System.out.println("我正在網上瀏覽資訊");
    }
}
class Proxy implements network{  //代理上網
    private network net;
    public Proxy(network net){  //設定代理的真實操作
        this.net = net;  //設定代理的子類
    }
    public void check(){   //檢查用的是哪個運營商代理
        System.out.println("我正在使用移動的資料網");
    }
    @Override
    public void browser() {
        this.check();
        this.net.browser();
    }
}

執行結果