Java8—接口新特性
Java8中针对接口更新了一些特性,让它变得更加像类了,在此进行相应总结归纳。
- 接口中定义的静态方法,只能通过接口来调用
- 通过实现类的对象,可以调用接口中的默认方法,当然,该方法也可以被实现类重写
package Java8Template;
interface Template1 {
public static void a(){
System.out.println("接口静态方法运行!");
}
public default void b() {
System.out.println("接口默认方法运行!");
}
}
interface Template2 {
public static void a(){
System.out.println("接口静态方法运行!");
}
public default void b() {
System.out.println("接口默认方法运行!");
}
}
package Java8Template;
import AbstractTemplate.Template;
public class MyDemo implements Template1{
public void myMethod() {
Template1.a(); // 特性1
}
@Override
public void b() {
System.out.println("实现类中b方法运行");
}
}
package Java8Template;
public class TestMyDemo {
public static void main(String[] args) {
MyDemo myDemo = new MyDemo();
myDemo.myMethod();
myDemo.b(); // 特性2
}
}
运行结果如下图:
- 如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的默认方法,那么子类在没有重写次方法的情况下,默认调用的是父类中的同名同参数方法--->类优先原则
package Java8Template;
interface Template1 {
public static void a(){
System.out.println("接口静态方法运行!");
}
public default void b() {
System.out.println("接口默认方法运行!");
}
}
interface Template2 {
public static void a(){
System.out.println("接口静态方法运行!");
}
public default void b() {
System.out.println("接口默认方法运行!");
}
}
package Java8Template;
import AbstractTemplate.Template;
public class MyDemo extends FatherDemo implements Template1{
public void myMethod() {
Template1.a();
}
}
class FatherDemo {
public void b() {
System.out.println("父类中b方法运行");
}
}
package Java8Template;
public class TestMyDemo {
public static void main(String[] args) {
MyDemo myDemo = new MyDemo();
myDemo.myMethod();
myDemo.b(); // 特性3
}
}
运行结果如下图:

- 如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,那么在实现类没有重写此方法的情况下,报错--->接口冲突,这就需要我们必须在实现类中重写此方法

- 如何在子类(或实现类)的方法中调用父类、接口中被重写的方法
接口名.super.方法名()

package Java8Template;
import AbstractTemplate.Template;
public class MyDemo extends FatherDemo implements Template1{
public void b() {
System.out.println("本类b方法运行!");
}
// 特性5
public void myMethod() {
b(); // 本类方法
super.b(); // 父类方法
Template1.super.b(); // 接口中默认方法
}
}
class FatherDemo {
public void a() {
System.out.println("父类中a方法运行");
}
public void b() {
System.out.println("父类中b方法运行");
}
}

浙公网安备 33010602011771号