抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
对于包含抽象方法的类,,必须加上abstract关键字表示这是一个抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
注意事项
(1) 抽象类不能直接实例化。
(2) 抽象方法不能是 private 的。
(3) 抽象类中可以包含其他的非抽象方法,,也可以包含字段。这个非抽象方法和普通方法的规则都是一样的,可以被重写,也可以被子类直接调用。
抽象类的作用
抽象类由于无法实例化对象,所以存在的最大意义就是为了被继承。抽象类本身不能被实例化,要想使用,只能创建该抽象类的子类。然后让子类重写抽象类中的抽象方法。使用抽象类相当于多了一重编译器的校验。
接口
接口是抽象类的更进一步。抽象类中还可以包含非抽象方法和字段。而接口中包含的方法都是抽象方法, 字段只能包含静态常量。接口是解决Java无法使用多继承的一种手段。
注意事项
(1)使用 interface 定义一个接口。
(2)接口中的方法一定是抽象方法, 因此可以省略 abstract。
(3)接口中的方法一定是 public,因此可以省略 public。
(4)在调用的时候同样可以创建一个接口的引用, 对应到一个子类的实例。
(5)接口不能单独被实例化。
(6)接口中只能包含抽象方法。对于字段来说, 接口中只能包含静态常量(final static)。
接口的作用
Java 中只支持单继承,一个类只能 extends 一个父类。但是可以同时实现多个接口,也能达到多继承类似的效果。
抽象类和接口的区别
(1)核心区别:抽象类中可以包含普通方法和普通字段,这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中不能包含普通方法,子类必须重写所有的抽象方法。
(2)类可以实现很多个接口,但是只能继承一个抽象类。
(3)接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是如果它包含main方法的话是可以被调用的。
(4)类可以不实现抽象类和接口声明的所有方法,在这种情况下,类也必须得声明成是抽象的。
(5)java接口中声明的变量默认都是final的,抽象类可以包含非final变量。
(6)抽象类中的成员函数可以是private,protected或者是public的,但java接口中的成员函数默认都是public的。