一、从类关键字方面
抽象类使用的是abstract关键字修饰类,而接口使用的是interface。
//class前面使用abstract修饰
public abstract class AbstractClassTest {
}
//只是用interface修饰
public interface InterfaceTest {
}
二、从成员变量方面
接口的成员变量默认是 public final static的,所以一定要进行初始化
//错误:不能是protected的访问级别成员变量的访问级别不能是protected、private
public interface Father {
protected int age =1;//不能是protected的访问级别
private String name = "abc";//不能是private的访问级别
public void sayHello();
}
//正确:接口中的成员变量默认的访问级别是public的,且是常量,这里不管我们在变量前面加不加final static,都是常量
public interface Father {
int age =1;
String name="abc";
public void sayHello();
}
不能包含静态代码块,否则会出现编译错误
//错误包含静态代码块
public interface Father {
static{
System.out.println("接口中不能有静态代码块");
}
public void sayHello();
}
抽象类的成员变量可以是static 类型的、final、final static类型的、且访问级别可以是public、protected、private;同时可以包含静态代码块。
public abstract class Human {
public static int age;
private String name;
protected final static int GENDER =0;
static{
System.out.println("我是一个Human");
}
}
三、从构造器层面
抽象类实例构造器,而接口没有实例构造器init
//错误:接口中不允许有实例构造器
public interface Father {
public void sayHello();
public Father(){
}
}
//正确:抽象类有实例构造器
public abstract class Human {
public Human(){
}
}
抽象类和接口都有类构造器clinit。但是这两者类构造器执行的时间是不同的,抽象类的构造器如果子类开始执行初始化,那么必须先执行父类的类构造器,但是接口只有在使用接口的成员变量时才会执行类构造器。
总结
四、从方法层面来讲
抽象类的方法可以有一个或多个抽象方法或者没有抽象方法,抽象方法没有具体的实现,方法由abstract修饰,访问级别是public和protected的。
public abstract class Human {
abstract protected void sayHello();
abstract void hunt();//默认public
}
接口中的方法访问级别只能是public的(不用加public,默认是public),不能是protected和private的。
//错误:接口中的方法访问级别不能是protected和private的
public interface Father {
int age =1;
protected void sayHello();
private void work();
}
//正确:接口中的方法访问级别只能是public的(不用加public,默认是public)
public interface Father {
int age =1;
void sayHello();
void work();
}
五、从继承和实现的角度来看
一个类可以实现多个接口,而只能继承一个抽象类
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
接口与接口之间采用继承的方式
public interface Set<E> extends Collection<E>
六、 从创建对象的角度来看
抽象类和接口都不能创建对象
七、总结
- 从类与类之间的关系:抽象类是一类物体的属性和行为的对象,子类和父类的关系是is-a的关系;而接口表示一类食物的行为的抽象,子类与接口之间的关系是is-a的关系
- 从类关键字层面:抽象类使用的是abstract关键字修饰类,而接口使用的是interface。
- 从成员变量的层面:接口中的成员变量默认final static修饰的,也就是常量,而且访问级别只能是public的,不能有静态代码块;对于abstract类变量可以是static、final static、final、或者一般的成员变量、而且访问级别可以是private、protected、public的。
- 从构造器层面来讲:抽象类有实例构造器,而接口没有实例构造器;抽象类和接口都有类构造器clinit。但是这两者类构造器执行的时间是不同的,抽象类的构造器如果子类开始执行初始化,那么必须先执行父类的类构造器,但是接口只有在使用接口的成员变量时才会执行类构造器。
- 从方法的层面来讲:抽象类的方法可以有一个或多个抽象方法或者没有抽象方法,抽象方法没有具体的实现,方法由abstract修饰,访问级别是public和protected的。接口中的方法访问级别只能是public的(不用加public,默认是public),不能是protected和private的。当然不管是抽象类还是接口的方法都不能被final和static关键字修饰
- 从类继承和实现的:一个类只能继承一个abstract类,但是可以实现多个接口,也就是多实现单继承。普通类、抽象类实现接口采用的是implements关键字,而子类继承父类使用的是extends关键字。
- 从创建对象来说:抽象类和接口都不能创建实例对象。