11.1. 抽象类

11.1.1. 抽象类概念

作为父类Figure(几何图形)并不知道在实际使用时有多少个子类,目前有椭圆形和三角形,那么不 同的用户需求可能会有矩形或圆形等其他几何图形,而onDraw方法只有确定是哪一个子类后才能具体 实现。Figure中的onDraw方法不能具体实现,所以只能是一个抽象方法。

Figure是抽象类,Ellipse和Triangle是Figure子类实现Figure的抽象方法onDraw。

在Java中抽象类和抽象方法的修饰符是abstract

11.1.2. 抽象类声明和实现

FirGure.java

package ChouxiangClass01;

public abstract class FirGure {
// 绘制几何图形方法
 public abstract void onDraw();
}

Ellipse.java

package ChouxiangClass01;

public class Ellipse extends FirGure {

// 绘制几何图形方法
 @Override
 public void onDraw() {
  // TODO 自动生成的方法存根

  System.out.println("绘制椭圆形!");
 }
}

Triangle.java

package ChouxiangClass01;

public class Triangle extends FirGure {
// 绘制三角形
 @Override
 public void onDraw() {
  // TODO 自动生成的方法存根

  System.out.println("绘制三角形!");
 }
}

调用入口

package ChouxiangClass01;

public class HelloWorld {
 public static void main(String[] args) {
  // f1变量是父类类型,指向子类实例,发生多态
  FirGure f1 = new Triangle();
  f1.onDraw();

  // f2变量是父类类型,指向子类实例,发生多态
  FirGure f2 = new Ellipse();
  f2.onDraw();
 }

}


/*
绘制三角形!
绘制椭圆形!
*/

总结:

设计抽象方法目的就是让子类来实现的,否则抽象方法就没有任何意义
抽象类不能被实例化,只有具体类才能被实例化。

11.1.3. abstract与继承的关系

bike.java

package com.a123.cn;

// 一个抽象的bike类
abstract class bike {
    public String name="抽象类的成员变量";

    public String getName() {
        // 返回成员变量name
        return name;
    }
    // 抽象方法
    abstract public String getMes();
}

Racing_car.java

package com.a123.cn;

/**
 * Racing car 赛车类,继承bike抽象类,实现bike抽象类中的方法
 * 可以在bike抽象类中先写好要实现的功能,写个抽象的蓝图
 */
public class Racing_car extends bike {
    @Override
    public String getMes() {
        return getName();
    }

    public static void main(String[] args) {
        Racing_car h1 = new Racing_car();
        System.out.println("bike抽象类中的抽象方法信息是:" + h1.getMes());
    }
}

/*
bike抽象类中的抽象方法信息是:抽象类的成员变量*/