抽象概念的引入是方便人们对事物的分类理解
面向对象的程序世界与现实世界是一致的。
Java表达抽象概念采用抽象类
Java表达抽象行为能力用接口

8.1.1 抽象类的定义

abstract class 类名称
{
成员变量;
方法(){……} //一般方法
abstract 方法(); //抽象方法
}

  • 在抽象类中可以包含一般方法和抽象方法。
  • 抽象类表示的是一个抽象概念,不能被实例化为对象
  • 抽象类具体应用时需要继承。

继承后抽象类的方法都必须全部实现。

8.1.2 抽象类的应用

例8-1 定义一个代表“形状”的抽象类,其中包括求形状面积的抽象方法。继承该抽象类定义三角型、矩形、圆。 分别创建一个三角形、矩形、圆存入一个数组中,访问数组元素将各类图形的面积输出。

  1. abstract class Shape { //定义抽象类
  2. abstract public double area(); //抽象方法
  3. }
  4. class Triangle extends Shape { //定义三角型
  5. private double a, b, c;
  6. public Triangle(double a, double b, double c) {
  7. this.a = a;
  8. this.b = b;
  9. this.c = c;
  10. }
  11. public double area(){
  12. double p = (a + b +c) / 2;
  13. return Math.sqrt(p * (p - a) * (p- b) * (p- c));
  14. }
  15. }
  16. class Rectangle extends Shape { //定义矩形
  17. private double width, height;
  18. public Rectangle(double j, double k) {
  19. width = j;
  20. height = k;
  21. }
  22. public double area() {
  23. return width * height;
  24. }
  25. }
  26. class Circle extends Shape { //定义圆
  27. private double r;
  28. public Circle(double r) {
  29. this.r = r;
  30. }
  31. public double area() {
  32. return Math.PI * r * r;
  33. }
  34. }
  35. public class Test{
  36. public static void main(String args[])
  37. {
  38. Shape s[] = new Shape[3];
  39. s[0] = new Triangle(25, 41, 50);
  40. s[1] = new Rectangle(15,20);
  41. s[2] = new Circle(47);
  42. for (int k= 0; k < s.length; k ++)
  43. System.out.println( s[k].area() );//根据指向的具体对象求形状面积
  44. }
  45. }
  46. 1
  47. abstract class MineBase {
  48. abstract void amethod( );
  49. static int i;
  50. }
  51. public class Mine extends MineBase{
  52. public static void main(String argv[ ]){
  53. int[ ] ar = new int[5];
  54. for (i = 0;i < ar.length;i++)
  55. System.out.println(ar[i]);
  56. }
  57. }
  58. A.输出50
  59. B.编译错误: ar 未初始化就使用;
  60. $C.编译错误: 抽象方法未在Mine中实现;
  61. D.运行错误, i超出数组下标范围。
  62. 2
  63. abstract class P{
  64. public P() { System.out.println("parent"); }
  65. abstract void m();
  66. }
  67. class S extends P {
  68. public S() { System.out.println("child"); }
  69. public static void main(String a[ ]) {
  70. P x= new S();//用父类引用访问子类对象实例时,先执行父类构造方法,再执行子类的。
  71. x.m();
  72. }
  73. void m()
  74. {
  75. System.out.println("m()");
  76. }
  77. }
  78. /*
  79. 运行结果:
  80. parent
  81. child
  82. m()
  83. */