引言
接口這個詞在生活中我們并不陌生蒋搜。
在中國大陸篡撵,我們可以將自己的家用電器的插頭插到符合它插口的插座上判莉;
我們在戴爾,惠普育谬,聯(lián)想券盅,蘋果等品牌電腦之間傳輸數(shù)據(jù)時,可以使用U盤進(jìn)行傳輸膛檀。
插座的普適性是因為大部分都是國標(biāo)的锰镀;U盤可以插到這些電腦上,是因為都遵循了USB2.0或者USB3.0的標(biāo)準(zhǔn)咖刃。
在遵循相同標(biāo)準(zhǔn)的前提下互站,就出現(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)類需要是一個抽象類轻纪。
接口中定義默認(rèn)方法
假設(shè)某場景下,我們的接口需要進(jìn)行升級叠纷,必須添加某些方法來滿足新的需要刻帚,如果我們再定義抽象方法的話,那么我們之前實現(xiàn)該接口的所有非抽象類都需要重新進(jìn)行修改涩嚣。
那么有沒有一種辦法崇众,能夠讓我們不改動接口實現(xiàn)類的代碼就能完成接口的升級呢?
在Java8中對此給出了答案航厚。
我們可以在接口中定義默認(rèn)方法顷歌。
定義方式如下:
public default 方法返回類型 方法名(){
//方法里面需要執(zhí)行的內(nèi)容
}
public可以省略。
接口的默認(rèn)方法的使用
我們在定義接口的實現(xiàn)類時幔睬,不需要對默認(rèn)方法進(jìn)行覆蓋重寫眯漩,就可以使用該方法。請看如下的例子:
接口類的定義
package com.sjdwz;
/**
* @Description 接口的默認(rèn)方法
* @Date 2022/3/17
* @Created by 隨機的未知 sjdwz.com
*/
public interface MyInterfaceStudy2 {
default void defaultFucTest01(){
System.out.println("我在defaultFucTest01中溪窒,我是一個默認(rèn)方法坤塞,我解決了接口升級的問題");
}
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的默認(rèn)方法");
}
@Override
public void testAbstarct() {
System.out.println("我在MyInterfaceStudy2DefaultImpl中摹芙,我重寫了MyInterfaceStudy2的默認(rèn)方法");
}
}
它們的使用:
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)類如果沒有重寫接口中的默認(rèn)方法,會去調(diào)用接口中的默認(rèn)方法浮禾;如果實現(xiàn)類重寫了接口的默認(rè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);
}
}
輸出如下: