一、背景 一方面,有時必須從幾個類中派生出一個子類,繼承它們所有的屬性和方法。但是,Java不支持多重繼承。有了介面,就可以得到多重繼承的效果。 另一方面,有時必須從幾個類中抽取出一些共同的行為特征,而它們之間又沒有is-a的關係,僅僅是具有相同的行為特征而已。 二、圖示 三、介面的使用 1.介面: ...
一、背景
一方面,有時必須從幾個類中派生出一個子類,繼承它們所有的屬性和方法。但是,Java不支持多重繼承。有了介面,就可以得到多重繼承的效果。 另一方面,有時必須從幾個類中抽取出一些共同的行為特征,而它們之間又沒有is-a的關係,僅僅是具有相同的行為特征而已。二、圖示
三、介面的使用
1.介面:抽象方法和常量值定義的集合。
2.介面的特點:
> 用interface來定義。
> 介面中的所有成員變數都預設是由public static final修飾的。
> 介面中的所有抽象方法都預設是由public abstract修飾的。
> 介面中沒有構造器。
> 介面採用多繼承機制。
3.舉例
4.介面的說明:
①定義Java類的語法格式:先寫extends,後寫implements
> class SubClass extends SuperClass implements InterfaceA{ }
②一個類可以實現多個介面,介面也可以繼承其它介面。
③實現介面的類中必須提供介面中所有方法的具體實現內容,方可實例化。否則,仍為抽象類。
④介面的主要用途就是被實現類實現。(面向介面編程)
⑤與繼承關係類似,介面與實現類之間存在多態性
⑥介面和類是併列關係,或者可以理解為一種特殊的類。從本質上講,介面是一種特殊的抽象類,這種抽象類中只包含常量和方法的定義(JDK7.0及之前),而沒有變數和方法的實現。
5.代碼:
public class test { public static void main(String[] args) { Person p = new Person(); p.start(); p.run(); p.stop(); } } interface Runner{ public abstract void start(); public void run(); public void stop(); } class Person implements Runner{ @Override public void start() { System.out.println("開始跑"); } @Override public void run() { System.out.println("正在跑"); } @Override public void stop() { System.out.println("停止跑"); } }
四、Java8中介面的改進
Java8中為介面增加了靜態方法和預設方法。
public class test { public static void main(String[] args) { Person p = new Person(); p.method1(); } } interface Runner{ //介面中定義預設方法 public default void method1(){ System.out.println("北京"); Runner.method2(); } //介面中定義靜態方法 public static void method2(){ System.out.println("上海"); } } class Person implements Runner{ }
介面衝突問題:
①若一個介面中定義了一個預設方法,而另外一個介面中也定義了一個同名同參數的方法(不管此方法是否是預設方法),在實現類同時實現了這兩個介面時,會出現:介面衝突。
> 解決辦法:實現類必須覆蓋介面中同名同參數的方法,來解決衝突。
②若一個介面中定義了一個預設方法,而父類中也定義了一個同名同參數的非抽象方法,則不會出現衝突問題。因為此時遵守:類優先原則。介面中具有相同名稱和參數的預設方法會被忽略。
public class test { public static void main(String[] args) { Person p = new Person(); p.help();//重寫的方法 } } interface A{ default void help(){ System.out.println("help1"); } } interface B{ default void help(){ System.out.println("help2"); } } class Person implements A, B{ @Override public void help() { System.out.println("重寫的方法"); } }
作者:Java之美
日期:2020-03-29