JDK8- interface接口可以寫方法體了-- 驚 dt.jar包等


基本上所有的Java教程都會告訴我們Java接口的方法都是public、abstract類型的,沒有方法體的。

但是在JDK8里面,你是可以突破這個界限的哦。

== 一個類實現某個接口,必須重寫接口中的所有方法嗎?

如果子類是非抽象類,則必須實現接口中的所有方法; 
如果子類是抽象類,則可以不實現接口中的所有方法,因為抽象類中允許有抽象方法的存在!

public interface ItfTest {//定義一個接口 
  public void test();//定義接口的方法 
} 

public abstract class AbsTest implements ItfTest {
//實現一個抽象類,繼承ItfTest接口,可以不重寫test方法,由AbsTest的子類實現 
}

== 上面是之前的定義了,jdk8開始,接口中有方法體的方法 子類不需要實現。舉例:

MyInterface.java:
interface MyInterface{
    String myNewName(String newName);

    default String myOldName(){
        return "chao";
    }

}

GetName.java:
public class GetName implements MyInterface{

    public static void main(String args[]){
        GetName getName = new GetName();
//可以直接調用接口中的默認方法myOldName()
        System.out.println("my old name is "+getName.myOldName());
        String newName = "超人";
        getName.myNewName(newName);
    }

//只需要實現接口中沒有方法體的方法即可;
    public String myNewName(String newName){
        System.out.println("my new name is "+newName);
        return "my new name is "+newName;
    }
}
運行結果:
my old name is chao
my new name is 超人

 

 

拓展:

dt.jar是關於運行環境的類庫,主要是swing的包 
tools.jar是關於一些工具的類庫 
rt.jar包含了jdk的基礎類庫,也就是你在java doc里面看到的所有的類的class文件

編譯和運行需要的都是toos.jar里面的類 , 分別是   
  sun.tools.java.*;   
  sun.tools.javac.*;

==以上背景:

 為什么是.class,難道我的環境可以看到.class的源碼??

某天在看public interface Map<K,V> 接口( java.util.Map<K, V>)時發現 1、里面有一個內部接口 java.util.Map.Entry<K, V>

2、該接口的方法 java.util.Map.replaceAll(BiFunction<? super K, ? super V, ? extends V>) 等方法都有方法體,如:貌似要加上 default

     * @since 1.8
     */
    default V replace(K key, V value) {
        V curValue;
        if (((curValue = get(key)) != null) || containsKey(key)) {
            curValue = put(key, value);
        }
        return curValue;
    }

 -------

     * @since 1.8
     */
    default boolean remove(Object key, Object value) {
        Object curValue = get(key);
        if (!Objects.equals(curValue, value) ||
            (curValue == null && !containsKey(key))) {
            return false;
        }
        remove(key);
        return true;
    }
default boolean remove(Object key, Object value)

 

Map.class是在package java.util 中的,而他們又在 rt.jar包中的
C:\Program Files\Java\jdk1.8.0_102\jre\lib\rt.jar

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM