- 抽象方法:基类中定义的方法,有时候只有在派生类中才能写出方法体。
- 抽象方法声明格式: [修饰符] abstract 返回值类型 方法名([形式参数表]);
- 抽象方法的特点
- 抽象方法的返回值类型前有关键字abstract;
- 抽象方法没有方法体;
- 抽象方法的定义是一行单独语句,以分号结束;
- 在抽象方法声明中使用static修饰符是错误的。
例如,public abstract double area();
- 抽象类:定义了抽象方法,这个类必须定义为抽象类。
- 声明格式:[public] abstract class 类名{
//类体(属性、非抽象方法、抽象方法、构造方法)
//类体(初始化块、内部类、枚举类)
} - 特点:
- 抽象类不能创建自己的对象,使用new创建抽象类对象将产生错误。
- 子类继承抽象类时,应该覆盖抽象类中的所有抽象方法,否则子类也必须定义为抽象类。
- 构造方法不用于创建实例,用于被其子类调用
- 含有抽象方法的类(直接定义抽象方法;继承抽象父,但没完全实现父包含的抽象方法)只能被定义成抽象类。抽象类中却并一定包含抽象方法。
- 声明格式:[public] abstract class 类名{
- 抽象方法和空方法体的方法不是同一个概念 public void test(){}
- public abstract void test();是一个抽象方法,它根本没有方法体,即方法定义后面没有一对花括号
- public void test(){} 一个普通方法,定义了方法体,只是方法体为空,因此这个方法不可以使用abstract来修饰
public abstract class Shape{//抽象类不能实例化 { private static double calcArea();//抽象方法 private Shape(){} public Shape(String name){ System.out.println(name+"Shape Created"); } public String toString(){ return "this is shape" } } public class Circle extends Shape{ { public float r; private final float P1 = 3.14; public Circle(String name,float r){ super(name); this.r=r; } public double calcArea(){//子类Circle,必须重写Shape类中的抽象方法 ,否则Circle就是一个抽象类 return P1*r*r; } public class Rectangle extends Shape{ { public float width; public float height; public Rectangle(String name,float width,float height){ super(name); this.width = width; this.height = height; } public double calcArea(){ return width*height; } public static void main(String[] args){ Shape s1 = new Circle("圆形,32.5f"); Shape s2 = new Rectangle("矩形,3,5"); System.out.println(s1.calcArea); System.out.println(s2.cilcArea); }
-
注意:
-
final和abstract永远不能同时使用。
-
abstract不能用于修饰属性、局部变量、饰构造方法,。抽象类里定义的构造方法只能是普通构造方法。
-
static和abstract不能同时修饰某个方法,即没有所谓的类抽象方法。
-
abstract关键字修饰的方法必须被其子类重写才有意义,否则这个方法将永远不会有方法体,因此abstract方法不能定义为private访问权限。
-
-
抽象类的作用
-
代码重用--子类可以重用抽象父类中的属性和非抽象方法;
-
规划--抽象类中通过定义抽象方法规划了其所有子类必须要实现的功能。
-
模板模式:抽象类作为多个子类的通用模板,子类在抽象类的基础上扩展、改造,但子类总体上会保留抽象类的行为方式。
-
抽象类不能实例化,但抽象类可作为变量的类型和方法形参类型,可将抽象类子类的对象赋给该变量或做方法的实参。
Shape s=new Rectangle(); public static String ShowShapinfo(Shape item){ if(item instanceof Rectangle){ Rectangle r=(Rectangle)item; //其他代码 } }
-