一、抽象的概念
生活中有很多概念是抽象的,与之对应的是具体事物。
例如:
抽象概念 | 具体事物 |
形状 | 三角形、矩形、圆形等 |
车辆 | 公交车、火车、小汽车等 |
二、抽象类的声明
以形状(Shape)为例:
package com.yg.abs;
//使用abstract修饰的类称为抽象类
public abstract class Shape {
protected double area;//抽象类可以定义变量
/**
* 使用abstract修饰的方法称为抽象方法,没有方法体
* 没有确定具体形状前,不可能求得了面积。
* 所以先声明为抽象方法,让具体的子类去实现
*/
public abstract double getArea();
//抽象类也可以有非抽象方法
public void print()
{
System.out.println("形状");
}
}
具体的矩形类,继承Shape类:
package com.yg.abs;
//矩形
public class Rectangle extends Shape{
double w;//底
double h;//高
public Rectangle(double w, double h) {
super();
this.w = w;
this.h = h;
}
//必须重写父类抽象方法
@Override
public double getArea() {
// TODO 自动生成的方法存根
return w * h;
}
}
具体的三角形类,继承Shape类
package com.yg.abs;
public class Triangle extends Shape{
double w;//底
double h;//高
public Triangle(double w, double h) {
super();
this.w = w;
this.h = h;
}
@Override
public double getArea() {
// TODO 自动生成的方法存根
return w * h /2;
}
}
形状测试类:
package com.yg.abs;
public class ShapeTest {
public static void main(String[] args) {
// TODO 自动生成的方法存根
//Shape s = new Shape();//会报错,因为抽象类不可以实例化
Shape shape = new Rectangle(5,6);//引用子类实例
double area = shape.getArea();//会调用矩形的求面积方法
System.out.println(area);
shape = new Triangle(5,6);//引用另一个子类实例
area = shape.getArea();//会调用三角形的求面积方法
System.out.println(area);
}
}
三、抽象的意义
方便构建对象体系,利于程序的扩充。越抽象,越能体现事物的本质。
上述例子,如果需要求圆形面积,只需要新增圆形类继承Shape类并实现抽象方法。
测试类让Shape类引用圆形实例即可,无须改动其它地方。
四、注意事项
1. 有抽象方法的类一定要声明为抽象类
2. 抽象类可以有非抽象方法
3. 抽象类的子类可以是抽象类也可以是非抽象类
非抽象子类必须实现父类的抽象方法。
4. 抽象类不可以实例化,因为抽象和实例本来就是相对的概念。