1 相同点:
1)都不能实例化,就是类不能new一个对象。
2)接口的实现类或抽象类的的子类都只有实现接口或抽象中 的方法才能被实例化
1不同点
1)接口里只有定义,方法体不能在接口里实现 / 抽象类可以有定义与实现,被声明为抽象的方法不能有方法体,没有声明为抽象的方法可以有方法体。
2)接口需要实现(implements),抽象类只能被继承(extends)
3)接口里的方法都是抽象的,抽象类只要有一个抽象类的方法就可以。
4)总的来说,接口被运用于实现比较常用的功能,便于日后维护或者删除方法/ 而抽象类更倾向充当公共类的角色,不适于日对里面代码进行修改。
我们看一个银行借款的领子,中国人民银行管理并监督所有的银行,它制定了一个规范,所有的银行在进行借款时都必须遵守这个规范(基本接口);
Version~0.1.0:
中国人民银行定义了一个操作接口:
-
package GoodDesignPattern;
-
-
import java.util.Map;
-
-
public interface BankLoan {
-
-
/**
-
* 银行借款操作
-
* 每个公司都需要实现该方法,并针对自己公司员工的情况进行特殊操作,
-
* 比如判断该员工是否有资格,能借款多少等等
-
* @return
-
*/
-
public Map<String, String> loanOperation(String userId);
-
-
}
所有的银行都必须遵守这个接口,进行具体的实现:
-
package GoodDesignPattern;
-
-
import java.util.HashMap;
-
import java.util.Map;
-
-
public class ABC implements BankLoan {
-
-
-
public Map<String, String> loanOperation(String userId) {
-
-
//所有银行借款必须的校验
-
if(userId== null || userId.isEmpty()){
-
System.out.println( "userId为空!");
-
return null;
-
}
-
//所有银行借款必须的校验
-
if(userId.length()!= 32){
-
System.out.println( "userId格式错误,应该为32位!"+userId);
-
return null;
-
}
-
//所有银行借款必须的校验
-
if(!queryUserExist(userId)){
-
System.out.println( "用户不存在:"+userId);
-
return null;
-
}
-
//所有银行借款必须的校验
-
if(!queryUserIllegal(userId)){
-
System.out.println( "用户没有资格进行借款:"+userId);
-
return null;
-
}
-
-
//业务逻辑
-
Map<String, String> map = getResultMap(userId);
-
return map;
-
-
}
-
-
//根据数据库查询是否存在,根据自己公司的用户表查询
-
public boolean queryUserExist(String userId){
-
return true; //return false;
-
}
-
-
//根据数据库查询数据查询判断
-
public boolean queryUserIllegal(String userId){
-
return true; //return false;
-
}
-
-
//根据数据库查询相关信息
-
public Map<String, String> getResultMap(String userId){
-
Map<String, String> map = new HashMap<String, String>();
-
-
map.put( "name", "詹姆斯"); //此处为了方便直接写死
-
map.put( "amount", "100000"); //应根据userId,在系统进行一系列判断计算,得出能借款金额,此处为了方便直接写死
-
map.put( "rankLevel", "A"); //应根据userId,在系统进行一系列判断计算,得出用户等级,此处为了方便直接写死
-
//.....其它一些列操作
-
-
return map;
-
-
}
-
-
-
}
-
package GoodDesignPattern;
-
-
import java.util.HashMap;
-
import java.util.Map;
-
-
public class ICBC implements BankLoan {
-
-
-
public Map<String, String> loanOperation(String userId) {
-
-
//所有银行借款必须的校验
-
if(userId== null || userId.isEmpty()){
-
System.out.println( "userId为空!");
-
return null;
-
}
-
//所有银行借款必须的校验
-
if(userId.length()!= 32){
-
System.out.println( "userId格式错误,应该为32位!"+userId);
-
return null;
-
}
-
//所有银行借款必须的校验
-
if(!queryUserExist(userId)){
-
System.out.println( "用户不存在:"+userId);
-
return null;
-
}
-
//所有银行借款必须的校验
-
if(!queryUserIllegal(userId)){
-
System.out.println( "用户没有资格进行借款:"+userId);
-
return null;
-
}
-
-
//业务逻辑
-
Map<String, String> map = getResultMap(userId);
-
return map;
-
-
}
-
-
//根据数据库查询是否存在,根据自己公司的用户表查询
-
public boolean queryUserExist(String userId){
-
return true; //return false;
-
}
-
-
//根据数据库查询数据查询判断
-
public boolean queryUserIllegal(String userId){
-
return true; //return false;
-
}
-
-
//根据数据库查询相关信息
-
public Map<String, String> getResultMap(String userId){
-
Map<String, String> map = new HashMap<String, String>();
-
-
map.put( "amount", "100000"); //应根据userId,在系统进行一系列判断计算,得出能借款金额,此处为了方便直接写死
-
map.put( "rankLevel", "A"); //应根据userId,在系统进行一系列判断计算,得出用户等级,此处为了方便直接写死
-
//.....其它一些列操作
-
-
return map;
-
-
}
-
-
-
}
Version~0.2.0:
中国人民银行修改自己的规范:
之前的接口不变,新增一个抽象类:
-
package GoodDesignPattern;
-
-
import java.util.Map;
-
-
public abstract class CommonOpretion {
-
-
public Map<String, String> loanOperation(String userId) {
-
-
//所有银行借款必须的校验
-
if(userId== null || userId.isEmpty()){
-
System.out.println( "userId为空!");
-
return null;
-
}
-
//所有银行借款必须的校验
-
if(userId.length()!= 32){
-
System.out.println( "userId格式错误,应该为32位!"+userId);
-
return null;
-
}
-
//所有银行借款必须的校验
-
if(!queryUserExist(userId)){
-
System.out.println( "用户不存在:"+userId);
-
return null;
-
}
-
//所有银行借款必须的校验
-
if(!queryUserIllegal(userId)){
-
System.out.println( "用户没有资格进行借款:"+userId);
-
return null;
-
}
-
-
//业务逻辑
-
Map<String, String> map = getResultMap(userId);
-
return map;
-
-
}
-
-
//根据数据库查询是否存在,根据自己公司的用户表查询
-
protected abstract boolean queryUserExist(String userId);
-
-
//根据数据库查询数据查询判断
-
protected abstract boolean queryUserIllegal(String userId);
-
-
//根据数据库查询相关信息
-
protected abstract Map<String, String> getResultMap(String userId);
-
-
-
-
-
}
-
package GoodDesignPattern;
-
-
import java.util.HashMap;
-
import java.util.Map;
-
-
public class ABC extends CommonOpretion implements BankLoan {
-
-
//根据数据库查询是否存在,根据自己公司的用户表查询
-
-
public boolean queryUserExist(String userId){
-
return true; //return false;
-
}
-
-
//根据数据库查询数据查询判断
-
-
public boolean queryUserIllegal(String userId){
-
return true; //return false;
-
}
-
-
//根据数据库查询相关信息
-
-
public Map<String, String> getResultMap(String userId){
-
Map<String, String> map = new HashMap<String, String>();
-
-
map.put( "name", "詹姆斯"); //此处为了方便直接写死
-
map.put( "amount", "100000"); //应根据userId,在系统进行一系列判断计算,得出能借款金额,此处为了方便直接写死
-
map.put( "rankLevel", "A"); //应根据userId,在系统进行一系列判断计算,得出用户等级,此处为了方便直接写死
-
//.....其它一些列操作
-
-
return map;
-
-
}
-
-
-
}
-
package GoodDesignPattern;
-
-
import java.util.HashMap;
-
import java.util.Map;
-
-
public class ICBC extends CommonOpretion implements BankLoan {
-
-
//根据数据库查询是否存在,根据自己公司的用户表查询
-
-
public boolean queryUserExist(String userId){
-
return true; //return false;
-
}
-
-
//根据数据库查询数据查询判断
-
-
public boolean queryUserIllegal(String userId){
-
return true; //return false;
-
}
-
-
//根据数据库查询相关信息
-
-
public Map<String, String> getResultMap(String userId){
-
Map<String, String> map = new HashMap<String, String>();
-
-
map.put( "amount", "100000"); //应根据userId,在系统进行一系列判断计算,得出能借款金额,此处为了方便直接写死
-
map.put( "rankLevel", "A"); //应根据userId,在系统进行一系列判断计算,得出用户等级,此处为了方便直接写死
-
//.....其它一些列操作
-
-
return map;
-
-
}
-
-
-
}
这个时候每个银行又要实现抽象类,又要实现接口,他们感觉很麻烦且没有必要,这个时候中国银行又进行调整:
Version~0.3.0:
顶层接口还是不变,抽象类修改:由抽象类实现接口
-
package GoodDesignPattern;
-
-
import java.util.Map;
-
-
public abstract class CommonOpretion implements BankLoan{
-
-
-
public Map<String, String> loanOperation(String userId) {
-
-
//所有银行借款必须的校验
-
if(userId== null || userId.isEmpty()){
-
System.out.println( "userId为空!");
-
return null;
-
}
-
//所有银行借款必须的校验
-
if(userId.length()!= 32){
-
System.out.println( "userId格式错误,应该为32位!"+userId);
-
return null;
-
}
-
//所有银行借款必须的校验
-
if(!queryUserExist(userId)){
-
System.out.println( "用户不存在:"+userId);
-
return null;
-
}
-
//所有银行借款必须的校验
-
if(!queryUserIllegal(userId)){
-
System.out.println( "用户没有资格进行借款:"+userId);
-
return null;
-
}
-
-
//业务逻辑
-
Map<String, String> map = getResultMap(userId);
-
return map;
-
-
}
-
-
//根据数据库查询是否存在,根据自己公司的用户表查询
-
protected abstract boolean queryUserExist(String userId);
-
-
//根据数据库查询数据查询判断
-
protected abstract boolean queryUserIllegal(String userId);
-
-
//根据数据库查询相关信息
-
protected abstract Map<String, String> getResultMap(String userId);
-
-
-
-
-
}
-
package GoodDesignPattern;
-
-
import java.util.HashMap;
-
import java.util.Map;
-
-
public class ABC extends CommonOpretion {
-
-
//根据数据库查询是否存在,根据自己公司的用户表查询
-
-
public boolean queryUserExist(String userId){
-
return true; //return false;
-
}
-
-
//根据数据库查询数据查询判断
-
-
public boolean queryUserIllegal(String userId){
-
return true; //return false;
-
}
-
-
//根据数据库查询相关信息
-
-
public Map<String, String> getResultMap(String userId){
-
Map<String, String> map = new HashMap<String, String>();
-
-
map.put( "name", "詹姆斯"); //此处为了方便直接写死
-
map.put( "amount", "100000"); //应根据userId,在系统进行一系列判断计算,得出能借款金额,此处为了方便直接写死
-
map.put( "rankLevel", "A"); //应根据userId,在系统进行一系列判断计算,得出用户等级,此处为了方便直接写死
-
//.....其它一些列操作
-
-
return map;
-
-
}
-
-
-
}