1. 程式人生 > 其它 >面向物件程式設計----介面詳解

面向物件程式設計----介面詳解

介面 interface 或者叫介面

我們前面用繼承關係,描述了動物、哺乳動物、爬行動物的各種關係。

 現在我們要描述:

--飛機  導彈  子彈  籃球 石頭的關係?

為什麼需要介面?介面和抽象類的區別?

--介面就是比“抽象類”還“抽象”的“抽象類”可以更加規範的對子類進行約束全面地專業地實現了:規範和具體實現的分離

--介面就是規範,定義的是一組規範體現了現實世界中“如果你是。。。則必須能。。。”的思想。

如果你是天使,則必須能飛,如果你是汽車,則必須能跑,如果你好人,則必須幹掉壞人;如果你是壞人,則必須欺負好人。

--介面的本質是契約,就像我們人間的法律一樣。制定好後大家都遵守。

--專案的具體需求是多變的,我們必須以不變應萬變才能從容開發,此處的“不變”就是“規範”。因此,我們開發專案往往都是面向介面程式設計!

如何定義介面

--格式:

[訪問修飾符] interface 介面名 [extends 父介面1,父介面2]{

--常量定義   //總是 public static final

--方法定義   //總是 public abstract

}

--子類通過implements來實現介面中的規範

--介面不能建立例項但是可用於宣告引用變數型別

--一個類實現了介面必須實現介面中所有的方法並且這些方法只能是public的。

--介面支援多繼承

package cn.bjsxt.oop.testInterface;
/**
* 測試介面
* 用繼承不能來定義的東西,可以用來定義更加抽象關係

用介面來定義 如:飛機、戰鬥機、石頭、無人機、子彈
* @author 神奇的夢
*
*/
//建檔案的時候也可以用new interface來建立
//這裡就不能用class要用interface
//編譯的時候還是java檔案,編譯的時候也是class檔案

//它的意義就在於:設計和實現分離,就是來讓你實現的
public interface MyInterface1 {
// 接口裡面有什麼:
// 只有常量和抽象方法。
// public static final 介面中常量定義時,寫或不寫都是這樣
public static final String MAX_GREAD ="BOSS";
int MAX_SPEED =120;


// private不被允許 接口裡面必須是公開的
// abstract 抽象 這裡必須是公開的 它是規範
// 總是 public abstract
public void test01();
// 寫一個方法text02 ,返回一個int
public int test02(int a,int b);
}

package cn.bjsxt.oop.testInterface;
// implements 實現
public class MyClass implements MyInterface1 {
@Override
public void test01() {
// 類似於變數的東西
// MyInterface1.MAX_GREAD;
System.out.println(MyInterface1.MAX_GREAD);
System.out.println("test01");
}
@Override
public int test02(int a, int b) {
return 0;
}
}

package cn.bjsxt.oop.testInterface;

public interface Flyable {
// 最高速度不能超過11000米/每秒,超了就程式設計衛星了
int MAX_SPEED=11000;
// 最低高度不能超過1米,超了1米叫飛,不超1米叫跳
int MIN_HEIGHT = 1;
// 沒加public 預設加了public abstract
void fly();
}
//介面可以定義多個
interface Attack{
void attack();
}
class Plane implements Flyable{
@Override
public void fly() {
System.out.println("跳起來,飛!");
}
}
//介面可以定義多個 介面意味著規範
class Storn implements Flyable,Attack{
int weight;
@Override
public void fly() {
System.out.println("扔出去,飛!");
}
@Override
public void attack() {
System.out.println("石頭攻擊!");
}
}
class Man implements Flyable{
public void fly() {
System.out.println("跳起來,飛!");
}
}

package cn.bjsxt.oop.testInterface;

public class Test {
public static void main(String[] args) {
// 無法例項化介面的型別
// Flyable f=new Flyable();
// 因為它是Flyable所以它只認識Flyable以及介面內的幾個變數
Flyable f=new Man();
// f指向Man裡面的fly()方法;
f.fly();

MyInterface1 m=new MyClass();
m.test01();

}
}

package cn.bjsxt.oop.testInterface;
/**
* 建立介面 interface
* @author 神奇的夢
* 介面支援多繼承
* 多繼承會引入複雜性
* 因為介面已經足夠簡單了
*/
public interface InterfaceA {
void aaa();
}
interface InterfaceB{
void bbb();
}
interface InterfaceC extends InterfaceA,InterfaceB{
void cccc();
}
class TestClass implements InterfaceC{
@Override
public void aaa() {
// TODO Auto-generated method stub
}
@Override
public void bbb() {
// TODO Auto-generated method stub
}
@Override
public void cccc() {
// TODO Auto-generated method stub
}
}