abstract修饰符
- 用abstract修饰的类叫做抽象类,抽象类不能被实例化
- 用abstract修饰的方法叫做抽象方法,抽象方法没有方法体
抽象类的规则:
1、抽象类可以没有抽象方法,但有抽象方法的类必须是抽象类;
2、抽象类的子类没有重写实现父类的所有抽象方法(当然可以实现为空,即方法体为空),则子类必须被定义为抽象类;
abstract class Base{
abstract void method1();
abstract void method2();
}
class Sub extends Base{ //编译出错,Sub类没有实现父类的所有抽象方法,必须被定义为抽象类
void method1(){
System.out.println("method1");
}
}
3、抽象类可以有构造方法,但不能是抽象构造方法;
abstract class Base{
abstract void Base(); //编译出错,构造方法不能是抽象的
}
4、抽象类可以有静态方法,但是没有静态抽象方法;
abstract class Base{
abstract void Base(); //编译出错,构造方法不能是抽象的
static abstract void method1(); //编译出错,不能有抽象静态方法
static void method2(); //可以有静态方法
}
5、抽象类和抽象方法不能被final修饰符修饰,因为抽象方法必须有子类实现,而final不允许有子类,不能被子类方法覆盖;abstract 与 final不能连用
为什么抽象类不允许被实例化?
1、在语义上
抽象类表示从一些具体类中抽象出来的类型,例如苹果类,香蕉类是具体类,水果类是抽象类。自然界并不存在水果类本身的实例。苹果对象是水果对象,香蕉对象也是水果对象。
- 当父类是具体类时,父类的对象包括父类本身的对象和所有子类的具体对象;
- 当父类是抽象类时,父类的对象包括所有具体子类的对象;
因此,所谓的不能被实例化,是指不能创建抽象类本身的实例。
2、在语法上
假如可以创建抽象类本身的实例,因为method2() 方法是抽象方法,没有方法体,所有无法执行。因此,java编译器不允许创建抽象类的实例。
abstract class Base{
public void method1(){ //普通方法
}
public abstract void method2(); //抽象方法
}
Bsse base = new Base();//假使java编译器没报错
base.method1();
base.method2();//运行时java虚拟机无法执行这个方法