abstract关键字
1.抽象类与抽象方法
- 随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。
- 有时将一个父类设计得非常抽象,以至于它没有具体的实例,只提供该顶层类的功能(只有顶层抽象方法声明,无方法体,由子类去实现具体功能)这样的类叫做抽象类
- 类的设计应该保证父类和子类能够共享特征。
2.案例
描述:计算几何图形的面积、周长。“几何图形”是模糊的,不确定的,故声明为抽象类,其功能为计算面积和周长,由于不知道具体是那种图形,故声明为抽象方法,由子类实现具体功能。
abstract class GeometricObject{ //几何图形
//面积(声明为抽象方法)
//周长(声明为抽象方法)
}
class Circle extends GeometricObject{ //圆
//面积(需要实现/重写父类中的抽象方法)
//周长(需要实现/重写父类中的抽象方法)
}
class Rectangle extends GeometricObject{ //矩形
//面积(需要实现/重写父类中的抽象方法)
//周长(需要实现/重写父类中的抽象方法)
}
3.abstract可以修饰:类、方法
-
abstract修饰类
- 此类称为抽象类
- 抽象类不能实例化
- 抽象类中是包含构造器的,因为子类对象实例化时,需要直接或间接地调用到父类的构造器(加载需要用到的属性、方法)
- 抽象类中可以没有抽象方法。反之,抽象方法所在的类,一定是抽象类【保证(非静态的)抽象方法不能被调用(因为无方法体),即保证不能有对象(即将类声明为abstract的)】
-
abstract修饰方法
- 此方法称为抽象方法
- 抽象方法只有方法的声明,没有方法体
- 抽象方法其功能是确定的(通过方法的声明即可确定),只是不知道如何具体实现(体现为没有方法体)
- 子类必须重写父类中所有的抽象方法,否则此子类仍然为抽象类
4.abstract不能使用的场景
-
abstract 不能修饰哪些结构
- 属性(无意义)
- 构造器(构造器需要有方法体供子类对象实例化)
- 代码块(无意义)
-
abstract 不能与哪些关键字共用?(自洽)
不能使用abstract修饰私有方法、静态方法、final方法、final类
- 私有方法不能重写
- 避免静态方法使用类进行调用
- final方法明确不能被重写
- final修饰的类不能有子类