程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 深刻解析Java接口(interface)的應用

深刻解析Java接口(interface)的應用

編輯:關於JAVA

深刻解析Java接口(interface)的應用。本站提示廣大學習愛好者:(深刻解析Java接口(interface)的應用)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻解析Java接口(interface)的應用正文


Java接口(interface)的概念及應用
在籠統類中,可以包括一個或多個籠統辦法;但在接口(interface)中,一切的辦法必需都是籠統的,不克不及無方法體,它比籠統類加倍“籠統”。

接口應用 interface 症結字來聲明,可以看作是一種特別的籠統類,可以指定一個類必需做甚麼,而不是劃定它若何去做。

實際中也有許多接口的實例,好比說串口電腦硬盤,Serial ATA委員會指定了Serial ATA 2.0標准,這類標准就是接口。Serial ATA委員會不擔任臨盆硬盤,只是指定通用的標准。

希捷、日立、三星等臨盆廠家會依照標准臨盆相符接口的硬盤,這些硬盤便可以完成通用化,假如正在用一塊160G日立的串口硬盤,如今要進級了,可以購置一塊320G的希捷串口硬盤,裝置上去便可以持續應用了。

上面的代碼可以模仿Serial ATA委員會界說以下串口硬盤接口:

//串行硬盤接口
public interface SataHdd{
 //銜接線的數目
 public static final int CONNECT_LINE=4;
 //寫數據
 public void writeData(String data);
 //讀數據
 public String readData();
}

留意:接口中聲明的成員變量默許都是 public static final 的,必需顯示的初始化。因此在常量聲明時可以省略這些潤飾符。

接口是若干常量和籠統辦法的聚集,今朝看來和籠統類差不多。確切如斯,接口本就是從籠統類中演變而來的,因此除特殊劃定,接口享有和類異樣的“待遇”。好比,源法式中可以界說多個類或接口,但最多只能有一個public 的類或接口,假如有則源文件必需取和public的類和接口雷同的名字。和類的繼續格局一樣,接口之間也能夠繼續,子接口可以繼續父接口中的常量和籠統辦法並添加新的籠統辦法等。

但接口有其本身的一些特征,歸結以下。

1) 接口中只能界說籠統辦法,這些辦法默許為 public abstract 的,因此在聲明辦法時可以省略這些潤飾符。試圖在接口中界說實例變量、非籠統的實例辦法及靜態辦法,都長短法的。例如:

public interface SataHdd{
 //銜接線的數目
 public int connectLine; //編譯失足,connectLine被看作靜態常量,必需顯式初始化
 //寫數據
 protected void writeData(String data); //編譯失足,必需是public類型
 //讀數據
 public static String readData(){ //編譯失足,接口中不克不及包括靜態辦法
  return "數據"; //編譯失足,接口中只能包括籠統辦法,
 }
}

3) 接口中沒有結構辦法,不克不及被實例化。

4) 一個接口不完成另外一個接口,但可以繼續多個其他接口。接口的多繼續特色填補了類的單繼續。例如:

//串行硬盤接口
public interface SataHdd extends A,B{
 // 銜接線的數目
 public static final int CONNECT_LINE = 4;
 // 寫數據
 public void writeData(String data);
 // 讀數據
 public String readData();
}
interface A{
 public void a();
}
interface B{
 public void b();
}

為何應用接口

年夜型項目開辟中,能夠須要從繼續鏈的中央拔出一個類,讓它的子類具有某些功效而不影響它們的父類。例如 A -> B -> C -> D -> E,A 是先人類,假如須要為C、D、E類添加某些通用的功效,最簡略的辦法是讓C類再繼續別的一個類。然則成績來了,Java 是一種單繼續的說話,不克不及再讓C繼續別的一個父類了,只到挪動到繼續鏈的最頂端,讓A再繼續一個父類。如許一來,對C、D、E類的修正,影響到了全部繼續鏈,不具有可拔出性的設計。

接口是可拔出性的包管。在一個繼續鏈中的任何一個類都可以完成一個接口,這個接口會影響到此類的一切子類,但不會影響到此類的任何父類。此類將不能不完成這個接口所劃定的辦法,而子類可以從此類主動繼續這些辦法,這時候候,這些子類具有了可拔出性。

我們關懷的不是哪個詳細的類,而是這個類能否完成了我們須要的接口。

接口供給了聯系關系和辦法挪用上的可拔出性,軟件體系的范圍越年夜,性命周期越長,接口使得軟件體系的靈巧性和可擴大性,可拔出性方面獲得包管。

接口在面向對象的 Java 法式設計中占領無足輕重的位置。現實上在設計階段最主要的義務之一就是設計出各部門的接口,然後經由過程接口的組合,構成法式的根本框架構造。
接口的應用

接口的應用與類的應用有些分歧。在須要應用類的處所,會直接應用new症結字來構建一個類的實例,但接口弗成以如許應用,由於接口不克不及直接應用 new 症結字來構建實例。

接口必需經由過程類來完成(implements)它的籠統辦法,然後再實例化類。類完成接口的症結字為implements。

假如一個類不克不及完成該接口的一切籠統辦法,那末這個類必需被界說為籠統辦法。

不許可創立接口的實例,但許可界說接口類型的援用變量,該變量指向了完成接口的類的實例。

一個類只能繼續一個父類,但卻可以完成多個接口。

完成接口的格局以下:
潤飾符 class 類名 extends 父類 implements 多個接口 {
    完成辦法
}

請看上面的例子:

import static java.lang.System.*;
public class Demo{
 public static void main(String[] args) {
  SataHdd sh1=new SeagateHdd(); //初始化希捷硬盤
  SataHdd sh2=new SamsungHdd(); //初始化三星硬盤
 }
}
//串行硬盤接口
interface SataHdd{
 //銜接線的數目
 public static final int CONNECT_LINE=4;
 //寫數據
 public void writeData(String data);
 //讀數據
 public String readData();
}
// 維修硬盤接口
interface fixHdd{
 // 維修地址
 String address = "北京市海澱區";
 // 開端維修
 boolean doFix();
}
//希捷硬盤
class SeagateHdd implements SataHdd, fixHdd{
 //希捷硬盤讀取數據
 public String readData(){
  return "數據";
 }
 //希捷硬盤寫入數據
 public void writeData(String data) {
  out.println("寫入勝利");
 }
 // 維修希捷硬盤
 public boolean doFix(){
  return true;
 }
}
//三星硬盤
class SamsungHdd implements SataHdd{
 //三星硬盤讀取數據
 public String readData(){
  return "數據";
 }
 //三星硬盤寫入數據
 public void writeData(String data){
  out.println("寫入勝利");
 }
}
//某劣質硬盤,不克不及寫數據
abstract class XXHdd implements SataHdd{
 //硬盤讀取數據
 public String readData() {
  return "數據";
 }
}

接口作為類型應用

接口作為援用類型來應用,任何完成該接口的類的實例都可以存儲在該接口類型的變量中,經由過程這些變量可以拜訪類中所完成的接口中的辦法,Java 運轉時體系會靜態地肯定應當應用哪一個類中的辦法,現實上是挪用響應的完成類的辦法。

示例以下:

public class Demo{
 public void test1(A a) {
  a.doSth();
 }
 public static void main(String[] args) {
  Demo d = new Demo();
  A a = new B();
  d.test1(a);
 }
}
interface A {
 public int doSth();
}
class B implements A {
 public int doSth() {
  System.out.println("now in B");
  return 123;
 }
}

運轉成果:

now in B

年夜家看到接口可以作為一個類型來應用,把接口作為辦法的參數和前往類型。


Java接口和籠統類的差別
類是對象的模板,籠統類和接口可以看作是詳細的類的模板。

因為從某種角度講,接口是一種特別的籠統類,它們的淵源頗深,有很年夜的類似的地方,所以在選擇應用誰的成績上很輕易含混。我們起首剖析它們具有的雷同點。
都代表類樹形構造的籠統層。在應用援用變量時,盡可能應用類構造的籠統層,使辦法的界說和完成分別,如許做關於代碼有松懈耦合的利益。
都不克不及被實例化。
都能包括籠統辦法。籠統辦法用來描寫體系供給哪些功效,而不用關懷詳細的完成。

上面說一下籠統類和接口的重要差別。

1) 籠統類可認為部門辦法供給完成,防止了在子類中反復完成這些辦法,進步了代碼的可重用性,這是籠統類的優勢;而接口中只能包括籠統辦法,不克不及包括任何完成。

public abstract class A{
 public abstract void method1();
 public void method2(){
  //A method2
 }
}
public class B extends A{
 public void method1(){
  //B method1
 }
}
public class C extends A{
 public void method1(){
  //C method1
 }
}

籠統類A有兩個子類B、C,因為A中無方法method2的完成,子類B、C中不須要重寫method2辦法,我們就說A為子類供給了公共的功效,或A束縛了子類的行動。method2就是代碼可重用的例子。A 並沒有界說 method1的完成,也就是說B、C 可以依據本身的特色完成method1辦法,這又表現了松懈耦合的特征。

再換成接口看看:

public interface A{
 public void method1();
 public void method2();
}
public class B implements A{
 public void method1(){
  //B method1
 }
 public void method2(){
  //B method2
 }
}
public class C implements A{
 public void method1(){
  //C method1
 }
 public void method2(){
  //C method2
 }
}

接口A沒法為完成類B、C供給公共的功效,也就是說A沒法束縛B、C的行動。B、C可以自在地施展本身的特色實際 method1和 method2辦法,接口A毫無掌控才能。

2) 一個類只能繼續一個直接的父類(能夠是籠統類),但一個類可以完成多個接口,這個就是接口的優勢。

interface A{
 public void method2();
}
interface B{
 public void method1();
}
class C implements A,B{
 public void method1(){
  //C method1
 }
 public void method2(){
  //C method2
 }
}
//可以如斯靈巧的應用C,而且C還無機會停止擴大,完成其他接口
A a=new C();
B b=new C();
abstract class A{
 public abstract void method1();
}
abstract class B extends A{
 public abstract void method2();
}
class C extends B{
 public void method1(){
  //C method1
 }
 public void method2() {
  //C method2
 }
}

關於C類,將沒無機會繼續其他父類了。

綜上所述,接口和籠統類各有優缺陷,在接口和籠統類的選擇上,必需遵照如許一個准繩:
行動模子應當老是經由過程接口而不是籠統類界說,所以平日是優先選用接口,盡可能罕用籠統類。
選擇籠統類的時刻平日是以下情形:須要界說子類的行動,又要為子類供給通用的功效。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved