生活中的接口
1、接口
一個Java接口是一些方法特征的集合,但沒有方法的實現。
如果某個類中的所有方法都是抽象方法,那么可以考慮將該類定義為接口。
2、接口的定義
定義接口使用關鍵字interface
,一般語法:
[訪問權限] interface 接口名 {
成員列表
}
public interface IMyInterface {
……
}
3、接口的實現
與抽象類相似,接口同樣不可以實例化,只能用于實現。
如果某類要實現接口,則使用implements
關鍵字,一般語法:
[訪問權限] class 類名 implements 接口名 {
成員列表
}
public class MyClass implements IMyInterface {
……
}
例1:
// IMyInterface.java
package aaa;
//定義接口
public interface IMyInterface
{
/*接口中的所有方法都默認為抽象方法,無需加abstract關鍵字*/
public int add(int x, int y);
public int sub(int x, int y);
}
// MyClass.java
package bbb;
import aaa.IMyInterface;
//MyClass類實現于IMyInterface接口
public class MyClass implements IMyInterface {
//實現接口中的抽象方法
public int add(int x, int y) {
return (x + y);
}
public int sub(int x, int y) {
return (x - y);
}
}
/*InterfaceDemo.java源文件*/
//導入必要的接口和類
import aaa.IMyInterface;
import bbb.MyClass;
//用于容納main方法
public class InterfaceDemo
{
public static void main(String[] args) {
//使用接口的引用指向實現類的實例
IMyInterface obj = new MyClass();
System.out.println("兩數的和是:" + obj.add(20, 30));
System.out.println("兩數的差是:" + obj.sub(30, 20));
}
}
例2:
// java接口,相當于主板上的PCI插槽的規范
public interface PCI {
public void start();
public void stop();
}
// Java接口中定義的方法在不同的地方被實現,可以具有完全不同的行為
class SoundCard implements PCI {
public void start() {
System.out.println("Du du");
}
public void stop() {
System.out.println("Sound stop!");
}
}
class NetworkCard implements PCI {
public void start() {
System.out.println("Send...");
}
public void stop() {
System.out.println("Network stop!");
}
}
// 運行時,根據實際創建的對象類型,調用相應的方法實現
public class Assembler {
public static void main(String[] args) {
PCI nc = new NetworkCard(); // 可以使用接口的引用指向其實現類的對象,從而達到動態多態的效果
PCI sc = new SoundCard();
nc.start();
sc.start();
}
}
4、注意事項
(1)接口中不能定義非抽象方法,也就是說接口中不能包含有函數實體;
(2)接口中的所有方法都默認為抽象方法,無需在每個方法前加abstract
關鍵字;
(3)接口的實現類應該提供對接口中所有抽象方法的具體實現,否則將成為抽象類;
(4)與抽象類和它的繼承類相似,也可以使用接口的引用指向其實現類的對象,從而達到動態多態的效果;
(5)接口中的所有變量都默認為常量;
加入final 關鍵字代表常量,加入static 關鍵字代表類變量。
盡量使用含義直觀的常量來表示那些將在程序中多次出現的數字或字符串。
例:
public class CSStudent {
public static final int FEMALE = 1; //代表女性
public static final int MALE = 2; //代表男性
private int sex; //性別
public void setSex(int sex) {
if(sex==FEMALE)
System.out.println("這是一名女學生");
else if(sex == MALE)
System.out.println("這是一名男學生");
this.sex = sex;
}
}
在Java 接口中聲明的變量在編譯時會自動加上static final的修飾符,即聲明為常量,因而Java接口通常是存放常量的最佳地點。
public interface SchoolType {
(static final) String CUIT = “a";
(static final) String CULA = “b";
}
(6)Java只支持單繼承,而不像C++一樣可以多重繼承。接口正是為了彌補這一點。
某一個類只能繼承一個父類,但可以實現多個接口。
public class 實現類名 implements 接口1, 接口2, ..., 接口n {
成員列表
}
(7)Java中還允許一個接口繼承于另一個接口,即由父接口派生出子接口。
public interface 子接口名 extends 父接口名 {
成員列表
}
這樣的話,就可以使用父接口的引用指向子接口的實現類的對象。
5、面向接口編程
開發系統時,主體構架使用接口,接口構成系統的骨架,這樣就可以通過更換接口的實現類來更換系統的實現
6、類和類之間的關系
類與類之間的關系一般來說有兩種:“有”關系和“是”關系;
所謂“是”關系就是指類的繼承關系。如:從動物類派生出哺乳動物類,那么可以說哺乳動物是動物。
而“有”關系是指在一個類中包含了另一個類的對象,即一個類中有另一個類(的對象),可以理解為類的嵌套。