抽象类当然可以实现接口,意义如下:一般来说使用普通类来实现接口时,这个普通类需要实现接口中的全部方法,这样会引起普通类中出现多余的方法,造成代码冗余。但如果我们使用抽象类来实现接口,那么这个抽象类只实现所需要的方法即可,并且当其他类继承这个抽象类时,仍然可以实现接口中有但是抽象类没有实现的方法。
举个简单栗子!
如以下代码,抽象类只是实现了接口A中的方法a,方法b,但是当类C继承抽象类B时,可以直接实现接口A中的c方法,有一点需要注意的时,类C中的方法a,方法b都是调用的父类B的方法a,方法b,不是直接实现接口的方法a,方法b。
/**
* 接口
*/
public interface A {
public void a();
public void b();
public void c();
}
/**
* 抽象类
*/
abstract class B implements A {
public void a(){
System.out.println("抽象类的a方法");
}
public void b(){
System.out.println("抽象类的方法");
}
}
/**
* 具体实现类
*/
public class C extends B {
public void a(){
System.out.println("具体类C的a方法");
}
public void b(){ super.b();}
public void c() {
//实现接口A的c方法
System.out.println("具体类C实现接口A的c方法");
}
}
public class test {
public static void main(String[] args) {
A demo = new C();
demo.a();
demo.b();
demo.c();
}
输出结果:
具体类C的a方法
抽象类的方法
具体类C实现接口A的c方法
项目实战--短信发送栗子
/**
* 短信对接接口
*/
public interface SendMessageService {
Boolean checkVerifyCode(String mobile, String verifyCode);
CorrectResponse sendVerifyCodeMessage(String mobile, String config);
SendMsgResponse sendMessage(String message, String mobile,String config);
}
抽象类实现两个通用的接口方法,供多个地区请求调用
/**
* 短信对接抽象类
*/
@Slf4j
public abstract class AbstractSendMessageService implements SendMessageService {
private static final int MESSAGE_MAX_LENGTH = 700;
private static final int MESSAGE_SUCCESS_LINE_NUM = 2;
private static final int VERIFY_CODE_VALID_TIME = 10;
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* 生成随机6位数字
*
* @return
*/
public String generateVerifyCode() {
StringBuilder str = new StringBuilder();
Random random = new Random();
for (int i = 0; i < 6; i++) {
str.append(random.nextInt(10));
}
return str.toString();
}
@Override
public Boolean checkVerifyCode(String mobile, String verifyCode) {
String value = stringRedisTemplate.opsForValue().get(mobile);
if (value == null) {
return Boolean.FALSE;
}
String[] valueSplit = value.split(",");
String correctCode = stringRedisTemplate.opsForValue().get(mobile);
return valueSplit[0].equalsIgnoreCase(verifyCode);
}
@Override
public CorrectResponse sendVerifyCodeMessage(String mobile, String config) {
String value = stringRedisTemplate.opsForValue().get(mobile);
JSONObject jsonObject = JSONObject.parseObject(config);
if (value != null) {
String[] valueSplit = value.split(",");
Long codeTime = Long.valueOf(valueSplit[1]);
if (System.currentTimeMillis() - codeT