抽象类
(1)抽象类就是由abstract修饰的class,它一定是一个父类,因为需要子类重写后才能对子类实例化。abstract修饰的方法叫做抽象方法;
(2)抽象方法可以不在抽象类中实现,但是一定要在子类中重写并实现;
public abstract class A {
public abstract void work();
}
class B extends A{ //发生报错
}
class C extends A{ //不发生报错
public void work(){
}
}
(3)只有抽象类才能有抽象方法,普通类中不能有抽象方法;
class A {
public abstract void work(); //发生报错
}
(4)抽象类中不一定全是抽象方法,也可以用普通方法,子类不会被强制重写普通方法,但是一定在抽象类中必须是实现好的;
public abstract class A {
public abstract void work();
public void run(){
}
}
class B extends A{ //不发生报错
public void work(){
}
public void run(){
}
}
class C extends A{ //不发生报错
public void work(){
}
}
(5)抽象类不能被实例化,但是可以使用多态;
public abstract class A {
}
class B extends A{ //不发生报错
}
class C{
public static void main(String[]args){
C c = new C(); //不发生报错
B b = new B(); //不发生报错
A a = new A(); //发生报错
A b1 = new B(); //不发生报错
}
}
(6)final不能同时和abstract出现在一个方法上,因为final修饰的方法不能被重写,而abstract强制要求子类重写修饰的方法;
public abstract class A {
public final abstract void work(); //发生报错
public final void run(){ //不发生报错
}
}
(7)private不能修饰abstract修饰的方法,因为private方法对子类不可见,所以无法被重写,一般默认是public修饰;
public abstract class A {
private abstract void work(); //发生报错
private void run(){ //不发生报错
}
}
(8)抽象方法不能用static,static是针对类层次,抽象方法是针对对象层次的,所以不能一起使用;
(9)子类继承抽象类后,如果不想实现抽象类的抽象方法,那么该类必须是个抽象类;
public abstract class A {
public abstract void work();
}
class B extends A{ //发生报错
}
abstract class C extends A{ //不发生报错
}
(10)抽象类可以有构造方法,目的是在初始化子类之前先初始化父类,例如有一个抽象类A,有一个A的子类B,如果要创建一个B类型的对象,那么在new子类构造器之前肯定需要先new父类构造器,这时候就需要抽象类的构造方法了;
public abstract class A {
A(){}
}
class B extends A{
}
class C{ //不发生报错
public static void main(String[]args){
A a = new A(); //发生报错
B b = new B(); //不发生报错
}
}