抽象类:

1、抽象类和普通类的主要有三点区别:

1. 抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。

2. 抽象类不能用来创建对象;

3. 如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

2、抽象类中的抽象方法(其前有abstract修饰)不能用private、static、synchronized、native访问修饰符进行修饰。

原因如下:

1. 抽象方法没有方法体,是用来被继承的,所以不能用private修饰;

2. static修饰的方法可以通过类名来访问该方法(即改方法的方法体),抽象方法用static修饰没有意义;

3. 使用synchronized关键是为该方法加一个锁。而如果该关键字修饰的方法是static方法,则使用的锁就是class变量的锁。如果是修饰类方法,则用this变量锁。但是抽象类不能实例化对象,因为该方法不是在该抽象类中实现的。是在其子类实现的。所以,锁应该归其子类所有。所以,抽象方法也就不能用synchronized关键字修饰了;

4. native 这个东西本身就和abstract冲突,他们都是方法的声明,只是一个把方法的实现移交给子类,另一个是移交给本地操作系统。如果同时出现,就相当于即把实现移交给子类,又把实现移交给本地操作系统,那到底谁来实现具体方法呢? 

接口:

1、接口是一种特殊的抽象类,接口中的方法全部是抽象方法(但当前的abstract关键字可以省略),所以抽象类的抽象方法不能用的访问修饰符这里也不能用。而protected访问修饰符也不能用,因为接口可以让所有类去实现(非继承),不只是其子类,但是要用public进行修饰。接口可以去继承一个已有的接口。

2、接口中的变量默认是public static final的,方法默认是public abstract的。

两者的区别:

1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。