Java 介面與模組設計模式
阿新 • • 發佈:2019-01-02
一、JDK1.8前的介面
1.狹義的定義:interface(關鍵字) 介面名 {}
2.廣義的定義:介面就相當於定義了,一個規則,我們要想使用這個介面,就必須遵守這個規則
注:定義的是jdk1.8以前的規則
1).介面中只能宣告抽象方法
2).如果你宣告一個方法,沒有寫abstract,系統會預設幫你加上--abstract
3).介面沒有構造方法,不能直接例項化物件
4).介面中定義的成員變數,預設的修飾詞是 public static finall是常量,並且直接用介面名去呼叫
使用介面的關鍵字,implements(實現)---實現這個介面
注:介面的實現類,都有後綴的Impl
3.
1)類和類的關係
類和類 繼承關係 只能單繼承,可以多層繼承
2)類和介面的關係
類和介面 實現的關係 可以單實現,也可以多實現(介面可以有很多個)
3)介面和介面的關係
是繼承關係,可以單繼承,也可以多繼承
例題
動物:吃,叫
貓:貓吃魚,喵喵
跳高貓
訓練動物:訓練跳高
訓練貓:會跳高的貓
4)程式碼
例題1:
public 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);
}
}
}