Java中接口的深入詳解
一、前言
前面我們說瞭抽象類的概述,我們對抽象類也有個認識和理解瞭,現在我們學習十分重要的內容接口,接口這個詞比較的抽象,但其實也是十分好理解的。
二、接口
簡單的說,接口就是一種被規范的標準,隻要符合這個標準都可以通用,接口的表現在於對行為的抽象。 就好比插座,每個廠商生產的插座我們都可以用,這是因為他們有同一個標準,這裡插座就是接口。
接口的格式
格式1:
public interface 接口名
格式2:
interface 接口名
三、接口的特點
①多態的實例化用implement關鍵字
public interface usb{}//定義一個接口 public class computer implements usb{}//創建一個類實現接口
②接口不能被直接實例化,可以通過多態的形式實現實例化
usb u =new computer();
③接口中都是抽象方法和常量,不可能有非抽象方法,常量必須被賦值。
常量默認被public static final
方法默認被public static abstractl修飾
public final int num1=10;√ num1=20;× int num2=10;√ num2=20;× 上面兩個正確的寫法等價 public abstract void method1();√ void method2();√
直接int num=10,創建的a是常量
④多態的前提:
有繼承或實現關系
有方法的重寫,
有父類或父接口引用指向子類或實現類對象
⑤接口的實現類
必須重寫接口中的所有方法,不想重寫則可以是抽象類(加上abstract)
但是子類繼承瞭該抽象類必須重寫接口中的方法。
⑥接口隻能被public修飾
接口的使用
service包下
package service; public interface EatService { void eat(); }
service包下的impl包下
package service.impl; import service.EatService; public class CatImpl implements EatService { @Override public void eat() { System.out.println("🐱吃🐟"); } }
在controller包下
package controller; import service.EatService; import service.impl.CatImpl; public class CatController { public static void main(String[] args) { EatService e=new CatImpl(); e.eat(); } }
四、類與接口的關系
類和類之間是繼承關系
接口和接口之間是繼承關系
類和接口之間是實現關系(類實現接口)
類隻支持單繼承(即一個子類隻有一個父類),可以實現多個類
public class A extends B implements C,B,D....{}
接口之間可以多重繼承。
public interface a implements b,c,d.....{}
接口多重繼承的好處
定義瞭許多接口,如果一個設備要同時實現那麼多接口將是不小的開銷,對於同能
同類的可以把他用一個接口繼承起來,這樣這個接口就要瞭那些接口的全部功能,我們
使用類隻要實現一個就可以瞭。
接口1
package service; public interface EatService { void eat(); }
接口2
package service; public interface PlayService { void play(); }
接口3
package service; public interface SleepService { void sleep(); }
總接口:用來繼承上面三個接口
package service; public interface SumService extends SleepService,EatService,PlayService { }
此時原來的類實現隻要實現一個總接口即可
舊:
public class CatImpl implements EatService,PlayService,SleepService { //方法重寫 }
新:
public class CatImpl implements SumService { //方法重寫 }
在controller中調用也是簡單不少
package controller; import service.SumService; import service.impl.CatImpl; public class CatController { public static void main(String[] args) { SumService ss=new CatImpl(); ss.eat(); ss.play(); ss.sleep(); } }
練習
定義一個接口用來實現兩個對象的比較。
package cn.com.Classwork190124; public interface CompareObject<object> { public int compareto(object o); //若返回值是 0 , 代表相等; 若為正數,代表當前對象大;負數代表當前對象小 }
定義一個Circle類。
package cn.com.Classwork190124; public class Circle { private double radius; private final double PI=3.14; public double findArea(){ return PI*radius*radius; } public double getRadius() { return radius; } public void setRadius(double radius) { this.radius = radius; } }
定義一個ComparableCircle類,繼承Circle類並且實現CompareObject接口。在ComparableCircle類中給出接口中方法compareTo的實現體,用來比較兩個圓的半徑大小。
package cn.com.Classwork190124; public class ComparableCircle extends Circle implements CompareObject<Circle> { @Override public int compareto(Circle o) { if(this.getRadius()==o.getRadius()){ return 0; }else if(this.getRadius()<=o.getRadius()){ return -1; }else { return 1; } } }
定義一個測試類TestInterface,創建兩個ComaparableCircle對象,調用compareTo方法比較兩個類的半徑大小。
package cn.com.Classwork190124; import java.util.Scanner; public class TestInterface { public static void main(String[] args) { Scanner sc = new Scanner(System.in); ComparableCircle c1 = new ComparableCircle(); ComparableCircle c2 = new ComparableCircle(); c1.setRadius(sc.nextDouble()); c2.setRadius(sc.nextDouble()); System.out.println(c1.compareto(c2)); } }
思考:參照上述做法定義矩形類Rectangle和ComparableRectangle類,在ComparableRectangle類中給出compareTo方法的實現,比較兩個矩形的面積大小。
總結
到此這篇關於Java中接口的文章就介紹到這瞭,更多相關Java接口詳解內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!