Java 抽象类和抽象方法

本文最后更新于: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]; // 定义Shape类型的数组。
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循环中访问数组元素,实际上使用父类引用去访问具体的子类对象的方法,这种现象称为运行时多态性。

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!