相同点
1,含有abstract修饰符的class即为抽象类,abstract类不能创建实例对象。interface 也不能创建实例对象。
2,含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。interface中的所有方法必须是抽象的。abstract class类中定义抽象方法必须在具体的子类中实现。interface和abstract class都不能有abstract static方法。
3,子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
不同点
1,抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以是任意,但是接口中的方法只能是public static final类型,默认即为public static final类型。interface中的成员变量必须都是public类型,可以不是静态类型。
2,抽象类中可以有非抽象构造方法,但是抽象类还是不能实例化,也就是抽象类有构造方法不等于它可以实例化,interface中不能有构造方法。
如下是抽象类可以有构造方法的一个验证:
class AbstractTest {
public AbstractTest() {
System.out.println("Abstract");
}
}
public class ExtendAbstract extends AbstractTest{
public ExtendAbstract() {
System.out.println("ExtendAbstract");
}
public static void main(String[] args) {
ExtendAbstract extendAbstract = new ExtendAbstract();
}
}
输出的结果为:
3,抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是public型的抽象方法。
4,抽象类中的抽象方法的访问类型可以是public,protected,default(有的文章说是不能是default,但是我刚才试了一下是可以的)。接口中的方法只能是public abstract。
贴出不同访问类型的作用域。
可见/访问性 在同一类中同一包中不同包中 同一包子类中 不同包子类中
5,抽象类中可以包含非抽象的静态方法,接口中不能包含静态方法。
6,一个类可以实现多个接口,但只能继承一个抽象类
参考文章:
http://wenku.baidu.com/link?url=Mq1Z0rA3fKlX54EurSxmyFCJfs5eAfRK2H7Zrg5pUKreu7J3JcTE4hlrTIe4VZFEgxFz6CX5uvh2Xzum3KkfZmqxVVsnR64ldACHMfY-g9G