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!

推薦閱讀: