java abstract修饰符

来源:互联网 发布:淘宝赚钱方法 编辑:程序博客网 时间:2024/04/24 02:01

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虚拟机无法执行这个方法