本文最后更新于:2024年3月18日 凌晨
Java 抽象类和抽象方法
抽象类的定义
- 抽象类代表着一种优化了的概念组织方式,抽象类用来描述事物的一般状态和行为,然后在其子类中再去实现这些状态和行为,以适应对象的多样性。
- 抽象类用abstract修饰符修饰,具体定义形式如下:
1 2 3 4 5
| abstract class 类名称{ 成员变量定义; 方法(){...} abstract 方法(); }
|
- 抽象类只能被继承,不能被实例化,抽象类的抽象方法是虚方法。
- 抽象类可以继承抽象类或普通类。
- 抽象类中的抽象方法必须被实现,如果一个子类没有实现父类中的抽象方法,则子类也成为了一个抽象类。
- 抽象类中的普通方法,可以不必实现。
- Java类库中的很多类被设计为抽象类,例如,Java中Number类是一个抽象类,它只表示"数字"这一抽象概念,只有其子类Integer和Float等才能创建具体对象,GUI编程中的Component也是一个抽象类,它定义所有图形不见的公共特性,但不具体实现,在其子类中提供具体实现。
抽象类的应用
[例8-1]:定义一个代表"形状"的抽象类,其中包括求形状面积的抽象方法,继承该抽象类定义三角形,矩形,圆,分别创建一个三角形,矩形,圆存入一个数组中,访问数组元素将各类图形的面积输出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| abstract class Shape { abstract public double area(); }
class Triangle extends Shape { private double a, b, c;
public Triangle(double a, double b, double c) { this.a = a; this.b = b; this.c = c; }
public double area() { double p = (a + b + c) / 2; return Math.sqrt(p * (p - a) * (p - b) * (p - c)); } }
class Rectangle extends Shape{ private double width,height;
public Rectangle(double j,double k){ width=j; height=k; }
public double area(){ return width*height; } }
class Circle extends Shape{ private double r;
public Circle(double r){ this.r=r; }
public double area() { return Math.PI*r*r; } }
public class Ex8_1{ public static void main(String[] args) { Shape s[]=new Shape[3]; s[0] = new Triangle(25,41,50); s[1] = new Rectangle(15,20); s[2] = new Circle(47); for (int k=0;k<s.length;k++) System.out.println(s[k].area()); } }
|
- 在抽象类Shape中定义的抽象方法
area()
在各具体子类中均要具体实现,在类Ex8_1中创建一个Shape类型的数组,将所有通过子类创建的对象存放到该数组中,即用父类变量存放子类对象的引用,在for循环中访问数组元素,实际上使用父类引用去访问具体的子类对象的方法,这种现象称为运行时多态性。