Java 语言提供了两种类,分别为具体类和抽象类。前面学习接触的类都是具体类。这一节介绍一下抽象类。

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,那么这样的类称为抽象类。

在 Java 中抽象类的语法格式如下:

<abstract>class<class_name> {<abstract><type><method_name>(parameter-iist);
}

其中,abstract 表示该类或该方法是抽象的;class_name 表示抽象类的名称;method_name 表示抽象方法名称,parameter-list 表示方法参数列表。

如果一个方法使用 abstract 来修饰,则说明该方法是抽象方法,抽象方法只有声明没有实现。需要注意的是 abstract 关键字只能用于普通方法,不能用于 static 方法或者构造方法中。

抽象方法的 3 个特征如下:

  • 抽象方法没有方法体

  • 抽象方法必须存在于抽象类中

  • 子类重写父类时,必须重写父类所有的抽象方法

  • 抽象类和抽象方法必须用关键字abstract修饰

  • 抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类

  • 抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要用于被子类调用。

  • 抽象类不能实例化→不加 { }

  • 抽象类的子类

         是一个抽象类。是一个具体类。这个类必须重写抽象类中的所有抽象方法。(多态)
    
  • 抽象方法只保留方法的功能,具体的执行,交给继承抽象类的子类,由子类重写改抽象方法

注意:在使用 abstract 关键字修饰抽象方法时不能使用 private 修饰,因为抽象方法必须被子类重写,而如果使用了 private 声明,则子类是无法重写的。

抽象类的定义和使用规则如下:

  • 抽象类和抽象方法都要使用 abstract 关键字声明。
  • 如果一个方法被声明为抽象的,那么这个类也必须声明为抽象的。而一个抽象类中,可以有 0~n 个抽象方法,以及 0~n 个具体方法。
  • 抽象类不能实例化,也就是不能使用 new 关键字创建对象。

例 1
不同几何图形的面积计算公式是不同的,但是它们具有的特性是相同的,都具有长和宽这两个属性,也都具有面积计算的方法。那么可以定义一个抽象类,在该抽象类中含有两个属性(width 和 height)和一个抽象方法 area( ),具体步骤如下。

1)首先创建一个表示图形的抽象类 Shape,代码如下所示。

public abstract class Shape {public int width; // 几何图形的长public int height; // 几何图形的宽public Shape(int width, int height) {this.width = width;this.height = height;}public abstract double area(); // 定义抽象方法,计算面积
}

2)定义一个正方形类,该类继承自形状类 Shape,并重写了 area( ) 抽象方法。正方形类的代码如下:

public class Square extends Shape {public Square(int width, int height) {super(width, height);}// 重写父类中的抽象方法,实现计算正方形面积的功能@Overridepublic double area() {return width * height;}
}

3)定义一个三角形类,该类与正方形类一样,需要继承形状类 Shape,并重写父类中的抽象方法 area()。三角形类的代码实现如下:

public class Triangle extends Shape {public Triangle(int width, int height) {super(width, height);}// 重写父类中的抽象方法,实现计算三角形面积的功能@Overridepublic double area() {return 0.5 * width * height;}
}

4)最后创建一个测试类,分别创建正方形类和三角形类的对象,并调用各类中的 area() 方法,打印出不同形状的几何图形的面积。测试类的代码如下:

public class ShapeTest {public static void main(String[] args) {Square square = new Square(5, 4); // 创建正方形类对象System.out.println("正方形的面积为:" + square.area());Triangle triangle = new Triangle(2, 5); // 创建三角形类对象System.out.println("三角形的面积为:" + triangle.area());}
}

在该程序中,创建了 4 个类,分别为图形类 Shape、正方形类 Square、三角形类 Triangle 和测试类 ShapeTest。其中图形类 Shape 是一个抽象类,创建了两个属性,分别为图形的长度和宽度,并通过构造方法 Shape( ) 给这两个属性赋值。

在 Shape 类的最后定义了一个抽象方法 area( ),用来计算图形的面积。在这里,Shape 类只是定义了计算图形面积的方法,而对于如何计算并没有任何限制。也可以这样理解,抽象类 Shape 仅定义了子类的一般形式。

正方形类 Square 继承抽象类 Shape,并实现了抽象方法 area( )。三角形类 Triangle 的实现和正方形类相同,这里不再介绍。

在测试类 ShapeTest 的 main( ) 方法中,首先创建了正方形类和三角形类的实例化对象 square 和 triangle,然后分别调用 area( ) 方法实现了面积的计算功能。

5)运行该程序,输出的结果如下:

正方形的面积为:20.0
三角形的面积为:5.0

1.11 抽象(abstract)类相关推荐

  1. php中什么是abstract,深入解读php中抽象(abstract)类和抽象方法

    在面向对象(OOP)语言中,一个类可以有一个或多个子类,而每个类都有至少一个公有方法作为外部代码访问的接口.而抽象方法就是为了方便继承而引入的,现在来看一下抽象类和抽象方法分别是如何定义以及他们的特点 ...

  2. 接口(interface)和抽象(abstract)类的区别

    2019独角兽企业重金招聘Python工程师标准>>> 接口与抽象类的区别: 1 两者表达的概念不一样.抽象类是一类事物的高度聚合,与子类的关系属于"是"的关系: ...

  3. django abstract base class ---- 抽象基类

    抽象蕨类用于定义一些同享的列.类本身并不会在数据库端有表与之对应 一.例子: 1.定义一个叫Person 的抽象基类.Student 继承自Person from django.db import m ...

  4. java 抽象接口类,Java接口(interface)和Java抽象类(abstract class)的区别(详诉版)

    1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架, 当代表业务逻辑的高层抽象层结构合理时,你底层的具体实现需要考虑的就仅仅是一些算法 ...

  5. [python进阶]11接口:从协议到抽象基类

    本章讨论的话题是接口:从鸭子类型的代表特征动态协议,到使接口更明确.能验证实现是否符合规定的抽象基类(Abstract Base Class,ABC). 首先,本章说明抽象基类的常见用途:实现接口时作 ...

  6. python类方法和实例方法syntax errors_《Fluent Python》CH.11_面向对象_接口:从协议到抽象基类...

    主要内容 首先,本章说明抽象基类的常见用途:实现接口时作为超类使用 说明抽象基类如何检查具体子类是否符合接口定义,以及如何使 用注册机制声明一个类实现了某个接口,而不进行子类化操作 最后, 说明如何让 ...

  7. 抽象基类与接口,共性与个性的选择!

    抽象基类与接口,共性与个性的选择! C#中的抽象基类(Abstract Class)和接口(Interface)都实现了面向对象中的继承机制,它们通过定义抽象方法匀实现了对继承类的功能上的约束,那么在 ...

  8. 【转】抽象基类与接口,共性与个性的选择!

    抽象基类与接口,共性与个性的选择! C#中的抽象基类(Abstract Class)和接口(Interface)都实现了面向对象中的继承机制,它们通过定义抽象方法匀实现了对继承类的功能上的约束,那么在 ...

  9. 抽象基类与接口,共性与个性的选择!(区别)

    C#中的抽象基类(Abstract Class)和接口(Interface)都实现了面向对象中的继承机制,它们通过定义抽象方法匀实现了对继承类的功能上的约束,那么在如何在恰当的场景选择恰当的继承机制是 ...

  10. 抽象基类与接口,共性与个性的选择

    C#中的抽象基类(Abstract Class)和接口(Interface)都实现了面向对象中的继承机制,它们通过定义抽象方法匀实现了对继承类的功能上的约束,那么在如何在恰当的场景选择恰当的继承机制是 ...

最新文章

  1. AWS - Couldformation 初探
  2. unity3d 数学基础与数学辅助类
  3. 模板—主席树(待修改)
  4. moia调度mysql到hive_创立打车软件Moia后,“不安分”的大众又收购一家移动支付公司PayByPhone...
  5. 37/100. Subsets
  6. python3编码声明_python3编码问题汇总
  7. UCScript——C++集成脚本
  8. MySQL主从复制作用和原理
  9. 可读性代码:为什么、怎样以及什么时候
  10. [学习笔记] PHP回调函数的实现方法 [转]
  11. 基于Fabric的性能测试与调优实践
  12. python IO多路复用之select
  13. DBeaver 导出数据库结构和数据
  14. ANSYS ICEM CFD——网格划分基础知识
  15. bzoj1627 / P2873 [USACO07DEC]泥水坑Mud Puddles
  16. 基于SSM的校园外卖点餐系统
  17. 中国大学MOOC货币金融学试题及答案
  18. 麒麟V10sp1轻松设置开机自启动脚本
  19. 数据处理(一):点到直线距离
  20. git获取代码,拉取最新代码,更新代码等

热门文章

  1. BC:带你温习并解读《中国区块链技术和应用发展白皮书》—区块链技术发展路线图
  2. DL之NN:利用(本地数据集50000张数据集)调用自定义神经网络network.py实现手写数字图片识别94%准确率
  3. 【转载】IIS网站配置不带www域名直接跳转带www的域名
  4. hive使用derby的服务模式(可以远程模式)
  5. tp5,thinkphp5,隐藏index.php,隐藏入口文件
  6. VS2015 打包添加系统必备组件
  7. LeetCode Longest Palindromic Substring
  8. Windows Phone Dev Notes-如何使用ConnectionSettingsTask 来启动连接设置页面
  9. RichTextBox的使用
  10. 读者看《赢道:成功创业者的28条戒律》