引言
接口這個詞在生活中我們并不陌生。
在中國大陸,我們可以將自己的家用電器的插頭插到符合它插口的插座上;
我們在戴爾,惠普,聯(lián)想,蘋果等品牌電腦之間傳輸數(shù)據(jù)時,可以使用U盤進行傳輸。
插座的普適性是因為大部分都是國標的;U盤可以插到這些電腦上,是因為都遵循了USB2.0或者USB3.0的標準。
在遵循相同標準的前提下,就出現(xiàn)了接口。
接口的定義
由引言可知,接口就是多個類之間的公共規(guī)范。
我們知道,普通類的定義是這樣的
public class 類名{
}
接口的定義把class換成interface便可以了,如下所示:
public interface 接口名{
}
接口中定義抽象方法
接口中抽象方法的定義如下:
public abstract 方法返回類型 方法名();
其中public和abstract是可以省略的。從而,可以簡寫為如下形式:
方法返回類型 方法名();
接口的抽象方法的使用
接口是不能new對象實例的。那我們怎么調(diào)用接口的抽象方法呢?
我們需要新定義一個類來實現(xiàn)這個接口,然后覆蓋重寫接口中所有的抽象方法。其中實現(xiàn)接口的類定義方式如下:
public class 類名 implements 需要實現(xiàn)的接口名{
//重寫所有抽象方法
}
比如,可以定義一個接口和一個實現(xiàn)類,然后再定義一個類,來調(diào)用方法。
package com.sjdwz;
/**
* @Description 接口示例代碼
* @Date 2022/3/17
* @Created by 隨機的未知 sjdwz.com
*/
public interface MyInterfaceStudy1 {
public abstract void test01();
}
package com.sjdwz;
/**
* @Description MyInterfaceStudy1接口的實現(xiàn)
* @Date 2022/3/17
* @Created by 隨機的未知 sjdwz.com
*/
public class MyInterfaceStudy1Impl implements MyInterfaceStudy1{
@Override
public void test01() {
System.out.println("實現(xiàn)了接口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();
}
}
注意:如果沒有覆蓋重寫所有的抽象方法,那么本實現(xiàn)類需要是一個抽象類。
接口中定義默認方法
假設某場景下,我們的接口需要進行升級,必須添加某些方法來滿足新的需要,如果我們再定義抽象方法的話,那么我們之前實現(xiàn)該接口的所有非抽象類都需要重新進行修改。
那么有沒有一種辦法,能夠讓我們不改動接口實現(xiàn)類的代碼就能完成接口的升級呢?
在Java8中對此給出了答案。
我們可以在接口中定義默認方法。
定義方式如下:
public default 方法返回類型 方法名(){
//方法里面需要執(zhí)行的內(nèi)容
}
public可以省略。
接口的默認方法的使用
我們在定義接口的實現(xiàn)類時,不需要對默認方法進行覆蓋重寫,就可以使用該方法。請看如下的例子:
接口類的定義
package com.sjdwz;
/**
* @Description 接口的默認方法
* @Date 2022/3/17
* @Created by 隨機的未知 sjdwz.com
*/
public interface MyInterfaceStudy2 {
default void defaultFucTest01(){
System.out.println("我在defaultFucTest01中,我是一個默認方法,我解決了接口升級的問題");
}
void testAbstarct();
}
兩個實現(xiàn)類的定義
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();
}
}
輸出如下:

由此可見,接口實現(xiàn)類如果沒有重寫接口中的默認方法,會去調(diào)用接口中的默認方法;如果實現(xiàn)類重寫了接口的默認方法,便會調(diào)用重寫的方法。
接口中定義靜態(tài)方法
定義方式如下
public static 方法返回類型 方法名(){
//方法里面需要執(zhí)行的內(nèi)容
}
public可以省略
接口的靜態(tài)方法的使用
定義接口如下:
package com.sjdwz;
/**
* @Description 接口中的靜態(tài)方法
* @Date 2022/3/17
* @Created by 隨機的未知 sjdwz.com
*/
public interface MyInterfaceStudy3 {
static void staticFuc(){
System.out.println("我在MyInterfaceStudy3接口中,這是我的靜態(tài)方法");
}
}
該接口的實現(xiàn)類如下
package com.sjdwz;
/**
* @Description 實現(xiàn)類
* @Date 2022/3/17
* @Created by 隨機的未知 sjdwz.com
*/
public class MyInterfaceStudy3Impl implements MyInterfaceStudy3{
}
如果我使用方式如下可以嗎?

強大的Java編輯器已經(jīng)幫我們提示錯誤了。這樣使用是不可以的。
正確使用方式時接口名.靜態(tài)方法名(參數(shù));。
package com.sjdwz;
/**
* @Description 接口靜態(tài)方法的使用測試
* @Date 2022/3/17
* @Created by 隨機的未知 sjdwz.com
*/
public class MyInterfaceStudyTest3 {
public static void main(String[] args) {
MyInterfaceStudy3.staticFuc();
}
}
輸出如下

接口中定義常量
定義方式如下
public static final 數(shù)據(jù)類型 常量名 = 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;
}
實現(xiàn)類如下
package com.sjdwz;
/**
* @Description 實現(xiàn)類
* @Date 2022/3/17
* @Created by 隨機的未知 sjdwz.com
*/
public class MyInterfaceStudy4Impl {
}
我們可以使用如下嗎?

很明顯,又提示錯誤了。不能使用實現(xiàn)類.常量和實現(xiàn)類的對象.常量來使用。
正確使用如下:
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);
}
}
輸出如下:
