抽象类的特性:
- 抽象类不能直接实例化对象
- 抽象方法不能被private、final、static修饰的
- 抽象类必须被继承,并且继承后子类必须要重写父类中的抽象方法,否则子类也是抽象类,必须使用abstract修饰
- 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
- 抽象类中可有构造方法,供子类创建对象时,初始化父类的成员变量
解释:
- 虽然抽象类不能直接实例化对象,意味着不能像正常类一样可以通过new关键字创建。但是可以通过子类调用抽象类的构造函数进行初始化
- private 修饰的成员方法在类外是不能访问的,而抽象方法需要子类进行重写。final修饰的方法甚至不能重写,所以也不行。static 也是一样的道理
- 在多重继承关系下,抽象类始终需要一个子类重写抽象方法。比如抽象类A中有抽象方法,并且A为B的父类,但是在B中没有实现A中的抽象方法;这种情况下必须将B设为抽象类,还需要用一个B的子类C重写这个抽象方法
抽象类存在的意义:抽象类存在的意义就是为了被继承,那么普通类也可以被继承,为什么还需要抽象类?
在使用抽象类的时候有许多约束:比如抽象方法必须被重写。在运用多态的时候,一些场景下必须使用子类的,而非父类的;如何不小心误用父类的了,编译器是不会报错的;但是在父类实例化的时候会报错,提前发现问题。这样抽象类就拥有了预防出错的作用。
接口的特性:
- 接口中的成员变量默认是public static final、成员方法默认是public abstract;一般情况下不写
- 接口当中方法不能在接口中心实现,只能由实现接口的类实现
- 注意重写接口中的方法是不能是默认访问权限,因为接口中的方法访问权限是public
- 接口中不能有构造方法和代码块
- 接口不能听过new关键字进行实例化
- 一个接口也会产生独立的字节码文件
- 在jdk8之后,可以在接口中定义default方法,并且可以有具体实现