JDK1.8以前,定义了接口,所有实现类都必须 实现 接口的所有方法。
但是,有很多时候,接口可以有 通用的实现 或者 默认的实现。
这个时候,很多框架,都定义一个 抽象类 实现接口,默认实现。
我们自己的类,再继承抽象类。
但是,每次都会多一个抽象类,有时候没有必要。
interface Visit{ void visit(); } class BaseVisit implements Visit{ void visit(){ } } class MyVisit extends BaseVisit{ } |
JDK1.8 有了 接口默认实现,简化了 抽象类。
写了个例子:
public static void main(String[] args) { User user1 = new User(); user1.setId( 1 ); User user2 = new User(); user2.setId( 2 ); User user3 = new User(); user3.setId( 3 ); User user4 = new User(); user4.setId( 4 ); List<User> userList = Arrays.asList(user1, user2, user3, user4); // 默认遍历,for循环 DefaultUserVisit defaultUserVisit = new DefaultUserVisit(); defaultUserVisit.visit(userList); // 自定义遍历,偶数行 MyUserVisit myUserVoVisit = new MyUserVisit(); myUserVoVisit.visit(userList); } |
输出:
默认for循环打印所有
User(id=1, name=null)
User(id=2, name=null)
User(id=3, name=null)
User(id=4, name=null)
自定义,偶数行打印
User(id=2, name=null)
User(id=4, name=null)
其它上下文代码
import lombok.Data; @Data public class User { private Integer id; private String name; } import java.util.List; public interface UserVisit { //默认for循环打印 default void visit(List<User> userList){ System.out.println( "默认for循环打印所有" ); for (User user : userList) { System.out.println(user); } } } public class DefaultUserVisit implements UserVisit { } import java.util.List; import org.apache.commons.collections.CollectionUtils; public class MyUserVisit implements UserVisit { //偶数行打印 @Override public void visit(List<User> userList) { System.out.println( "自定义,偶数行打印" ); if (CollectionUtils.isEmpty(userList)) { return ; } for ( int index = 0 ; index < userList.size(); index++) { if ((index+ 1 ) % 2 == 0 ) { System.out.println(userList.get(index)); } } } } |