java面向对象23 JDK8中关于接口的新特性

/*

  • JDK8中关于接口的新特性
  • JDK8以后的版本中接口内的结构除了可以定义全局常量和抽象方法外,还可以定义静态方法与默认方法
  • 静态方法:使用 static 关键字修饰。可以通过接口直接调用静态方法,并执行其方法体。经常在相互一起使用的类中使用静态方法。
  • 可以在标准库中找到像Collection/Collections或者Path/Paths这样成对的接口和类。
  • 默认方法:默认方法使用 default 关键字修饰。可以通过实现类对象来调用。我们在已有的接口中提供新方法的同时,还保持了与旧版本代码的兼容性。
  • 比如:java 8 API中对Collection、List、Comparator等接口提供了丰富的默认方法
  • 1,接口中定义的静态方法只能被接口调用。(类似工具类)
  • 2,通过实现类对象可以调用接口中的默认方法。实现类中可以重写接口里面的默认方法。
  • 这样对象调用时,调用的是重写的方法。
  • 3,若一个接口中定义了一个默认方法,而父类中也定义了一个同名同参数的非抽象方法,则不会出现冲突问题。因为此时遵守:类优先原则。
  • 接口中具有相同名称和参数的默认方法会被忽略。在子类没有重写此默认方法 的情况下优先调用父类的此方法。
  • 优先顺序为子类重写方法–父类方法–接口方法
  • 4,若一个接口中定义了一个默认方法,而另外一个接口中也定义了一个同名同参数的方法(不管此方法是否是默认方法),
  • 在实现类同时实现了这两个接口时,会出现:接口冲突。解决办法:实现类必须覆盖接口中同名同参数的方法,来解决冲突。
  • 5,子类中调用父类中的重写方法使用super().方法名的方式,指定调用接口中重写的默认方法使用接口名.super.方法名();的方式。

*/

package object_chapter2;

public class Object_Interface_JDK8 {
 public static void main(String[] args) {
	 HighLevelTest t = new HighLevelTest();
//   t.method1();//接口中定义的静态方法不会被实现类继承,无法通过实现类的对象调用
	 HighLevel.method1();//接口中的静态方法只能被接口直接调用
	 t.method2();
	 HighLevelTest1 t1 = new HighLevelTest1();
	 t1.method2();
	 HighLevelTest2 t2 = new HighLevelTest2();
	 t2.method2();
	 System.out.println("----------------");
	 t2.method3();
			 
}
}

interface HighLevel{
	//静态方法
	static void method1() {
		System.out.println("平安无事");
	}
	//默认方法
	default void method2() {
		System.out.println("小心火烛");
	}	
}

interface HighLevel2{
	default void method2() {
		System.out.println("天下太平");
	}	
}

class SuperClass{
	public void method2() {//此处必须加public否则会报错 The inherited method SuperClass.method2() cannot hide the public abstract method in HighLevel2
//	父类同名同参方法的权限不能小于接口中的方法。
		System.out.println("阖家团圆");
	}	
}

class HighLevelTest implements HighLevel{//接口中没有抽象方法可以不用重写
	
}

class HighLevelTest1 implements HighLevel,HighLevel2{

	@Override
	public void method2() {
		// TODO Auto-generated method stub
//		HighLevel.super.method2();//指明此method2()方法调用的是HighLevel接口中的同名方法,解决冲突问题
//		HighLevel2.super.method2();//指明此method2()方法调用的是HighLevel2接口中的同名方法
		System.out.println("河清海晏");//或者重写method2()方法来解决问题
	}//接口中没有抽象方法可以不用重写
	
}

class HighLevelTest2 extends SuperClass implements HighLevel,HighLevel2{
	void method3() {
		super.method2();//调用父类中的同名方法
		HighLevel.super.method2();//调用接口HighLevel中的同名方法
		HighLevel2.super.method2();//调用接口HighLevel2中的同名方法
	}
}
发布了47 篇原创文章 · 获赞 1 · 访问量 1046

猜你喜欢

转载自blog.csdn.net/wisdomcodeinside/article/details/104430717