default关键字在JDK8中有两个用处。
1. 在switch语句的时候使用default
int day = 8; String dayString; switch (day) { case 1: dayString = "Monday"; break; case 2: dayString = "Tuesday"; break; case 3: dayString = "Wednesday"; break; case 4: dayString = "Thursday"; break; case 5: dayString = "Friday"; break; case 6: dayString = "Saturday"; break; //如果case没有匹配的值,那么肯定是星期日 default: dayString = "Sunday"; break; } System.out.println(dayString);
当case里的值与switch里的key没有匹配的时候,执行default里的方法。
interface IntefercaeDemo { //具体方法 default void showDefault(){ System.out.println("this is showDefault method"); } //具体方法 static void showStatic(){ System.out.println("this is showStatic method"); } //没有实现的抽象方法 void sayHi(); } class LearnDefault implements IntefercaeDemo{ //实现抽象方法 @Override public void sayHi() { System.out.println("this is sayHi mehtod"); } public static void main(String[] args) { //接口中被static所修饰的具体方法 IntefercaeDemo.showStatic(); //将实现了IntefercaeDemo的类实例化 LearnDefault learnDefault = new LearnDefault(); //被Default所修饰的具体方法可以通过引用变量来调用 learnDefault.showDefault(); } }
JDK8中为了加强接口的能力,使得接口可以存在具体的方法,前提是方法需要被default或static关键字所修饰。 这样做的好处是接口的每个实现类如果都想要相同的功能,就不需要重复代码,而是在接口进行定义即可。 默认方法在子类也可以被重写。
另外子类重写的时候,记得synchronized标记的父类函数,子类重写也必须要带synchronized关键字。更多有关synchronized的知识, 点击查看
FAQ
如果一个类实现了两个接口,这两个接口又同时都包含了一个名字相同的default方法,那么会发生什么情况?
在这样的情况下,编译器是会报错,得到一个编译器错误,因为编译器不知道应该在两个同名的default方法中选择哪一个,因此产生了二义性。
在成员函数定义时,没有加访问限制符的函数,其访问等级为default
public class Demo{ // 没有访问修饰符修饰,访问限制等级为default String name; void show(){} }
来回顾下Java中访问限制符的对比:
更多内容,欢迎关注微信公众号:全菜工程师小辉 ~
戳 “阅读原文” 一起来充电吧!
喜欢就点个“在看”呗 ^_^