1.抽象类
抽象类用abstract来修饰,例如:
package com.test.abstractaaa;
public abstract class TestAbstract {
}
抽象类是用来捕捉子类的通用性的,它不能被实例化,只能用作子类的超类,抽象类是被用来创建继承层级里子类的模板,例如JDK中的GenericServlet类中部分代码:
public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable{
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
public void init() throws ServletException {}
public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
public void destroy() {}
}
当HttpServlet继承GenericServlet时,HttpServlet实现了GenericServlet类中的service方法
public abstract class HttpServlet extends GenericServlet
{
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{ //...
}
}
2.接口
接口是抽象方法的集合,如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法,就像契约模式,如果实现了这个接口,那么就必须保证使用这些方法,并且实现这些方法,接口是一种形式,接口自身不能做任何事情,接口里面的方法默认都是abstract的,以Externalizable接口为例:
public interface Externalizable extends java.io.Serializable {
void writeExternal(ObjectOutput out) throws IOException;
void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
}
当实现这个接口时,就要实现它里面的两个方法:
public class ExteImpl implements Externalizable {
@Override
public void writeExternal(ObjectOutput out) throws IOException {
// TODO Auto-generated method stub
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
// TODO Auto-generated method stub
}
}
2.抽象类和接口的比较
2.1 设计层面上的区别
a. 抽象类是对一种事务的抽象,是对整个类进行抽象,包括属性,行为(方法)。接口是对行为(行为)的抽象。如果一个类继承或实现了某个抽象类,那么一定是抽象类的种类(拥有同一种属性或行为的类)。
b. 设计层面不同,抽象类作为很多子类的父类,是一种模板设计,而接口是一种规范,它是一种辐射式设计,也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象方法中添加实现,子类可以不用变更,
而对于接口不行,如果接口进行了变更,那么实现它的类都需要做变更。
2.2 接口和抽象类分别在什么时候使用
a. 如果拥有一些方法,并想让他们中的一些有默认的具体实现,请选择抽象类
b. 如果想实现多重继承,那么请使用接口,由于java不支持多继承,子类不能继承多个类,但一个类可以实现多个接口,因此可以使用接口来解决。
c. 如果基本功能在不断变化,那么就使用抽象类,如果使用接口,那么每次变更都需要相应的去改变实现该接口的所有类。
2.3 JDK8 中接口的默认方法和静态方法
JDK8中,Oracle引入默认方法和静态方法,用来减少抽象类和接口的差异,可以在接口中提供默认的实现方法并实现该接口的类不用强制去实现这个方法。JDK8中接口的静态方法只能通过接口名直接去调用,接口中的默认方法因为不是abstract的,所以可重写,也可以不重写。