难度
初级
学习时间
30分钟
适合人群
零基础
开发语言
Java
开发环境
- JDK v11
- IntelliJ IDEA v2018.3
提示
本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
1.接口中抽象方法
在学习接口中的默认方法之前,我们先来看看接口中的抽象方法。
演示:
请编写一个接口,定义一个抽象方法。再编写一个实现类,实现其接口中的方法。
请观察程序运行结果。
代码:
Shape接口:
Circle类:
Main类:
结果:
从运行结果来看,完全没有问题。
这个时候,接口Shape中突然要添加一个方法,而Shape接口已经被很多实现类所实现,直接在接口中添加一个方法可能不太好,因为Shape所有的实现类都要去实现这个新方法。为了解决这个问题,Java采取了一个新措施,就是允许给接口中方法添加默认实现,这样之前所有的实现类都不用重新写他们的实现。
默认方法使我们能够向接口添加新功能,并确保与为这些接口的旧版本编写的代码兼容性。
2.接口与默认方法
接口体可以包含默认方法。
默认方法使用默认修饰符定义。
接口中的所有抽象,默认和静态方法都是隐式公共的,因此我们可以省略public修饰符。
默认方法定义格式:
演示:
请编写一个接口,接口体里面声明一个抽象方法和一个默认方法。再编写一个实现类,实现其抽象方法。
请观察程序运行结果。
代码:
Shape接口:
Circle类:
Main类:
结果:
从运行结果来看,默认方法可以直接被实现类调用。实现类也不用着急去实现它。
3.接口中的所有抽象,默认和静态方法都是隐式公共的
接口中的所有抽象,默认和静态方法都是隐式公共的,因此我们可以省略public修饰符。
我们来试试去掉public修饰符看看。
演示:
请编写一个接口,接口体里面声明一个抽象方法和一个默认方法。再编写一个实现类,实现其抽象方法。
请观察程序运行结果。
代码:
Shape接口:
Circle类:
Main类:
结果:
从运行结果来看,符合预期结果。
省略了public修饰符让程序看起来更加的简洁。
4.默认方法不能与static关键字搭配
演示:
请编写一个接口,接口体里面声明一个抽象方法和一个默认方法。再编写一个实现类,实现其抽象方法。
请观察程序运行结果。
实现:
Shape接口:
Circle类:
Main类:
结果:
错误信息:
文字版:
/Users/admin/Workspace/Java/Hello/src/lab/Shape.javaError:(16, 25) java: 非法的修饰符组合: static和default
从运行结果来看,默认方法是不能与static搭配使用的。static修饰的方法叫静态方法。
5.默认方法不能与final关键字搭配
演示:
请编写一个接口,接口体里面声明一个抽象方法和一个默认方法。再编写一个实现类,实现其抽象方法。
请观察程序运行结果。
实现:
Shape接口:
Circle类:
Main类:
结果:
错误信息:
文字版:
/Users/admin/Workspace/Java/Hello/src/lab/Shape.javaError:(16, 24) java: 此处不允许使用修饰符final
从运行结果来看,默认方法是不能与final搭配使用的。final修饰的方法叫最终方法,不能被实现,这样的话就与接口中定义方法自相矛盾。
6.默认方法不能与abstract关键字搭配
演示:
请编写一个接口,接口体里面声明一个抽象方法和一个默认方法。再编写一个实现类,实现其抽象方法。
请观察程序运行结果。
实现:
Shape接口:
Circle类:
Main类:
结果:
错误信息:
文字版:
/Users/admin/Workspace/Java/Hello/src/lab/Shape.javaError:(16, 27) java: 非法的修饰符组合: abstract和default
从运行结果来看,默认方法是不能与abstract搭配使用的。abstract修饰的方法叫抽象方法,没有方法体,这样的话就与接口中定义默认方法自相矛盾。
6.多继承接口中的默认方法
多继承中的默认方法存在覆盖。
演示:
请编写一个接口,里面只有一个默认方法。
再编写一个接口继承上述接口,接口体里面只有一个抽象方法。再编写一个实现类,实现其抽象方法。
UML类图:
请观察程序运行结果。
代码:
Drawable接口:
Shape接口:
Circle类:
Main类:
结果:
从运行结果来看,实现类Circle拥有Shape接口和Drawable接口两个接口中所有方法,其中重写了Shape接口中的抽象方法。
下面我们再来添加一个接口,新添加的接口里面有一个和Drawable接口里面一摸一样的默认方法,只是打印的话不同。让其Shape接口继承新接口。
新的UML类图:
Computable接口:
Shape接口:
结果:
错误信息:
文字版:
/Users/admin/Workspace/Java/Hello/src/lab/Shape.javaError:(6, 8) java: 类型 lab.Drawable 和 lab.Computable 不兼容; 接口 lab.Shape从类型 lab.Drawable 和 lab.Computable 中继承了sayHello() 的不相关默认值
多继承接口中,不允许被继承接口直接有重复默认方法。
那么我们把Shape接口中写上和Drawable接口里一摸一样的默认方法可不可以?来试试。
首先将Computable接口中默认方法删除:
然后编写Shape接口中的默认方法:
结果:
从运行结果来看,默认方法可以被覆盖。那么是不是可以在覆盖的默认方法上加一个重写注解?来试试:
结果:
发现完全是没有问题的。
我们再给Computable接口中写上和Shape里面一摸一样默认方法,只是打印的话不同,观察还报不报错:
结果:
从运行结果来看,当多继承接口时,除非子接口重写了父接口中的默认方法,否则父接口之间不能有相同的默认方法。
注意
未声明为default或static的接口中的方法是隐式抽象的,因此abstract修饰符不与接口方法一起使用(可以使用,但不需要)。
本章小结
- 默认方法default关键字不能省略。
- 默认方法public关键字可以省略。
- 默认方法不能有static关键字,有static关键字的方法叫静态方法。
- 默认方法不能有final关键字,有final关键字的方法不能被实现类重写。
- 默认方法不能有abstract关键字,因为abstract方法是抽象方法,抽象方法本来就不带方法体,而默认方法就是带默认实现的方法体,自相矛盾。
- 默认方法可以在接口继承中被覆盖。
- 在多继承接口中,接口之间不能有方法签名一摸一样的默认方法。
- 当多继承接口时,除非子接口重写了父接口中的默认方法,否则父接口之间不能有相同的默认方法。
总结
- 在Java编程语言中,接口是类似于类的引用类型,它只能包含常量,方法签名,默认方法,静态方法和嵌套类型。 方法体仅适用于默认方法和静态方法。 接口无法实例化 - 它们只能由类实现或由其他接口扩展。
- 接口体可以包含抽象方法,默认方法和静态方法。接口中的抽象方法后跟分号,但没有大括号(抽象方法不包含实现)。默认方法使用默认修饰符定义,静态方法使用static关键字定义。接口中的所有抽象,默认和静态方法都是隐式公共的,因此我们可以省略public修饰符。
- 此外,接口可以包含常量声明。接口中定义的所有常量值都是隐式public,static和final,我们可以省略这些修饰符。
- 接口可以扩展其他接口,就像类子类或扩展另一个类一样。但是,虽然类只能扩展另一个类,但接口可以扩展任意数量的接口。接口声明包括它扩展的所有接口的逗号分隔列表。
- 未声明为default或static的接口中的方法是隐式抽象的,因此abstract修饰符不与接口方法一起使用(可以使用,但不需要)。
- 接口的访问修饰符只能是public和默认的访问修饰符。
至此,Java中接口与默认方法相关内容讲解先告一段落,更多内容请持续关注。
附:接口学习资料
答疑
如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。
上一章
下一章
“全栈2019”Java第六十六章:抽象类与接口详细对比
学习小组
加入同步学习小组,共同交流与进步。
- 方式一:关注头条号Gorhaf,私信“Java学习小组”。
- 方式二:关注公众号Gorhaf,回复“Java学习小组”。
全栈工程师学习计划
关注我们,加入“全栈工程师学习计划”。
版权声明
原创不易,未经允许不得转载!