抽象方法和类
抽象类是一个声明为abstract的类 — 它可能包括也可能不包括抽象方法,抽象类无法实例化,但可以进行子类化。
抽象方法是在没有实现的情况下声明的方法(没有大括号,后跟分号),如下所示:
abstract void moveTo(double deltaX, double deltaY);
如果一个类包含抽象方法,那么该类本身必须被声明为abstract,如:
public abstract class GraphicObject { // declare fields // declare nonabstract methods abstract void draw(); }
当抽象类被子类化时,子类通常为其父类中的所有抽象方法提供实现,但是,如果没有,那么子类也必须声明为abstract。
注意:未声明为default或static的接口(参见接口部分)中的方法是隐式抽象的,因此abstract修饰符不用于接口方法(可以使用,但不需要)。抽象类与接口相比
抽象类与接口类似,你不能实例化它们,它们可能包含有或没有实现声明的方法的组合,但是,使用抽象类,你可以声明非静态和final的字段,并定义public、protected和private的具体方法。使用接口,所有字段都自动为public、static和final,并且你声明或定义的所有方法(作为默认方法)都是public,此外,你只能扩展一个类,无论它是否是抽象的,而你可以实现任意数量的接口。
你应该使用哪个,抽象类或接口?
如果任何这些语句适用于你的情况,请考虑使用抽象类:
你希望在几个密切相关的类之间共享代码。
你希望扩展抽象类的类具有许多公共方法或字段,或者需要非公共的访问修饰符(如protected和private)。
你想声明非静态或非最终字段,这使你能够定义能够访问和修改它们所属的对象的状态的方法。
如果任何这些语句适用于你的情况,请考虑使用接口:
你希望不相关的类将实现你的接口,例如,Comparable和Cloneable接口由许多不相关的类实现。
你希望指定特定数据类型的行为,但不关心谁实现其行为。
你希望利用类型的多重继承。
JDK中的抽象类的一个示例是AbstractMap,它是集合框架的一部分,它的子类(包括HashMap、TreeMap和ConcurrentHashMap)共享AbstractMap定义的许多方法(包括get、put、isEmpty、containsKey和containsValue)。
JDK中实现多个接口的类的一个示例是HashMap,它实现了Serializable、Cloneable和Map
请注意,许多软件库都使用抽象类和接口,HashMap类实现了几个接口,并且还扩展了抽象类AbstractMap。
抽象类示例在面向对象的绘图应用程序中,你可以绘制圆形、矩形、线条、贝塞尔曲线和许多其他图形对象,这些对象都具有某些状态(例如:位置、方向、线条颜色、填充颜色)和行为(例如:moveTo、rotate、resize、draw)。所有图形对象中的一些状态和行为都是相同的(例如:位置、填充颜色和moveTo),其他需要不同的实现(例如,resize或draw)。所有GraphicObjects必须能够自己绘制或调整大小,它们只是做的方式不同,这是抽象超类的完美情况。你可以利用相似性并声明所有图形对象从同一个抽象父对象(例如,GraphicObject)继承,如下图所示。
首先,声明一个抽象类GraphicObject,以提供所有子类完全共享的成员变量和方法,例如当前位置和moveTo方法,GraphicObject还声明了方法的抽象方法,例如draw或resize,它们需要由所有子类实现,但必须以不同的方式实现,GraphicObject类看起来像这样:
abstract class GraphicObject { int x, y; ... void moveTo(int newX, int newY) { ... } abstract void draw(); abstract void resize(); }
GraphicObject的每个非抽象子类(例如Circle和Rectangle)必须提供draw和resize方法的实现:
class Circle extends GraphicObject { void draw() { ... } void resize() { ... } } class Rectangle extends GraphicObject { void draw() { ... } void resize() { ... } }当抽象类实现接口时
在接口一节中,注意到实现接口的类必须实现所有接口的方法,但是,可以定义一个不实现所有接口方法的类,前提是该类被声明为abstract,例如:
abstract class X implements Y { // implements all but one method of Y } class XX extends X { // implements the remaining method in Y }
在这种情况下,类X必须是abstract,因为它没有完全实现Y,但实际上,类XX实现了Y。
类成员抽象类可以具有静态字段和静态方法,你可以像使用任何其他类一样使用带有类引用的静态成员(例如,AbstractClass.staticMethod())。
上一篇:Object作为超类 下一篇:数字文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/72873.html
重写和隐藏方法 实例方法 子类中的实例方法的签名(名称,加上其参数的数量和类型)和返回类型与超类中的实例方法相同,将覆盖超类的方法。 子类覆盖方法的能力允许类从行为足够接近的超类继承,然后根据需要修改行为,重写方法与它重写的方法具有相同的名称、数量和参数类型,以及返回类型。重写方法还可以返回由被重写方法返回的类型的子类型,此子类型称为协变返回类型。 覆盖方法时,你可能希望使用@Override注解...
Java™ 教程 Java教程是为JDK 8编写的,本页面中描述的示例和实践没有利用在后续版本中引入的改进。 Java教程是希望使用Java编程语言创建应用程序的程序员的实用指南,其中包括数百个完整的工作示例和数十个课程,相关课程组被组织成教程。 覆盖基础知识的路径 这些教程以书籍的形式提供,如Java教程,第六版,前往Amazon.com购买。 入门 介绍Java技术和安装Java开发软件并使用...
摘要:二面向对象概述面向过程的设计思想和面向对象的设计思想我要吃鱼香肉丝盖饭面向过程我买菜我洗菜我切菜我放水我点火我做饭我炒菜。。。。 大家好,上次我们讲过了乐字节Java编程之方法、调用、重载、递归,接下来我们将会进入到Java封装的内容。Java编程语言发展,面向对象和类。 一、编程语言的发展 机器语言——直接由计算机的指令组成,指令、数据、地址都以0和1组成:可以被计算机直接识别并执行...
数字 本节首先讨论java.lang包中的Number类,它的子类,以及使用这些类的实例化而不是原始数字类型的情况。 本节还介绍了PrintStream和DecimalFormat类,它们提供了编写格式化数字输出的方法。 最后,讨论了java.lang中的Math类,它包含数学函数,以补充语言中内置的运算符,该类具有三角函数,指数函数等方法。 数字类 使用数字时,大多数时候在代码中使用基元类型,例...
管理源文件和类文件 Java平台的许多实现依赖于分层文件系统来管理源文件和类文件,尽管Java语言规范不要求这样做,策略如下。 将类、接口、枚举或注解类型的源代码放在文本文件中,该文件的名称是类型的简单名称,其扩展名为.java,例如: //in the Rectangle.java file package graphics; public class Rectangle { ... ...
阅读 2455·2023-04-25 21:41
阅读 1635·2021-09-22 15:17
阅读 1901·2021-09-22 10:02
阅读 2329·2021-09-10 11:21
阅读 2543·2019-08-30 15:53
阅读 954·2019-08-30 15:44
阅读 927·2019-08-30 13:46
阅读 1078·2019-08-29 18:36