抽象概念的引入是方便人们对事物的分类理解
面向对象的程序世界与现实世界是一致的。
Java表达抽象概念采用抽象类。
Java表达抽象行为能力用接口。
8.1.1 抽象类的定义
abstract class 类名称
{
成员变量;
方法(){……} //一般方法
abstract 方法(); //抽象方法
}
- 在抽象类中可以包含一般方法和抽象方法。
- 抽象类表示的是一个抽象概念,不能被实例化为对象。
- 抽象类具体应用时需要继承。
8.1.2 抽象类的应用
例8-1 定义一个代表“形状”的抽象类,其中包括求形状面积的抽象方法。继承该抽象类定义三角型、矩形、圆。 分别创建一个三角形、矩形、圆存入一个数组中,访问数组元素将各类图形的面积输出。
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 Test{
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() );//根据指向的具体对象求形状面积
}
}
例1:
abstract class MineBase {
abstract void amethod( );
static int i;
}
public class Mine extends MineBase{
public static void main(String argv[ ]){
int[ ] ar = new int[5];
for (i = 0;i < ar.length;i++)
System.out.println(ar[i]);
}
}
A.输出5个0;
B.编译错误: ar 未初始化就使用;
$C.编译错误: 抽象方法未在Mine中实现;
D.运行错误, i超出数组下标范围。
例2:
abstract class P{
public P() { System.out.println("parent"); }
abstract void m();
}
class S extends P {
public S() { System.out.println("child"); }
public static void main(String a[ ]) {
P x= new S();//用父类引用访问子类对象实例时,先执行父类构造方法,再执行子类的。
x.m();
}
void m()
{
System.out.println("m()");
}
}
/*
运行结果:
parent
child
m()
*/