1. 程式人生 > 程式設計 >簡單瞭解Java的預設和靜態方法

簡單瞭解Java的預設和靜態方法

這篇文章主要介紹了簡單瞭解Java的預設和靜態方法,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

淺談Java的預設和靜態方法

允許在介面中宣告預設方法和靜態方法,是JDK1.8新增的特性。存在即合理,兩者的出現,讓介面越來越像抽象類,那麼它們為什麼出現呢,它們的出現產生了哪些便利,Java小白開始學習並總結,不足之處,還望評論區指點一二!

Java新增預設方法有啥用

官方解答:預設方法允許您新增新的功能到現有庫的介面中,並能確保與採用舊版本介面編寫的程式碼的二進位制相容性。
這個光看枯燥的介紹好像很難理解,舉個簡單的例子。假設有一個很大很大的專案,一個介面被很多很多的類所實現,大家都平安無事平穩地執行著。突然有一天,出現了一個小小地問題,或者說有一個更好的優化方案,需要在這些實現類去增加。在預設方法出現之前,只有抽象方法,且需要在實現類中給出具體定義才能操作,那豈不是隻能兩眼一閉,直接從早幹到晚地新增啦。

但是,預設方法地出現允許在介面中給出方法的具體實現,且實現類中能夠自動實現預設方法,我只需要將這個優化放在介面的預設方法裡面,就能完成對所有實現類的優化啦。當然,純屬個人理解,如果我的例子有不恰當的地方,歡迎指正哦。

package com.my.pac21;

/**
 * @auther Summerday
 */

interface Closable {
  void close();
  //假設是新增的預設方法
  default void makeSound() {
    System.out.println("peng!");
  }
}

interface Openable {
  default void makeSound() {
    System.out.println("peng!");
  }
}

class Window implements Closable {

  @Override
  public void close() {
    System.out.println("Window.close");
  }
}

public class Door implements Closable,Openable {

  @Override
  public void close() {
    System.out.println("Door.close");
  }

  //兩個介面中包含同名的方法,需要重寫,指定一個
  @Override
  public void makeSound() {
    System.out.println("need to override default methods");
  }

  public static void main(String[] args) {
    Closable cw = new Window();
    Closable cd = new Door();
    cw.close();//Window.close
    cd.close();//Door.close

    //實現預設方法
    cw.makeSound();//peng!
    cd.makeSound();//need to override default methods
  }
}

Java新增的靜態方法有啥用

預設方法和靜態方法的在介面的出現讓介面失去“全是抽象方法”的特性,在探究完新增的預設方法之後,我們該對靜態方法下手啦。開始瘋狂查詢資料。。。

Before Java 8 made it possible to declare static methods in interfaces,it was common practice to place these methods in companion utility classes. For example,the java.util.Collections class is a companion to the java.util.Collection interface,and declares static methods that would be more appropriate in the relevant Java Collections Framework interfaces. You no longer need to provide your own companion utility classes. Instead,you can place static methods in the appropriate interfaces,which is a good habit to cultivate.

這個是我在stack overflow上找到的答案,什麼意思呢,在沒有新增靜態方法之前,我們如果想讓一些固定的操作在介面中出現,就必須定義一個和介面配套的實現類。而介面中靜態方法的出現,可以直接通過介面呼叫靜態方法。

package com.my.pac21;

/**
 * @auther Summerday
 */
public class Test {
  public static void main(String[] args) {
    int val1 = 5;
    int val2 = 6;
    //通過建立實現類的物件
    Countable b = new CountableCompanion();
    System.out.println(b.getNum(val1,val2));
    //直接通過介面呼叫
    Countable.getMul(val1,val2);
  }
}
interface Countable{
  //普通抽象方法
  int getNum(int a,int b);
  //靜態方法
  static int getMul(int a,int b){
    return a*b;
  }
}
//實現介面的實現類
class CountableCompanion implements Countable{
  @Override
  public int getNum(int a,int b) {
    return a+b;
  }
}

這是一個我自認為還比較幼稚的例子,僅供理解。

普通抽象方法的情況:我在介面中定義了一個抽象方法,而後我又定義了實現該方法的實現類,最後通過建立實現類的例項來呼叫該方法,最後算得兩值之和。可以想象,在實際中,如果相同性質的方法想要在多個實現類中實現,這種做法是比較麻煩的。

靜態方法的情況:就很直接地在介面中定義靜態方法,且可以被介面直接呼叫,不需要再定義與其配套的實現類,多舒服哦。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。