Java 8中,你可以为接口添加静态方法和默认方法。
静态方法:使用 static 关键字修饰。可以通过接口直接调用静态方法,并执行 其方法体。我们经常在相互一起使用的类中使用静态方法。
默认方法:默认方法使用 default 关键字修饰。可以通过实现类对象来调用。
实例:
package com.qwy;
public interface A {
//定义静态方法
public static void m1(){
System.out.println("A.m1()");
}
//定义默认方法
public default void m2(){
System.out.println("A.m2()");
}
}
class Test{
public static void main(String[] args) {
//调用接口A中的m1()方法
A.m1();
}
}
实例:接口中定义的静态方法,只能通过接口来调用。
package com.qwy;
public interface A {
//定义静态方法
public static void m1(){
System.out.println("A.m1()");
}
//定义默认方法
public default void m2(){
System.out.println("A.m2()");
}
}
class Aimpl implements A{
}
class Test{
public static void main(String[] args) {
Aimpl aimpl= new Aimpl();
//错误:接口中定义的静态方法,只能通过接口来调用
//aimpl.m1();
//调用接口中的默认方法
aimpl.m2();
}
}
运行结果:A.m2()
此时的实现类没有对接口中的默认方法进行重写,执行的是接口的默认方法
实例:实现类对接口中的默认方法进行重写
package com.qwy;
public interface A {
//定义静态方法
public static void m1(){
System.out.println("A.m1()");
}
//定义默认方法
public default void m2(){
System.out.println("A.m2()");
}
}
class Aimpl implements A{
//重写接口中的默认方法
public void m2(){
System.out.println("Aimpl.m2()");
}
}
class Test{
public static void main(String[] args) {
Aimpl aimpl= new Aimpl();
//调用接口中的默认方法
aimpl.m2();
}
}
运行结果:Aimpl.m2()
结论:如果实现类重写了接口中的默认方法,调用时,仍然调用的是重写以后的方法
实例:父类和接口中有同样的方法,子类没有重写
package com.qwy;
public interface A {
//定义静态方法
public static void m1(){
System.out.println("A.m1()");
}
//定义默认方法
public default void m2(){
System.out.println("A.m2()");
}
}
class B{
public void m2(){
System.out.println("B.m2()");
}
}
class Aimpl extends B implements A{
//子类没有对接口中的默认方法进行重写
}
class Test{
public static void main(String[] args) {
Aimpl aimpl= new Aimpl();
//调用接口中的默认方法
aimpl.m2();
}
}
运行结果:B.m2()
结论:如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的默认方法,那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法。
实例:父类和接口中有同样的方法,子类重写
package com.qwy;
public interface A {
//定义静态方法
public static void m1(){
System.out.println("A.m1()");
}
//定义默认方法
public default void m2(){
System.out.println("A.m2()");
}
}
class B{
public void m2(){
System.out.println("B.m2()");
}
}
class Aimpl extends B implements A{
//重写
public void m2(){
System.out.println("Aimpl.m2()");
}
}
class Test{
public static void main(String[] args) {
Aimpl aimpl= new Aimpl();
//调用接口中的默认方法
aimpl.m2();
}
}
运行结果:Aimpl.m2()
结论:执行被重写过的方法
实例:其他
package com.qwy;
public interface A {
//定义默认方法
public default void m2(){
System.out.println("A.m2()");
}
}
class B{
public void m2(){
System.out.println("B.m2()");
}
}
class Aimpl extends B implements A{
public void m2(){
System.out.println("Aimpl.m2()");
}
public void method(){
m2();//调用自己重写过的方法
super.m2();//调用父类中的方法
A.super.m2();//调用接口中默认方法
}
}
class Test{
public static void main(String[] args) {
Aimpl aimpl= new Aimpl();
aimpl.method();
}
}
运行结果:
Aimpl.m2()
B.m2()
A.m2()
结论:在实现类中可以使用**supper.方法名()方式调用父类的方法,使用接口名.super.方法名()**方式调用接口中默认的方法。