实例说明
对于每个几何图形而言,都有一些共同的属性,如名字和面积等,而其计算面积的方法却各不相同。为了简化开发,本实例将定义一个超类来实现输出名字的方法,并使用抽象方法来计算面积。
实现过程
创建一个抽象类,名称为Shape。在该类中定义两个方法,一个是getName(),用于使用反射机制获得类名称;另一个是抽象方法getArea(),并未实现。
Shape.java
public abstract class Shape {
public String getName() { //获得图形的名称
return this.getClass().getSimpleName();
}
public abstract double getArea(); //获得图形的面积
}
再创建一个名称为Circle的类,该类继承自Shape,并实现了抽象方法getArea()。在该类的构造方法中,获得了圆形的半径,用于在getArea()中计算面积。
Circle.java
public class Circle extends Shape {
private double radius; //圆形的半径
public Circle(double radius) {
this.radius = radius;
}
@Override
public double getArea() { //计算圆形的面积
return Math.PI * Math.pow(radius, 2);
}
}
再创建一个名称为Rectangle的类,该类继承自Shape,并实现了抽象方法getArea()。在该类的构造方法中,获得了矩形的长和宽,用于在getArea()中计算面积。
Rectangle.java
public class Rectangle extends Shape {
private double length; //矩形的长
private double width; //矩形的宽
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
@Override
public double getArea() { //计算矩形的面积
return length * width;
}
}
再创建一个名称为Test的类,用于进行测试,在该类中创建Circle和Rectangle对象,并分别输出图形的名称和面积。
Test.java
public class Test {
public static void main(String[] args) {
Circle circle = new Circle(1); //创建圆形对象并将半径设置为1
System.out.println("圆形的名称是:" + circle.getName());
System.out.println("圆形的面积是:" + circle.getArea());
Rectangle rectangle = new Rectangle(1, 1); //创建矩形对象并将长和宽设置为1
System.out.println("矩形的名称是:" + rectangle.getName());
System.out.println("矩形的面积是:" + rectangle.getArea());
}
}
在抽象类中,可以定义抽象方法(使用关键字abstract修饰的方法),也可以定义普通方法。包含抽象方法的类必须是抽象类,而抽象类不是必须包含抽象方法。对于抽象方法而言,仅定义一个声明即可,即抽象方法是没有方法体的。
编译运行
技术要点
本实例应用的主要技术就是抽象类。下面对抽象类进行介绍。
在设计类的过程中,通常会将一些类所具有的公共属性和方法移动超类中,这样就不必重复定义了。然而这些类的超类却经常没有实际意义。通常将它设置成抽象的,这样可以避免创建该类的对象。声明一个最简单的抽象类的代码如下:
public abstract class Shape{}
参数说明
Shape:抽象类的类名。
抽象类是不能直接实例化的,如果要获得该类的实例可以使用静态方法创建其实现类对象。
疑问
抽象类与接口的区别?