介面與實作
- 1 介面
- 2 實作介面
- 3 介面回呼
- 4 理解介面
- 5 介面與多型
- 6 介面變數做引數
- 7 abstract類與介面的比較
- 8 面向介面編程
1 介面
為了克服Java單繼承的缺點,Java使用了介面,一個類可以實作多個介面
使用關鍵字interface來定義介面,介面的定義和類的定義很相似,分為介面的宣告和介面體,
-
介面宣告
——使用關鍵字interface來宣告
——格式: interface 介面名字 -
介面體
—— 介面體中包含常量定義和方法定義兩部分,介面體中只進行方法的宣告,不提供方法的實作,且用分號結尾,
例如:
interface Printable {
final int MAX = 100;
void add();
float sum(float x, float y);
}
1 介面中變數自動是 public、static、final
2 介面中的方法默認是 public abstract
3 介面也產生class檔案
4 介面中的方法不能被static和final修飾,因為要重寫所有介面中的方法
5 介面中沒有構造方法
2 實作介面
1、一個類通過使用關鍵字implements宣告自己實作一個或多個介面,*
如: class A implements Printable,Addable
2、如果一個非抽象類實作了某個介面,那么這個類必須重寫該介面的所有方法,而且方法的訪問權限一定要顯示地用public來修飾,
3、介面可以通過繼承產生新的介面,
4、Java提供的介面都在相應的包中,通過import語 句不僅可以引入包中的類,也可以引入包中的介面,
例如:import java.io.*;
5、如果一個類宣告實作一個介面,但沒有重寫介面中的所有方法,那么這個類必須是抽象類,也就是說,抽象類既可以重寫介面中的方法,也可以直接擁有介面中的方法,
程式可以用介面名直接訪問介面中的常量,但是一個類實作了該介面,那么可以在類體中直接使用該介面中的常量,
6、定義介面時,如果關鍵字interface 前面加上public關鍵字,就稱這樣的介面是-一個public介面,public 介面可以被任何一個類實作,如果一一個介面不加public修飾,就稱作友好介面,友好介面可以被與該介面在同一包中的類實作,
7、如果父類實作了某個介面,那么子類也就自然實作了該介面,子類不必再顯式地使用關鍵字implements宣告實作這個介面,
8、介面也可以被繼承,即可以通過關鍵字extends宣告一個介面是另一個介面的子介面,
由于介面中的方法和常量都是public的,子介面將繼承父介面中的全部方法和常量,
例子1中 包含有China類、Japan 類和Computable介面,而且China和Japan類都實作了Computable介面
//Computable.java
public interface Computable {
int MAX = 46;
int f(int x);
}
//China.java
public class China implements Computable { //China類實作Computable介面
int number;
public int f(int x) { //不要忘記public關鍵字
int sum=0;
for(int i=1;i<=x;i++) {
sum=sum+i;
}
return sum;
}
}
//Japan.java
public class Japan implements Computable { //Japan類實作Computable介面
int number;
public int f(int x) {
return MAX+x;
}
}
//Test.java
public class Test {
public static void main(String args[]) {
China zhang;
Japan henlu;
zhang=new China();
henlu=new Japan();
zhang.number=32+Computable.MAX;
henlu.number=14+Computable.MAX;
System.out.println("zhang的學號"+zhang.number+",zhang求和結果"+zhang.f(100));
System.out.println("henlu的學號"+henlu.number+",henlu求和結果"+henlu.f(100));
}
}

3 介面回呼
介面回呼是指:可以把實作某一介面的類創建的物件的參考賦給該介面宣告的介面變數中,那么該介面變數就可以呼叫被類重寫的介面方法,實際上,當介面變數呼叫被類重寫的介面方法時,就是通知相應的物件呼叫這個方法,
//分析:
Com com;//宣告介面物件
ImpleCom obj = new ImpleCom();//實作介面子類物件
com = obj; //介面回呼

interface ShowMessage {
void 顯示商標(String s);
}
class TV implements ShowMessage {
public void 顯示商標(String s) {
System.out.println(s);
}
}
class PC implements ShowMessage {
public void 顯示商標(String s) {
System.out.println(s);
}
}
public class Example {
public static void main(String args[]) {
ShowMessage sm; //宣告介面變數
sm=new TV(); //介面變數中存放物件的參考
sm.顯示商標("長城牌電視機"); //介面回呼,
sm=new PC(); //介面變數中存放物件的參考
sm.顯示商標("聯想奔月5008PC機"); //介面回呼
}
}
4 理解介面
理解的關鍵點是:
(1)介面可以抽象出重要的行為標準,該行為標準用抽象方法來表示,
(2)可以把實作介面的類的物件的參考賦值給介面變數,該介面變數可以呼叫被該類實作的介面方法,即體現該類根據介面里的行為標準給出的具體行為,
介面的思想在于它可以要求某些類有相同名稱的方法,但方法的具體內容(方法體的內容)可以不同,即要求這些類實作介面,以保證這些類一定有介面中所宣告的方法(即所謂的方法系結),介面在要求一些類有相同名稱的方法的同時,并不強迫這些類具有相同的父類,
例子3中,要求MotorVehicles類(機動車)的子類Taxi (出租車)和Bus(公共汽車)必須有名稱為brake的方法(有剎車功能),但額外要求Taxi類有名字為controlAirTemperature和charge的方法(有空調和收費功
能),即要求Taxi實作兩個介面,要求客車類有名字為charge的方法(有收費功能),即要求Bus只實作一個介面,
abstract class MotorVehicles {
abstract void brake();
}
interface MoneyFare {
void charge();
}
interface ControlTemperature {
void controlAirTemperature();
}
class Bus extends MotorVehicles implements MoneyFare {
void brake() {
System.out.println("公共汽車使用轂式剎車技術");
}
public void charge() {
System.out.println("公共汽車:一元/張,不計算公里數");
}
}
class Taxi extends MotorVehicles implements MoneyFare,ControlTemperature {
void brake() {
System.out.println("出租車使用盤式剎車技術");
}
public void charge() {
System.out.println("出租車:2元/公里,起價3公里");
}
public void controlAirTemperature() {
System.out.println("出租車安裝了Hair空調");
}
}
class Cinema implements MoneyFare,ControlTemperature {
public void charge() {
System.out.println("電影院:門票,十元/張");
}
public void controlAirTemperature() {
System.out.println("電影院安裝了中央空調");
}
}
public class Example{
public static void main(String args[]) {
Bus bus101 = new Bus();
Taxi buleTaxi = new Taxi();
Cinema redStarCinema = new Cinema();
MoneyFare fare;
ControlTemperature temperature;
fare = bus101;
bus101.brake();
fare.charge();
fare = buleTaxi;
temperature = buleTaxi;
buleTaxi.brake();
fare.charge();
temperature.controlAirTemperature();
fare = redStarCinema;
temperature = redStarCinema;
fare.charge();
temperature.controlAirTemperature();
}
}
5 介面與多型
可以通過在介面中宣告若干個abstract方法,表明這些方法的重要性,方法體的內容細節由實作介面的類去完成,使用介面進行程式設計的核心思想是使用介面回呼,即介面變數存放實作該介面的類的物件的參考,從而介面變數就可
以回呼類實作的介面方法,
例子:介面與多型
interface CompurerAverage {
public double average(double a,double b);
}
class A implements CompurerAverage {
public double average(double a,double b) {
double aver=0;
aver=(a+b)/2;
return aver;
}
}
class B implements CompurerAverage {
public double average(double a,double b) {
double aver=0;
aver=Math.sqrt(a*b);
return aver;
}
}
public class Example {
public static void main(String args[]) {
CompurerAverage computer;
double a=11.23,b=22.78;
computer = new A();
double result = computer.average(a,b);
System.out.printf("%5.2f和%5.2f的算術平均值:%5.2f\n",a,b,result);
computer = new B();
result= computer.average(a,b);
System.out.printf("%5.2f和%5.2f的幾何平均值:%5.2f",a,b,result);
}
}

6 介面變數做引數
如果一個方法的引數是介面型別,我們就可以將任何實作該介面的類的實體的參考傳遞給該介面引數,那么介面引數就可以回呼類實作的介面方法,
例子:介面引數
interface SpeakHello {
void speakHello();
}
class Chinese implements SpeakHello {
public void speakHello() {
System.out.println("中國人習慣問候語:你好,吃飯了嗎? ");
}
}
class English implements SpeakHello {
public void speakHello() {
System.out.println("英國人習慣問候語:你好,天氣不錯 ");
}
}
class KindHello {
public void lookHello(SpeakHello hello) { //介面型別引數
hello.speakHello(); //介面回呼
}
}
public class Example {
public static void main(String args[]) {
KindHello kindHello=new KindHello();
kindHello.lookHello(new Chinese());
kindHello.lookHello(new English());
}
}

7 abstract類與介面的比較
1. abstract類 和介面都可以有abstract方法,
2.介面中只可以有常量,不能有變數;而abstract類中即可以有常量也可以有變數,
3. abstract類 中也可以有非abstract方法,介面不可以,(Java1.8之后不成立)
8 面向介面編程
面向介面去設計程式,可以通過在介面中宣告若干個abstract方法,表明這些方法的重要性,方法體的內容細節由實作介面的類去完成,使用介面進行程式設計的核心思想是使用介面回呼,即介面變數存放實作該介面的類的物件的參考,從而介面變數就可以回呼類實作的介面方法,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/272230.html
標籤:java
上一篇:java基本資料型別與運算子
下一篇:Java基礎語法(三)——運算子
