1.抽象方法和抽象类
1.1抽象方法和抽象类的规则
- 抽象方法与抽象类必须由abstract修饰符修饰,同时,抽象方法不能拥有方法体;
- 抽象类无法实例化,不能由new来调用抽象类的构造器来创建实例;
- 抽象类可以有①成员变量、②方法(普通方法和抽象方法都可以)、③构造器(不能用于创建实例,限于被子类调用)、④初始化块、⑤内部类(接口、枚举);
- 含有抽象方法的类只能被定义为抽象类。
1.2抽象方法及抽象类的代码示例
因为抽象方法的使用,主要利用的是子类可以重写补充父类的抽象方法,所以可以充分发挥出多态的作用,使程序灵活化。
举例:父类为shape,用于定义出图形的特点,定义了图形的边长、形状,不同的图形的边长是不一样的,所以需要子类Triangle、Circle来补充延伸父类中定义的抽象类方法,希望大家可以仔细看代码中的注释,可以便于大家理解;
父类Shape的代码:
// 定义一个抽象类
public abstract class Shape {
// 抽象类中可以有初始化块
{
System.out.println("这是一个抽象类初始化块中的代码。");
}
private String color;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
// 一个用于计算周长的抽象方法供子类实现
public abstract double calPerimeter();
// 一个用于返回形状的方法
public abstract String getType();
// Shape抽象类的构造器,不创建实例对象,提供给子类调用
public Shape() {};
public Shape(String color) {
System.out.println("执行Shape的构造器");
this.color = color;
}
}
子类Triangle中的代码:
// 子类继承
public class Triangle extends Shape{
// 定义三角形的边长,并用private进行保护
private double a;
private double b;
private double c;
// 构造器,用于初始化,获得color,并运行setSides方法,对边进行赋值
public Triangle(String color , double a , double b , double c) {
// TODO Auto-generated constructor stub
super(color);
this.setSides(a, b, c);
}
// 判断输入的三边是否符合要求,如符合则赋值给a,b,c
public void setSides(double a , double b , double c) {
if(a >= b + c || b >= a + c || c >= a + b) {
System.out.println("不符合两边之和大于第三边。");
return;
}
this.a = a;
this.b = b;
this.c = c;
}
// 继承父类的抽象方法进行重写,实现周长的计算
@Override
public double calPerimeter() {
// TODO Auto-generated method stub
return a + b + c;
}
// 继承父类的抽象方法进行重写,返回图形的形状
@Override
public String getType() {
// TODO Auto-generated method stub
return "三角形";
}
}
子类Circle中的代码(主程序):
public class Circle extends Shape{
// 圆的半径
private double radius;
// Circle类的构造器,用于初始化图形的color及radius
public Circle(String color , double radius) {
// TODO Auto-generated constructor stub
// 初始化color的值至父类的color变量
super(color);
// 初始化radius
this.setRadius(radius);
}
// 初始化赋值给radius
public void setRadius(double radius) {
this.radius = radius;
}
// 重写父类的方法,用于计算圆的周长
@Override
public double calPerimeter() {
// TODO Auto-generated method stub
return 2 * Math.PI * radius;
}
// 重写父类的方法用于获取图形的类型
@Override
public String getType() {
// TODO Auto-generated method stub
return "圆";
}
public static void main(String[] args) {
// 利用多态的特性,可以使用子类中重写的方法块
// 根据构造器的不同,获取的变量不同
Shape shape_one = new Triangle("黑色", 3, 4, 5);
Shape shape_two = new Circle("红色", 5);
// 打印输出执行子类中重写方法获得的值
System.out.println("利用多态获得图形1的类型:" + shape_one.getType());
System.out.println("利用多态获得图形1的周长:" + shape_one.calPerimeter());
System.out.println("利用多态获得图形2的类型:" + shape_two.getType());
System.out.println("利用多态获得图形2的周长:" + shape_two.calPerimeter());
// getColor方法为父类独有,获得父类方法
System.out.println("输出图形1的颜色:" + shape_one.getColor());
System.out.println("输出图形2的颜色:" + shape_two.getColor());
}
}
2.抽象类的作用
2.1抽象类的使用范围
因为抽象类不能创建实例,但是继承它的子类必须实现父类中的抽象方法,所以抽象类可以约束子类的方法设计,可以使方法较为统一,做到模板化设计,抽象方法可以作为所有子类的通用模板。
抽象父类可以把需要依据子类特性来实现的方法定义为抽象方法,让子类继承后重写并实现方法的细节;
父类中的部分方法可能需要子类的协助,可以并不完全由自身实现,这就看设计者的思路了;
抽象类利用了面向对象的三大特征之一的多态的特性,利用理解好多态,对于本节的帮助较大。