JDK8- interface接口可以写方法体了-- 惊 dt.jar包等
基本上所有的Java教程都会告诉我们Java接口的方法都是public、abstract类型的,没有方法体的。
但是在JDK8里面,你是可以突破这个界限的哦。
== 一个类实现某个接口,必须重写接口中的所有方法吗?
如果子类是非抽象类,则必须实现接口中的所有方法;
如果子类是抽象类,则可以不实现接口中的所有方法,因为抽象类中允许有抽象方法的存在!
public interface ItfTest {//定义一个接口 public void test();//定义接口的方法 }public abstract class AbsTest implementsItfTest {//实现一个抽象类,继承ItfTest接口,可以不重写test方法,由AbsTest的子类实现 }
== 上面是之前的定义了,jdk8开始,接口中有方法体的方法 子类不需要实现。举例:
MyInterface.java:interfaceMyInterface{
String myNewName(String newName);defaultString myOldName(){return "chao";
}
}
GetName.java:public class GetName implementsMyInterface{public static voidmain(String args[]){
GetName getName= newGetName();//可以直接调用接口中的默认方法myOldName() System.out.println("my old name is "+getName.myOldName());
String newName= "超人";
getName.myNewName(newName);
}//只需要实现接口中没有方法体的方法即可; publicString myNewName(String newName){
System.out.println("my new name is "+newName);return "my new name is "+newName;
}
}运行结果:
my old name is chao
mynew 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 */ defaultV replace(K key, V value) {
V curValue;if (((curValue = get(key)) != null) ||containsKey(key)) {
curValue=put(key, value);
}returncurValue;
}
-------
* @since 1.8 */ default booleanremove(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