39--接口二

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.方法名()**方式调用接口中默认的方法。

上一篇:数据结构与算法(39): 在排序数组中查找数字


下一篇:Leetcode 剑指 Offer 39. 数组中出现次数超过一半的数字