1. 程式人生 > >Java 介面與模組設計模式

Java 介面與模組設計模式

一、JDK1.8前的介面

1.狹義的定義:interface(關鍵字) 介面名 {}

2.廣義的定義:介面就相當於定義了,一個規則,我們要想使用這個介面,就必須遵守這個規則
注:定義的是jdk1.8以前的規則
 1).介面中只能宣告抽象方法
 2).如果你宣告一個方法,沒有寫abstract,系統會預設幫你加上--abstract
 3).介面沒有構造方法,不能直接例項化物件
 4).介面中定義的成員變數,預設的修飾詞是 public static finall是常量,並且直接用介面名去呼叫
 使用介面的關鍵字,implements(實現)---實現這個介面
注:介面的實現類,都有後綴的Impl
3.
1)類和類的關係 類和類 繼承關係 只能單繼承,可以多層繼承 2)類和介面的關係 類和介面 實現的關係 可以單實現,也可以多實現(介面可以有很多個) 3)介面和介面的關係 是繼承關係,可以單繼承,也可以多繼承 例題 動物:吃,叫 貓:貓吃魚,喵喵 跳高貓 訓練動物:訓練跳高 訓練貓:會跳高的貓 4)程式碼 例題1public class Demo02 { public static void main(String[] args) { } } abstract class Animal{ //抽象方法 public abstract void eat() ; public
abstract void speak(); } //測試介面多實現 interface InterB{ public abstract void fun1(); } interface InterC{ public abstract void fun2(); } //實現多介面的實現類 class InterImpl implements InterD{ @Override public void fun1() { // TODO Auto-generated method stub } @Override public void
fun2() { // TODO Auto-generated method stub } @Override public void fun3() { // TODO Auto-generated method stub } } //單繼承 多繼承 interface InterD extends InterB,InterC{ public abstract void fun3(); } //寫個介面 訓練 interface CatJumpInter { //訓練貓 public abstract void jump(); } //貓類繼承 實現介面 class Cat extends Animal { //重寫抽象類裡的方法 @Override public void eat() { // TODO Auto-generated method stub System.out.println("貓吃魚"); } @Override public void speak() { // TODO Auto-generated method stub System.out.println("貓叫 喵喵喵"); } } //跳高貓 class JumpCat extends Cat implements CatJumpInter{ //實現介面中的方法 @Override public void jump() { System.out.println("拿棒子 懟屁股跳高"); } }
例題2
package com.lanou3g.test;
需求:經過國際主機板研究協會討論 
最終要求 主機板生產商 要按規則生產可插卡的主機板
所有的卡都要有 開始和停止的方法
設計完成 生產 大力牌主機板
public class Demo03 {
public static void main(String[] args) {
    //父類引用只想子類空間
    //多型---向上轉型
    MainBoardInter mainBoardInter = new DLMainBoardInter ();
    //向上轉型
      DLMainBoardInter dlMainBoardInter = (DLMainBoardInter)mainBoardInter;
      dlMainBoardInter.run();
      //新增一張網絡卡
      Card card = new NetCard();
      dlMainBoardInter.addCard(card);
      //只需要傳入一個卡類的子類物件就行,
      dlMainBoardInter.addCard(new NetCard());

}
}
//抽象卡類 開始和停止
//音效卡繼承 抽象類
//大力牌實現介面

//大力牌實現介面

//主機板介面
interface MainBoardInter {
    //插卡方法 new Card = new  NetCard;
    //定義主機板的規則
    public abstract void addCard(Card card);
}
//大力牌主機板
 class DLMainBoardInter implements MainBoardInter{
//實現主機板的規則
    @Override
    public void addCard(Card card) {
        card.start();
        card.stop();

    }
    //主機板啟動
    public void run() {
        System.out.println("主機板啟動");
    }

 }

  //抽象卡類 開始和停止
abstract  class Card{
    public abstract void start();
    public  abstract void stop();
}
//音效卡繼承 抽象類
  class SayCard extends Card{

    @Override
    public void start() {
        // TODO Auto-generated method stub

    }

    @Override
    public void stop() {
        // TODO Auto-generated method stub

    }

  }
  //網絡卡
  class NetCard extends Card{
//重寫網絡卡方法
    @Override
    public void start() {
        // TODO Auto-generated method stub
        System.out.println("開始上網");
    }

    @Override
    public void stop() {
        // TODO Auto-generated method stub
    System.out.println("中斷上網");
    }

  }

二、JDK1.8後的介面

package com.lanou3g.test;
JDK1.8後 介面的新特性(暫時沒有什麼應用場景)
 介面中可以宣告
 1.抽象方法
 2.靜態方法
 使用 static 關鍵詞修飾的方法
 3.預設方法 
 使用default關鍵詞
 分析思路:
 * 1.明確寫法
 * 2.明確如何在介面和實現類中呼叫
 * 3.明確如何在物件中去呼叫
 * 4.最後總結要注意什麼
 抽象類和介面的區別
 * 1.成員變數
 * 抽象類:可以是變數也可以是常量
 * 介面:  只能是常量
 * 2.成員方法
 * 抽象類: 可以是抽象方法,也可以是普通的成員方法
 * 介面:只能是抽象方法 靜態方法 預設發方法
 * 3.構造方法(抽象類和介面都不能例項化物件)
 *抽象類:可以有構造方法 可以被繼承
 *介面:沒有構造方法 只能被實現
 程式碼:
public class Demo04 {
//介面中,直接介面名呼叫
    public static void main(String[] args) {
        InterX.staticFun();
        //建立一個介面的實現類的物件
        InterX interX = new InterXImpl();
        //呼叫介面中預設的方法
        interX.defaultFun();
        //呼叫介面中被重寫的抽象的方法
        //interX.print();
        System.out.println();

        //呼叫實現類中的特有方法
        InterXImpl impl = (InterXImpl)interX;
        impl.fun();

        System.out.println();
        //呼叫介面類中的靜態方法
        InterX.staticFun();
        //呼叫實現類中的靜態方法
        InterXImpl.staticFun();

    }
}
//定義一個介面
interface InterX{
    //宣告一個抽象方法
    public abstract void print();
    //宣告一個靜態的方法
    public static void staticFun() {
        System.out.println("我是介面中的靜態方法 staticFun");
    }
    //宣告一個預設方法  
    public default void defaultFun() {
        System.out.println("我是介面的預設方法 defaultFun");
    }
}
 //如何呼叫介面中 靜態方法 和 預設方法 
//介面的實現類
//實現類中,可以不用去實現介面中的 靜態方法和 預設方法
class InterXImpl implements InterX{
//實現介面中的抽象方法
    @Override
    public void print() {
        // TODO Auto-generated method stub
        System.out.println("我是實現類中的抽象方法");
    }
    //重寫介面中的預設方法
    //實現類中 如果想呼叫介面中預設的方法 可以使用 介面名 點 super 點 方法名();
    @Override
        public void defaultFun() {
        //沒有物件,所以要加上介面名--作為標識(一種形式)
        InterX.super.defaultFun();
            System.out.println("我是實現類中 重寫接口裡的預設方法");
        }
    //實現類中特有的方法
    public  void fun() {
        //呼叫介面中的 預設方法
        InterX.super.defaultFun();
        System.out.println("我是實現類中的特有的方法 fun");
    }
    //靜態方法 又叫類方法 
    public static void staticFun() {
        System.out.println("我是實現類中的靜態方法 staticFun");
    }
}

三、 模板設計模式(設計思想)

通過例題理解:例題1
 需求:
 * 學習類 來藍鷗學習 報名繳費
 * 選擇學習進行學科學習(JAVA H5 VR)
 * 畢業找工作

public class Demo05 {
public static void main(String[] args) {

    FenJian fenJian = new FenJian();
    fenJian.lanOuStudy();

    System.out.println();

    Study study = new FenJian();
    study.lanOuStudy();
}
}
//學習類(相當於一個模板,可以適應選擇不同學科的學生)
//想讓這個學習類 適應於來藍鷗學習的每一個學生
abstract class Study 
{
    //來藍鷗學習的方法
    public void lanOuStudy() {
        //第一步 和 最後一步 只有中間一部分不確定
        System.out.println("報名繳費");
        //呼叫抽象方法
        chooseSubject();
        System.out.println("畢業找工作");
    }
  //宣告一個抽象的方法
    public abstract void chooseSubject();
}
class FenJian extends Study{
  //重寫抽象方法
    @Override
    public void chooseSubject() {
        // TODO Auto-generated method stub
        System.out.println("選擇JAVA學科");
    }

}
例題2:
package com.lanou3g.test;
 * 需求:
 * 計算一個程式的 執行時間
public class Demo06 {
public static void main(String[] args) {
    //獲取1970.1.1日 和 當前系統時間的差值
    //以毫秒為單位 1秒 == 1000毫秒
    //當前 - 執行後的當前時間 
    GetTime getTime = new Test();
    getTime.getTime();
}
}
abstract class GetTime{
        public void getTime() {
     long start = System.currentTimeMillis();
     fun();         
     long stop = System.currentTimeMillis();
     //執行程式 計算時間差
     System.out.println((stop - start)+"毫秒");
}
 //宣告成抽象方法 ,把執行的程式宣告成抽象方法
        public abstract void fun();
}
class Test extends GetTime{
    //重寫抽象方法 方法中就寫 要計算的 執行時間的方法
    @Override
    public void fun() {
        for(int i = 0;i<40000;i++) {
            System.out.println(i);
            }
        }

}