抽象方法
被abstract修饰的实例方法
- 只有方法申明,没有方法实现(参数列表后面没有大括号,而是分号)
- 不是用private修饰权限(因为定义抽象方法的目的是让子类去实现)
- 只能定义在抽象类、接口中
抽象类
被abstract修饰类
- 可以定义抽象方法
- 不能实例化,但可以自定义构造方法
- 子类必须实现抽象类中的所有抽象方法(除非子类也是一个抽象方法)
- 可以像非抽象类一样定义成员变量、常量、嵌套类、初始化块、非抽象方法等
抽象类使用场景
如果A类和B类中都有公共的部分,可以把这部分抽取为一个抽象类,然后A类和B类继承这个抽象类。
示例:假设需要求圆形和长方形的面积和周长。
- 创建一个图形(Shape)抽象类,包含面积,周长成员变量和计算的抽象方法
public abstract class Shape {
//名字
private String name;
//面积
protected double area;
//周长
protected double girth;
public Shape(String name) {
this.name = name;
}
public double getArea() {return area;}
public double getGirth() {return girth;}
public void show() {
calculate();
System.out.println(name + "的面积是:" + area);
System.out.println(name + "的周长是:" + girth);
}
/*
* 抽象方法,计算
*/
public abstract void calculate();
}
- 创建一个长方形,并继承Shape
public class Rectangle extends Shape {
private double width;
private double height;
public Rectangle(String name, double width, double height) {
super(name);
// TODO Auto-generated constructor stub
this.width = width;
this.height = height;
}
@Override
public void calculate() {
// TODO Auto-generated method stub
this.area = this.width * this.height;
this.girth = 2 * (this.width + this.height);
}
}
- 创建一个圆形,并继承Shape
public class Round extends Shape {
//圆的半径
private double radius;
public Round(String name, double radius) {
super(name);
// TODO Auto-generated constructor stub
this.radius = radius;
}
@Override
public void calculate() {
// TODO Auto-generated method stub
this.area = Math.sqrt(this.radius) * Math.PI;
this.girth = 2 * Math.PI * this.radius;
}
}
- 在main方法中初始化圆形和长方形
Shape round = new Round("圆形", 100);
round.show();
Shape rectangle = new Rectangle("长方形", 100, 200);
rectangle.show();
- 打印结果为
圆形的面积是:31.41592653589793
圆形的周长是:628.3185307179587
长方形的面积是:20000.0
长方形的周长是:600.0