詳解java介面interface
引言
介面這個詞在生活中我們並不陌生。
在中國大陸,我們可以將自己的家用電器的插頭插到符合它插口的插座上;
我們在戴爾,惠普,聯想,蘋果等品牌電腦之間傳輸數據時,可以使用U盤進行傳輸。
插座的普適性是因為大部分都是國標的;U盤可以插到這些電腦上,是因為都遵循了USB2.0或者USB3.0的標準。
在遵循相同標準的前提下,就出現了介面。
介面的定義
由引言可知,介面就是多個類之間的公共規範。
我們知道,普通類的定義是這樣的
public class 類名{
}
介面的定義把class換成interface便可以了,如下所示:
public interface 介面名{
}
介面中定義抽象方法
介面中抽象方法的定義如下:
public abstract 方法返回類型 方法名();
其中public和abstract是可以省略的。從而,可以簡寫為如下形式:
方法返回類型 方法名();
介面的抽象方法的使用
介面是不能new對象實例的。那我們怎麼調用介面的抽象方法呢?
我們需要新定義一個類來實現這個介面,然後覆蓋重寫介面中所有的抽象方法。其中實現介面的類定義方式如下:
public class 類名 implements 需要實現的介面名{
//重寫所有抽象方法
}
比如,可以定義一個介面和一個實現類,然後再定義一個類,來調用方法。
package com.sjdwz;
/**
* @Description 介面示例程式碼
* @Date 2022/3/17
* @Created by 隨機的未知 sjdwz.com
*/
public interface MyInterfaceStudy1 {
public abstract void test01();
}
package com.sjdwz;
/**
* @Description MyInterfaceStudy1介面的實現
* @Date 2022/3/17
* @Created by 隨機的未知 sjdwz.com
*/
public class MyInterfaceStudy1Impl implements MyInterfaceStudy1{
@Override
public void test01() {
System.out.println("實現了介面MyInterfaceStudy1的test01方法");
}
}
package com.sjdwz;
/**
* @Description 介面抽象方法使用測試
* @Date 2022/3/17
* @Created by 隨機的未知 sjdwz.com
*/
public class MyInterfaceStudyTest1 {
public static void main(String[] args) {
MyInterfaceStudy1Impl myInterfaceStudy1 = new MyInterfaceStudy1Impl();
myInterfaceStudy1.test01();
}
}
注意:如果沒有覆蓋重寫所有的抽象方法,那麼本實現類需要是一個抽象類。
介面中定義默認方法
假設某場景下,我們的介面需要進行升級,必須添加某些方法來滿足新的需要,如果我們再定義抽象方法的話,那麼我們之前實現該介面的所有非抽象類都需要重新進行修改。
那麼有沒有一種辦法,能夠讓我們不改動介面實現類的程式碼就能完成介面的升級呢?
在Java8中對此給出了答案。
我們可以在介面中定義默認方法。
定義方式如下:
public default 方法返回類型 方法名(){
//方法裡面需要執行的內容
}
public可以省略。
介面的默認方法的使用
我們在定義介面的實現類時,不需要對默認方法進行覆蓋重寫,就可以使用該方法。請看如下的例子:
介面類的定義
package com.sjdwz;
/**
* @Description 介面的默認方法
* @Date 2022/3/17
* @Created by 隨機的未知 sjdwz.com
*/
public interface MyInterfaceStudy2 {
default void defaultFucTest01(){
System.out.println("我在defaultFucTest01中,我是一個默認方法,我解決了介面升級的問題");
}
void testAbstarct();
}
兩個實現類的定義
package com.sjdwz;
/**
* @Description TODO
* @Date 2022/3/17
* @Created by 隨機的未知 sjdwz.com
*/
public class MyInterfaceStudy2Impl implements MyInterfaceStudy2{
@Override
public void testAbstarct() {
System.out.println("我在MyInterfaceStudy2Impl中,我重寫了MyInterfaceStudy2中的抽象方法");
}
}
package com.sjdwz;
/**
* @Description TODO
* @Date 2022/3/17
* @Created by 隨機的未知 sjdwz.com
*/
public class MyInterfaceStudy2DefaultImpl implements MyInterfaceStudy2{
@Override
public void defaultFucTest01() {
System.out.println("我在MyInterfaceStudy2DefaultImpl中,我重寫了MyInterfaceStudy2的默認方法");
}
@Override
public void testAbstarct() {
System.out.println("我在MyInterfaceStudy2DefaultImpl中,我重寫了MyInterfaceStudy2的默認方法");
}
}
它們的使用:
package com.sjdwz;
/**
* @Description TODO
* @Date 2022/3/17
* @Created by 隨機的未知 sjdwz.com
*/
public class MyInterfaceStudyTest2 {
public static void main(String[] args) {
MyInterfaceStudy2Impl myInterfaceStudy2 = new MyInterfaceStudy2Impl();
myInterfaceStudy2.defaultFucTest01();
myInterfaceStudy2.testAbstarct();
MyInterfaceStudy2DefaultImpl myInterfaceStudy2Default = new MyInterfaceStudy2DefaultImpl();
myInterfaceStudy2Default.defaultFucTest01();
myInterfaceStudy2Default.testAbstarct();
}
}
輸出如下:
由此可見,介面實現類如果沒有重寫介面中的默認方法,會去調用介面中的默認方法;如果實現類重寫了介面的默認方法,便會調用重寫的方法。
介面中定義靜態方法
定義方式如下
public static 方法返回類型 方法名(){
//方法裡面需要執行的內容
}
public可以省略
介面的靜態方法的使用
定義介面如下:
package com.sjdwz;
/**
* @Description 介面中的靜態方法
* @Date 2022/3/17
* @Created by 隨機的未知 sjdwz.com
*/
public interface MyInterfaceStudy3 {
static void staticFuc(){
System.out.println("我在MyInterfaceStudy3介面中,這是我的靜態方法");
}
}
該介面的實現類如下
package com.sjdwz;
/**
* @Description 實現類
* @Date 2022/3/17
* @Created by 隨機的未知 sjdwz.com
*/
public class MyInterfaceStudy3Impl implements MyInterfaceStudy3{
}
如果我使用方式如下可以嗎?
強大的Java編輯器已經幫我們提示錯誤了。這樣使用是不可以的。
正確使用方式時介面名.靜態方法名(參數);。
package com.sjdwz;
/**
* @Description 介面靜態方法的使用測試
* @Date 2022/3/17
* @Created by 隨機的未知 sjdwz.com
*/
public class MyInterfaceStudyTest3 {
public static void main(String[] args) {
MyInterfaceStudy3.staticFuc();
}
}
輸出如下
介面中定義常量
定義方式如下
public static final 數據類型 常量名 = 666;
其中public static final可以省略。
一般常量名的每個字母都大寫,如果時多個單詞,使用下劃線連接。
如下所示:
int NUM = 666;
int DAILY_HOURS = 24;
介面中常量的使用
定義介面如下:
package com.sjdwz;
/**
* @Description 介面中定義常量
* @Date 2022/3/17
* @Created by 隨機的未知 sjdwz.com
*/
public interface MyInterfaceStudy4 {
int NUM = 666;
int DAILY_HOURS = 24;
}
實現類如下
package com.sjdwz;
/**
* @Description 實現類
* @Date 2022/3/17
* @Created by 隨機的未知 sjdwz.com
*/
public class MyInterfaceStudy4Impl {
}
我們可以使用如下嗎?
很明顯,又提示錯誤了。不能使用實現類.常量和實現類的對象.常量來使用。
正確使用如下:
package com.sjdwz;
/**
* @Description 介面的常量使用測試
* @Date 2022/3/17
* @Created by 隨機的未知 sjdwz.com
*/
public class MyInterfaceStudyTest4 {
public static void main(String[] args) {
System.out.println("用介面來訪問介面中的常量NUM:======"+MyInterfaceStudy4.NUM);
System.out.println("用介面來方法介面中的常量DAILY_HOURS:======"+MyInterfaceStudy4.DAILY_HOURS);
}
}
輸出如下:
原文鏈接為://sjdwz.com/11171.html