Java面向对象编程有三大特性,它们是封装、继承和多态。
封装: 封装将复杂的功能封装起来,对外开放一个接口,简单调用即可
继承: 让类与类之间产生关系,为多态打下基础
多态: 子类对象可以赋值给父类变量,但运行是仍表现出子类的行为特征
抽象和接口
从定义上来讲:
| 定义 | abstruct class className | interface className |
| 构造方法 | 有 | 无 |
| 成员变量 | 有 | 无 |
| 静态成员变量 | 有 | 有( 默认即为public static final类型 ) |
| 方法是否必须为抽象 | 否 | 是( 默认即为public abstract类型 ) |
| 静态方法 | 有 | 无 |
从使用上来讲:
继承抽象(单) 实现接口(多)
接口一般用于系统架构设计,定义系统通信之间的契约
抽象则是在代码重用方面发挥作用,如
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public abstract class BaseServlet extends HttpServlet {
// 重用
public final void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
//记录访问日志
// 进行权限判断
if (具有权限) {
try {
doService(request, response);
} catch (Exception e) {
记录异常信息
}
}
}
// 定义为抽象,子类去实现。
// 注意访问权限定义成protected,显得既专业,又严谨,因为它是专门给子类用的
protected abstract void doService(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException;
}
/*
* 子类只关心自己的业务逻辑, 实现父类的抽象方法(必须实现,否则报错)
*/
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class MyServlet1 extends BaseServlet {
protected void doService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
本Servlet只处理的具体业务逻辑代码
}
}
再比如实现一个缓存 cache, 不管是文件缓存,数据库缓存,Redis缓存。都会涉及到存入和取出。
那么就可以定义一种规范
/*
* 大家按照规范来,结构一目了然,避免了混乱无序
*/
interface Cache {
public void set();
public void get();
}
class Redis implements Cache{
//set
//get
}
来源:oschina
链接:https://my.oschina.net/u/4031296/blog/4340065