【Java进阶学习 第五篇】JDK8、9中的接口新特性
接口新特性
可以提升代码的复用性,减少冗余
JDK8中接口的新特性主要可以允许调用默认方法和静态方法;JDK9中接口的新特性为可以运行调用私有方法供本类方法使用
JDK8新特性
接口中可以定义有方法体的方法(默认或静态)
允许调用默认方法
作用是解决接口升级的问题
允许在接口中定义非抽象方法,但是需要使用关键字default修饰
public class JDK8 {
public static void main(String[] args) {
InterNet1 interNet1 = new InterNet1();
InterNet2 interNet2 = new InterNet2();
interNet1.method();
interNet2.method();
}
}
interface Inter{
void show();
void print();
//升级接口
public default void method(){
System.out.println("Inter method...");
}
}
class InterNet1 implements Inter{
@Override
public void show() {
System.out.println("show111...");
}
@Override
public void print() {
System.out.println("print111...");
}
}
class InterNet2 implements Inter{
@Override
public void show() {
System.out.println("show222...");
}
@Override
public void print() {
System.out.println("print222");
}
}
比如这个代码是V2.0版本,使用JDK8的新特性就可以添加默认方法让子类调用,从而不需要修改实现类就可以升级接口。
实现类也可以重写接口的默认方法
package com.itheima.JdkNew;
public class JDK8 {
public static void main(String[] args) {
InterNet1 interNet1 = new InterNet1();
InterNet2 interNet2 = new InterNet2();
interNet1.method();
interNet2.method();
}
}
interface Inter{
void show();
void print();
//升级接口
public default void method(){
System.out.println("Inter method...");
}
}
class InterNet1 implements Inter{
@Override
public void method() {
System.out.println("111 method...");
//Inter.super.method();
}
@Override
public void show() {
}
@Override
public void print() {
}
}
class InterNet2 implements Inter{
@Override
public void show() {
}
@Override
public void print() {
}
}
打印为:
111 method...
Inter method... 可以看见第一个实现类已经可以对接口中的默认方法进行重写
其中需要去掉default关键字,且如果要调用接口中的代码,需要用接口名.super
如果实现了多个接口,多个接口中存在相同的默认方法,实现类必须重写默认方法
public class JDK8 {
public static void main(String[] args) {
InterNet1 interNet1 = new InterNet1();
interNet1.method();
}
}
interface Inter{
void show();
void print();
//升级接口
public default void method(){
System.out.println("Inter method...");
}
}
interface A{
public default void method(){
System.out.println("A method...");
}
}
class InterNet1 implements Inter,A{
@Override
public void method() {
Inter.super.method();
A.super.method();
}
@Override
public void show() {
}
@Override
public void print() {
}
}
打印为:
Inter method...
A method... 可以看见在多实现接口的情况下,我们必须在子类重写同名的默认方法,且调用父类时,需要在super前声明接口。
允许调用静态方法
public class JDK8 {
public static void main(String[] args) {
A.function();
}
}
interface A{
default void method(){
System.out.println("A method...");
}
static void function(){
System.out.println("A function...");
}
}
public可以省略,static不能省略,只能通过类名调用
JDK9新特性
接口中可以定义私有方法
如果接口当中许多方法都需要同样的实现逻辑,可以编写私有方法方便操作
public class JDK8 {
public static void main(String[] args) {
InterNet2 obj = new InterNet2();
obj.method();
obj.function();
}
}
interface A{
default void method(){
System.out.println("A method...");
printLove();
// System.out.println("love");
}
default void function(){
System.out.println("A function...");
printLove();
// System.out.println("love");
}
private void printLove(){
System.out.println("love");
}
}
如果接口的方法中有JDK8新特性提出的静态方法,那么我们可以在私有方法的基础上加上static修饰,这样既可以让默认方法使用,也可以让静态方法调用
public class JDK8 {
public static void main(String[] args) {
InterNet2 obj = new InterNet2();
obj.method();
A.function();
}
}
interface A{
default void method(){
System.out.println("A method...");
printLove();
// System.out.println("love");
}
static void function(){
System.out.println("A function...");
printLove();
// System.out.println("love");
}
private static void printLove(){
System.out.println("love");
}
}