java8接口默认方法

解决问题:在java8 之前的版本,在修改已有的接口的时候,需要修改实现该接口的实现类。

作用:解决接口的修改与现有的实现不兼容的问题。在不影响原有实现类的结构下修改新的功能方法

案例:

首先定义一个接口DefaultMethodInterface,该接口中定义了静态变量/接口方法/无返回值的默认方法/静态的默认方法/,在java8之前的版本是无法定义默认的方法。

package com.ven.java8.defaultmethod.Inteface;

/**
 * jva8接口默认方法
 * @author xiaowen0623
 *
 */
public interface DefaultMethodInterface {
	/**
	 * 接口静态变量
	 */
	public static final String TYPE="JAVA8";
	
	/**
	 * 接口静态变量
	 */
	public static final String ZW="JAVA WEB开发工程师";
	/**
	 * 接口方法
	 * 
	 * @param userName
	 */
	public void execute(String userName);

	/**
	 * 默认方法
	 * 
	 * @param userName
	 */
	default void learn(String userName) {
		System.out.println(userName + "正在学习"+TYPE+"。。。。。。");
	}

	/**
	 * 默认的静态方法
	 * 
	 * @param userName
	 * @return
	 */
	public static String learnStr(String userName) { 
		String result = userName + " " + "是一名"+ZW;
		return result;

	};

}
编写一个测试类:

package com.ven.java8.defaultmethod.Inteface;

/**
 * 测试接口默认方法
 * 
 * @author xiaowen
 *
 */
public class TestDefaultMethodInterface {
	public static void main(String[] args) {
		// 新创建一个接口实例
		DefaultMethodInterface defaul = new DefaultMethodInterface() {
			@Override
			public void execute(String userName) {
				System.out.println(userName + "正在漫漫搬运代码......");
			}

		};
		// 调用接口的默认方法
		defaul.learn("xiaowen");
		// 调用接口方法
		defaul.execute("xiaowen");
		// 调用接口的静态方法
		String result = DefaultMethodInterface.learnStr("xiaowen");
		System.out.println(result);
	}
}
控制台打印信息:

xiaowen正在学习JAVA8。。。。。。
xiaowen正在漫漫搬运代码......
xiaowen 是一名JAVA WEB开发工程师
总结:

java8的默认接口方法在不破坏java现有实现架构的情况下能往接口里增加新方法。

java 8抽象类和接口的区别:

相同点:

 

Ø  都是抽象类型

Ø  都可以有实现方法(在java8之前是不可以的)

Ø  都可以不需要实现类或者继承者去实现所有方法,(以前不行,现在接口中默认方法不需要实现者实现)

 

不同点:

 

Ø  抽象类不可以多重继承,接口可以(无论是多重类型继承还是多重行为继承);

Ø  抽象类和接口所反映出的设计理念不同。其实抽象类表示的是"is-a"关系,接口表示的是"like-a"关系;

Ø  接口中定义的变量默认是publicstatic final 型,且必须给其初值,所以实现类中不能改变其值;抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

想一个问题,如果在A接口和B接口中都定义了相同名称的默认方法,实现类C同时实现这两个接口,会出现怎样的情况呢?

定义接口DefaultMethodInterface

package com.ven.java8.defaultmethod.Inteface;

/**
 * jva8接口默认方法
 * @author xiaowen0623
 *
 */
public interface DefaultMethodInterface {
	/**
	 * 接口静态变量
	 */
	public static final String TYPE="JAVA8";
	
	/**
	 * 接口静态变量
	 */
	public static final String ZW="JAVA WEB开发工程师";
	/**
	 * 接口方法
	 * 
	 * @param userName
	 */
	public void execute(String userName);

	/**
	 * 默认方法
	 * 
	 * @param userName
	 */
	default void learn(String userName) {
		System.out.println(userName + "正在学习"+TYPE+"。。。。。。");
	}

	/**
	 * 默认的静态方法
	 * 
	 * @param userName
	 * @return
	 */
	public static String learnStr(String userName) { 
		String result = userName + " " + "是一名"+ZW;
		return result;

	};

}
定义接口DefaultMethodInterfaceB

package com.ven.java8.defaultmethod.Inteface;

/**
 * jva8接口默认方法
 * @author xiaowen0623
 *
 */
public interface DefaultMethodInterfaceB {
	/**
	 * 接口静态变量
	 */
	public static final String TYPE="SPRING";
	
	/**
	 * 接口静态变量
	 */
	public static final String ZW="JAVA 服务器端开发工程师";
	/**
	 * 接口方法
	 * 
	 * @param userName
	 */
	public void execute(String userName);

	/**
	 * 默认方法
	 * 
	 * @param userName
	 */
	default void learn(String userName) {
		System.out.println(userName + "正在学习"+TYPE+"。。。。。。");
	}

	/**
	 * 默认的静态方法
	 * 
	 * @param userName
	 * @return
	 */
	public static String learnStr(String userName) { 
		String result = userName + " " + "是一名"+ZW;
		return result;

	};

}
实现类DefaultMethodImpl

package com.ven.java8.defaultmethod.Inteface;
/**
 * 默认方法接口实现类
 * @author xiaowen
 *
 */
public class DefaultMethodImpl implements DefaultMethodInterface,DefaultMethodInterfaceB{

	@Override
	public void learn(String userName) {
		DefaultMethodInterfaceB.super.learn(userName);
	}

	@Override
	public void execute(String userName) {
		
	}

}
可见该实现类重写了默认方法learn(String userName),调用指定的接口默认方法,可以由实际改变。

如果是实现DefaultMethodImpl实现其中的一个接口,比如:DefaultMethodInterface,默认可以不需要重写默认方法,

package com.ven.java8.defaultmethod.Inteface;
/**
 * 默认方法接口实现类
 * @author xiaowen
 *
 */
public class DefaultMethodImpl implements DefaultMethodInterface{

	@Override
	public void execute(String userName) {
		
	}

}
重写默认方法:

package com.ven.java8.defaultmethod.Inteface;
/**
 * 默认方法接口实现类
 * @author xiaowen
 *
 */
public class DefaultMethodImpl implements DefaultMethodInterface{

	
	@Override
	public void learn(String userName) {
		System.out.println("呵呵");
	}

	@Override
	public void execute(String userName) {
		
	}

}
测试:

package com.ven.java8.defaultmethod.Inteface;
/**
 * 测试
 * @author xiaowen
 *
 */
public class TestImpl {
public static void main(String[] args) {
	DefaultMethodInterface d = new DefaultMethodImpl();
	d.learn("xiaowen");
}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值