Java介面 詳解(一)
一、基本概念
介面(Interface),在JAVA程式語言中是一個抽象型別,是抽象方法的集合。介面通常以interface來宣告。一個類通過繼承介面的方式,從而來繼承介面的抽象方法。
如果一個類只由抽象方法和全域性常量組成,那麼這種情況下不會將其定義為一個抽象類。只會定義為一個介面,所以介面嚴格的來講屬於一個特殊的類,而這個類裡面只有抽象方法和全域性常量,就連構造方法也沒有。
範例:定義一個介面
interface A{//定義一個介面
public static final String MSG = "hello";//全域性常量
public abstract void print();//抽象方法
}
二、介面的使用
1、由於接口裡面存在抽象方法,所以介面物件不能直接使用關鍵字new進行例項化。介面的使用原則如下:
(1)介面必須要有子類,但此時一個子類可以使用implements關鍵字實現多個介面;
(2)介面的子類(如果不是抽象類),那麼必須要覆寫介面中的全部抽象方法;
(3)介面的物件可以利用子類物件的向上轉型進行例項化。
範例:
package com.wz.interfacedemo;
interface A{//定義一個介面A
public static final String MSG = "hello";//全域性常量
public abstract void print();//抽象方法
}
interface B{//定義一個介面B
public abstract void get();
}
class X implements A,B{//X類實現了A和B兩個介面
@Override
public void print() {
System.out.println("介面A的抽象方法print()");
}
@Override
public void get() {
System.out.println("介面B的抽象方法get()");
}
}
public class TestDemo {
public static void main(String[] args){
X x = new X();//例項化子類物件
A a = x;//向上轉型
B b = x;//向上轉型
a.print();
b.get();
}
}
執行結果:
介面A的抽象方法print()
介面B的抽象方法get()
以上的程式碼例項化了X類的物件,由於X類是A和B的子類,那麼X類的物件可以變為A介面或者B介面物件。我們把測試主類程式碼改一下:
public class TestDemo {
public static void main(String[] args){
A a = new X();
B b = (B) a;
b.get();
}
}
執行結果:
介面B的抽象方法get()
好,沒任何問題,我們再來做個驗證:
public class TestDemo {
public static void main(String[] args){
A a = new X();
B b = (B) a;
b.get();
System.out.println(a instanceof A);
System.out.println(a instanceof B);
}
執行結果:
介面B的抽象方法get()
true
true
我們發現,從定義結構來講,A和B兩個介面沒有任何直接聯絡,但這兩個介面卻擁有同一個子類。我們不要被型別和名稱所迷惑,因為例項化的是X子類,而這個類物件屬於B類的物件,所以以上程式碼可行,只不過從程式碼的編寫規範來講,並不是很好。
2、對於子類而言,除了實現介面外,還可以繼承抽象類。若既要繼承抽象類,同時還要實現介面的話,使用一下語法格式:
class 子類 [extends 父類] [implemetns 介面1,介面2,...] {}
範例:
interface A{//定義一個介面A
public static final String MSG = "hello";//全域性常量
public abstract void print();//抽象方法
}
interface B{//定義一個介面B
public abstract void get();
}
abstract class C{//定義一個抽象類C
public abstract void change();
}
class X extends C implements A,B{//X類繼承C類,並實現了A和B兩個介面
@Override
public void print() {
System.out.println("介面A的抽象方法print()");
}
@Override
public void get() {
System.out.println("介面B的抽象方法get()");
}
@Override
public void change() {
System.out.println("抽象類C的抽象方法change()");
}
}
對於介面,裡面的組成只有抽象方法和全域性常量,所以很多時候為了書寫簡單,可以不用寫public abstract 或者public static final。並且,介面中的訪問許可權只有一種:public,即:定義介面方法和全域性常量的時候就算沒有寫上public,那麼最終的訪問許可權也是public,注意不是default。以下兩種寫法是完全等價的:
interface A{
public static final String MSG = "hello";
public abstract void print();
}
等價於
interface A{
String MSG = "hello";
void print();
}
但是,這樣會不會帶來什麼問題呢?如果子類子類中的覆寫方法也不是public,我們來看:
package com.wz.interfacedemo;
interface A{
String MSG = "hello";
void print();
}
class X implements A{
void print() {
System.out.println("介面A的抽象方法print()");
}
}
public class TestDemo {
public static void main(String[] args){
A a = new X();
a.print();
}
}
執行結果:
Exception in thread "main" java.lang.IllegalAccessError: com.wz.interfacedemo.X.print()V
at com.wz.interfacedemo.TestDemo.main(TestDemo.java:22)
這是因為介面中預設是public修飾,若子類中沒用public修飾,則訪問許可權變嚴格了,給子類分配的是更低的訪問許可權。所以,在定義介面的時候強烈建議在抽象方法前加上public ,子類也加上:
interface A{
String MSG = "hello";
public void print();
}
class X implements A{
public void print() {
System.out.println("介面A的抽象方法print()");
}
}
3、在Java中,一個抽象類只能繼承一個抽象類,但一個介面卻可以使用extends關鍵字同時繼承多個介面(但介面不能繼承抽象類)。
範例:
interface A{
public void funA();
}
interface B{
public void funB();
}
//C介面同時繼承了A和B兩個介面
interface C extends A,B{//使用的是extends
public void funC();
}
class X implements C{
@Override
public void funA() {
}
@Override
public void funB() {
}
@Override
public void funC() {
}
}
由此可見,從繼承關係來說介面的限制比抽象類少:
(1)一個抽象類只能繼承一個抽象父類,而介面可以繼承多個介面;
(2)一個子類只能繼承一個抽象類,卻可以實現多個介面(在Java中,介面的主要功能是解決單繼承侷限問題)
4、從介面的概念上來講,介面只能由抽象方法和全域性常量組成,但是內部結構是不受概念限制的,正如抽象類中可以定義抽象內部類一樣,在介面中也可以定義普通內部類、抽象內部類和內部介面(但從實際的開發來講,使用者自己去定義內部抽象類或內部介面的時候是比較少見的),範例如下,在介面中定義一個抽象內部類:
interface A{
public void funA();
abstract class B{//定義一個抽象內部類
public abstract void funB();
}
}
在介面中如果使用了static去定義一個內介面,它表示一個外部介面:
interface A{
public void funA();
static interface B{//使用了static,是一個外部介面
public void funB();
}
}
class X implements A.B{
@Override
public void funB() {
}
}
三、介面的實際應用(標準定義)
在日常的生活之中,介面這一名詞經常聽到的,例如:USB介面、列印介面、充電介面等等。
如果要進行開發,要先開發出USB介面標準,然後裝置廠商才可以設計出USB裝置。
現在假設每一個USB裝置只有兩個功能:安裝驅動程式、工作。
定義一個USB的標準:
interface USB { // 操作標準
public void install() ;
public void work() ;
}
在電腦上應用此介面:
class Computer {
public void plugin(USB usb) {
usb.install() ;
usb.work() ;
}
}
定義USB裝置—手機:
class Phone implements USB {
public void install() {
System.out.println("安裝手機驅動程式。") ;
}
public void work() {
System.out.println("手機與電腦進行工作。") ;
}
}
定義USB裝置—印表機:
class Print implements USB {
public void install() {
System.out.println("安裝印表機驅動程式。") ;
}
public void work() {
System.out.println("進行檔案列印。") ;
}
}
定義USB裝置—MP3:
class MP3 implements USB {
public void install() {
System.out.println("安裝MP3驅動程式。") ;
}
public void work() {
System.out.println("進行MP3拷貝。") ;
}
}
測試主類:
public class TestDemo {
public static void main(String args[]) {
Computer c = new Computer() ;
c.plugin(new Phone()) ;
c.plugin(new Print()) ;
c.plugin(new MP3());
}
}
執行結果:
安裝手機驅動程式。
手機與電腦進行工作。
安裝印表機驅動程式。
進行檔案列印。
安裝MP3驅動程式。
進行MP3拷貝。
可以看出,不管有多少個USB介面的子類,都可以在電腦上使用。
在現實生活中,標準的概念隨處可見,而在程式裡標準使用介面定義的。
未完待續。。。
相關推薦
Java介面 詳解(一)
一、基本概念 介面(Interface),在JAVA程式語言中是一個抽象型別,是抽象方法的集合。介面通常以interface來宣告。一個類通過繼承介面的方式,從而來繼承介面的抽象方法。 如果一個類只由抽象方法和全域性常量組成,那麼這種情況下不會將其定義為一個
Java學習筆記(31)--介面 詳解(一)
一、基本概念 介面(Interface),在JAVA程式語言中是一個抽象型別,是抽象方法的集合。介面通常以interface來宣告。一個類通過繼承介面的方式,從而來繼承介面的抽象方法。 如果一個類只由抽象方法和全域性常量組成,那麼這種情況下不會將其定義為一個抽象類。只會定義為一個介面,所以介面嚴格的來
Java NIO 詳解(一)
一、基本概念描述 1.1 I/O簡介 I/O即輸入輸出,是計算機與外界世界的一個藉口。IO操作的實際主題是作業系統。在java程式設計中,一般使用流的方式來處理IO,所有的IO都被視作是單個位元組的移動,通過stream物件一次移動一個位元組。流IO負責把物件轉換為位元組
[資料分享]迅為4412開發板介面詳解(一)
開發板平臺簡要介紹 核心板 Exynos4412有兩種封裝形式, 其中POP封裝的晶片內含1GB記憶體, 所以不需要外擴DDR, 可大大節省 PCB 面積,功耗控制方面也更好,多用於手持裝置當中; SCP 封裝優點是記憶體擴 展更靈活,生產工藝相對更容易控制。 電源晶片 S
Java資料結構詳解(一)-Collection介面
Java資料結構-collection介面 一,Collection介面結構圖 Collection介面詳解 collection是一個被高度抽象出來的介面、提供基本的操作資料的行為、屬性的定義. collection api介紹: p
Java的反射機制詳解(一)
pbc spa 詳解 uno face target lan tor cin 8n72q傅釁8戰sig叢http://www.docin.com/app/user/userinfo?userid=179185461 8u炊3F7LB椒1http://huiyi.docin.
PHP與Java集成開發詳解(一)
new 編程語言 到你 其中 web-inf request 測試 add 輸入 很久以前,有人從www上看到看到天空上一個很亮的亮點,它就是Java語言,與此同時,在另一個地方一位夢想家也看到了一個亮點,它就是PHP。 時間一天天過去,這兩個亮點也變得越來越亮,很快,它
Java程式設計師從笨鳥到菜鳥之(一百)sql注入攻擊詳解(一)sql注入原理詳解
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Java 反射機制詳解(一)
Java 反射機制詳解(一) 主要介紹以下幾方面內容 理解 Class 類 理解 Java 的類載入機制 學會使用 ClassLoader 進行類載入 理解反射的機制 掌握 Constructor、Method、Field 類的用法 理解並掌握動態代理&n
Java 進階——多執行緒優化之執行緒池 ThreadPoolExecutor的核心容器阻塞佇列詳解(一)
#引言 多執行緒我想無論是後端開發,還是對於App開發者來說都不會陌生,何況Android強制要求不能在主執行緒中做網路請求,於是乎,在很多初學者或者App的原始碼中會出現會多的new Thread…的方式,這樣的程式碼是不優雅而且存在很多的隱患,假如說在使用者
java集合框架詳解(一)
2,總體體系結構
淘寶JAVA中介軟體Diamond詳解(一)---簡介&快速使用
大家好,今天開始為大家帶來我們通用產品團隊的產品 —— diamond的專題,本次為大家介紹diamond的概況和快速使用。 一、概況 diamond是淘寶內部使用的一個管理持久配置的系統,它的特點是簡單、可靠、易用,目前淘寶內部絕大多數系統的配置,由diamond來進行統一管理。 diamond為
Java效能分析神器-JProfiler詳解(一)(轉)
前段時間在給公司專案做效能分析,從簡單的分析Log(GC log, postgrep log, hibernate statitistic),到通過AOP蒐集軟體執行資料,再到PET測試,感覺時間花了不少,效能也有一定的提升,但總感覺像是工作在原始時代,無法簡單順暢,又無比清
Java類和物件 詳解(一)
一、面向物件簡述 面向物件是一種現在最為流行的程式設計方法,幾乎現在的所有應用都以面向物件為主了,最早的面向物件的概念實際上是由IBM提出的,在70年代的Smaltalk語言之中進行了應用,後來根據面向物件的設計思路,才形成C++,而由C++產生了Java這門
Java代理模式實現與原理詳解(一)
關於Java中的代理,我們首先需要了解的是一種常用的設計模式——代理模式,而對於代理,可根據代理類建立的時間點,分為靜態代理和動態代理。今天我們先來了解一下Java中的靜態代理。 1 代理模式 代理模式是一種常用的設計模式,百度百科中對其定義為:為其他物件提供一個代理以控制對某個物件的訪問。
Java String類詳解(一)
String類是一個字串型別的類,使用“XXXX”定義的內容都是字串,雖然這個類在使用上有一些特殊,但是String本身是一個類。 一、String的例項化兩種方式 1、直接賦值例項化: String StringName= "xxx"; 以上是Stri
Java基礎集合詳解(一)
作為新手,對於集合來講,多少有點感悟 先介紹一下什麼是集合 這是我看的書《java從入門到精通》清華大學出版社 引用裡面的一句話,集合就是一個容器。 對於集合內的各個物件很容易將其存放到集合中,也很容易將其從集合中取出來,還可以按照一定的順序放入。 對集合
Java 異常的捕獲與處理詳解(一)
一、異常的產生 異常是程式之中導致程式中斷的一種指令流,異常一旦出現並且沒有進行合理處理的話,那麼程式就將中斷執行。 下面,通過兩個程式來進行異常產生問題的對比。 (1)不產生異常的程式: public class Test { public s
(八)Java日期工具類DateUtils詳解(一)
一、 對指定的日期新增年、月、周、日、小時、分鐘、秒、毫秒 public static Date addDays(Date date, int amount) Dat
Java虛擬機器詳解(一)------簡介
本系列部落格我們將以當前預設的主流虛擬機器HotSpot 為例,詳細介紹 Java虛擬機器。以 JDK1.7 為主,同時介紹與 JDK1.8 的不同之處,通過Oracle官網以及各種文獻進行整理,並加以驗證,力求保證這塊知識的正確性,完整性。 以下是本系列部落格參考的相關文件: ①、JDK1.