默认方法和抽象方法的区别是,抽象方法需要实现,而默认方法不需要;
默认方法会被实现类继承或重写。
默认方法会被实现类继承或重写。
所以默认方法被实现有三种可能:
1)完全不管默认方法,因为实现类会继承接口的默认方法;
public interface Instrument {
public void play();
default void test(){
System.out.println("this is default");
}
}
public class Woodwind implements Instrument {
@Override
public void play() {
System.out.println("this is play");
}
public static void mian(String[] args) {
Woodwind woodwind = new Woodwind();
woodwind.play();
woodwind.test();
}
}
结果:
this is play
this is default
2)重新声明默认方法,使其抽象化;
public interface Instrument {
public void play();
default void test(){
System.out.println("this is default");
}
}
public class Woodwind implements Instrument {
@Override
public void play() {
System.out.println("this is play");
}
public void test(){}
public static void mian(String[] args) {
Woodwind woodwind = new Woodwind();
woodwind.play();
woodwind.test();
}
}
结果:
this is play
3)重新定义默认方法,重写默认方法。
public interface Instrument {
public void play();
default void test(){
System.out.println("this is default");
}
}
public class Woodwind implements Instrument {
@Override
public void play() {
System.out.println("this is play");
}
public void test(){
System.out.println("this is new default");
}
public static void mian(String[] args) {
Woodwind woodwind = new Woodwind();
woodwind.play();
woodwind.test();
}
}
结果:
this is play
this is new default
接口中的静态方法,只能被接口自己调用。不能被继承,也不能被实现类调用。
public interface Instrument {
public void play();
default void test(){
System.out.println("this is default");
}
static void testStaitc() {
System.out.println("this is static");
}
}
public class Woodwind implements Instrument {
@Override
public void play() {
System.out.println("this is play");
}
public void test(){
System.out.println("this is new default");
}
public static void mian(String[] args) {
Woodwind woodwind = new Woodwind();
woodwind.play();
woodwind.test();
woodwind.testStatic(); //报错,提示无此方法
Instrument.testStaitc();
}
}
而静态方法可以作为辅助方法,帮助开发更容易组织代码。
比如Comparator比较器