一、JDK1.8—接口支持静态方法和默认方法

JDK1.8之前的接口的定和限制

  • 接口不能用于实例化对象。
  • 接口没有构造方法。
  • 接口中所有的方法必须是抽象方法。
  • 接口不能包含成员变量,除了 static 和 final 变量。
  • 接口不是被类继承了,而是要被类实现。
  • 接口支持多继承。

JDK1.8接口支持静方法和默方法

默认方法主要优势:

1、提供了一种扩展接口的方法,而不破坏现有代码。

如果一个已经投入使用的接口需要扩展一个新的方法,在JDK8以前,我们必须再该接口的所有实现类中都添加该方法的实现,否则编译会出错。如果实现类数量很少且我们有修改的权限,可能工作量会少,但是如果实现类很多或者我们没有修改代码的权限,这样的话就很难解决了。而默认方法提供了一个实现,当没有显式提供时就默认采用这个实现,这样新添加的接口就不会破坏现有的代码。

2、默认方法另一个优势是该方法是可选的,子类可以根据不同的需求而且经override或者采用默认实现。

总结:

1、接口默认方法、静态方法可以有多个。

2、默认方法通过实例调用,静态方法通过接口名调用。

3、default默认方法关键字只能用在接口中。

4、默认方法可以被继承,如果继承了多个接口,多个接口都定义了多个同样的默认方法,实现类需要重写默认方法不然会报错。

5、静态方法不能被继承及覆盖,所以只被具体所在的接口调用。

public interface InterfaceJDK8 {

	/*接口的普通抽象方法*/
	public void common(String str);

	/*jdk1.8 默认方法:
	允许在已有的接口中添加新方法,而同时又保持了与旧版本代码的兼容性,
        默认方法与抽象方法不同之处在于抽象方法必须要求实现,但是默认方法则没有要求实现,
	相反,接口提供了一个默认实现,这样所有的接口实现者将会默认继承他
       (如果有必要的话,可以覆盖这个默认实现)。

	接口的默认方法:得到接口的实现类对象,直接用对象的引用.方法名。默认方法可以被实现类覆盖。
	*/
	default public void defaultMethod(String str){
		System.out.println("InterfaceJDK8:" + str);
	}


	/*jdk1.8 静态方法:
	允许在已有的接口中添加静态方法,接口的静态方法属于接口本身,不被继承,也不需要提供方法的实现。
        */
	public static void staticMethod(String str){
		System.out.println("InterfaceJDK8:" + str);
	}

}
public class InterfaceJDK8Impl implements InterfaceJDK8 {
	@Override
	public void commonMethod(String str) {
		System.out.println("我是通通方法");
	}




	public static void main(String[] args){
                //静态方法 接口.方法 调用  (不被继承,不被实现)
		InterfaceJDK8.staticMethod("我是静态方法");

                InterfaceJDK8Impl interfaceJDK8Impl = new InterfaceJDK8Impl();
                //默认方法 实例.方法名 调用 (被继承,可以重写覆盖默认实现,也可以不重写)
		interfaceJDK8Impl.defauleMethod("我是默认方法");

	}
}


// InterfaceJDK8 :我是静态方法
// InterfaceJDK8 :我是默认方法

public class InterfaceJDK8Impl implements InterfaceJDK8 {
	@Override
	public void commonMethod(String str) {
		System.out.println("InterfaceJDK8Impl :我是通通方法");
	}

	@Override
	public void defauleMethod(String str) {
		System.out.println("InterfaceJDK8Impl :" + str);
	}

	public static void main(String[] args){
		InterfaceJDK8.staticMethod("我是静态方法");

		InterfaceJDK8Impl interfaceJDK8Impl = new InterfaceJDK8Impl();
		interfaceJDK8Impl.defauleMethod("我是默认方法");

	}
}


// InterfaceJDK8 :我是静态方法
// InterfaceJDK8Impl :我是默认方法

接口默认方法的”类优先”原则

若一个接口中定义了一个默认方法,而另外一个父类或接口中 又定义了一个同名的方法时  选择父类中的方法。如果一个父类提供了具体的实现,那么 接口中具有相同名称和参数的默认方法会被忽略。 

接口冲突:如果一个父接口提供一个默认方法,而另一个接 口也提供了一个具有相同名称和参数列表的方法(不管方法 是否是默认方法),那么必须覆盖该方法来解决冲突

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值