基本上所有的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; }
Map.class是在package java.util 中的,而他們又在 rt.jar包中的
C:\Program Files\Java\jdk1.8.0_102\jre\lib\rt.jar