一、抽象类
尽量不要直接继承实现好的类,而要继承抽象类或者实现接口
普通类无法强制要求子类覆写方法,因此产生抽象类与接口。
1.抽象类的定义与使用
抽象方法:使用abstract关键字定义并且没有方法体的方法,抽象方法所在的类就是抽象类
public abstract void print();
- 抽象类就是比普通类多了一些抽象方法(抽象方法可以有0~N个)而已(抽象类就是普通类的超集)
- 抽象类使用abstract关键字定义
- 因为抽象类中含有抽象方法,抽象方法没有方法体,因此抽象类不能产生实例化对象(抽象类是个半成品,无法直接使用)
没有方法体的方法不一定就是抽象方法,本地方法就是例外:
本地方法(调用C语言或者其他语言同名方法):在java中声明,在C语言中实现
public native void test();
2.抽象类使用原则
- 所有抽象类必须有子类(abstract与final 不能同时出现,若同时出现则在编译时报错)被final修饰的类不能有子类(终结器);
- 当抽象类的子类不是抽象类时,抽象类的子类必须覆写抽象类的所有抽象方法;
- 抽象类可以使用子类向上转型为其实例化,抽象类一定不能直接实例化对象(无论是否有抽象方法);
- 由于抽象类强制要求子类覆写抽象方法,因此abstract与private 不能一起使用。
3.抽象类的相关规定
3.1*抽象类也存在构造方法,并且子类也一定按照实例化流程,先调用抽象类的构造方法而后再调用子类构造方法。
3.2抽象类可以不定义任何抽象类方法,但此时仍然无法直接实例化对象
3.3
- final与abstract 不能同时出现
- private与abstract也不能同时出现
3.4
*
抽象类也分为外部抽象类与内部抽象类。
*
内部抽象类的抽象方法与外部抽象类的抽象方法无关。
*
当前直接继承哪个抽象类,就覆写其抽象方法(若直接继承外部抽象类,则只需覆写外部抽象类的所有抽象方法即可)