1.抽象类
抽象类表示抽象程度比较高而无法直接通过new来创建实例的类,抽象类使用abstract修饰。抽象类可以包含普通的属性和方法,还可以包含抽象方法(当然也可以不包含)。
抽象方法使用abstract修饰,没有方法体,方法声明结尾是分号,抽象方法的具体实现留在子类中。
public abstract class AbstractClass { private int value; public void method() { System.out.println(value); } public abstact void setValue(); //抽象方法 }
子类继承抽象类后,可以实现抽象方法,也可以不实现。如果子类中包含抽象方法,则该子类也要声明为abstract类。也就是说如果子类继承自抽象类,并且子类不想再成为抽象类,则子类必须实现抽象父类中的所有抽象方法,即使某些方法子类用不上。
父类不是一个抽象类,子类也可以添加新的抽象方法而成为抽象类。
虽然抽象类不能直接new实例对象,但抽象类仍然可以作为类型而声明一个对象。
abstract class Parent { private String name; public abstract void setName(); } class Child extends Parent { public void setName() { name = "Child"; } } public class Test { public static void main(String[] args) { Parent parent = new Child(); // 声明一个Parent类型的变量 parent.setName(); } }
2. 接口
接口是一种比抽象类更加抽象也更加灵活的类型,接口也不能直接new实例对象,并且接口中只能包含常量和抽象方法。
public interface MyInterface { method(); }
和抽象类一样,虽然不能直接new接口实例对象,但接口也是可以作为类型来声明对象。
接口中的所有属性都默认使用public final static来修饰,接口中的所有方法都默认使用public abstract来修饰,在接口中就可以省去这些修饰符。
子类使用implements关键字表示实现某个接口,在子类中必须实现接口中的所有方法,即使某些方法用不上。
3. 抽象类与接口的区别
接口比抽象类更加抽象,只能包含常量和抽象方法。抽象类可以包含普通属性和普通方法;
接口比抽象类灵活,一个类可以实现多个接口,但一个类最多只能继承自一个抽象类 ,Java中使用接口来实现多继承的功能;
子类与抽象父类的关联性更强,是"is-a"的关系,子类与接口之间的关联性较弱,是"is-kind-of"的关系。
参考资料 《Java核心技术》