Java™ 教程(抽象方法和类)

CodeLumina
• 阅读 1380

抽象方法和类

抽象类是一个声明为abstract的类 — 它可能包括也可能不包括抽象方法,抽象类无法实例化,但可以进行子类化。

抽象方法是在没有实现的情况下声明的方法(没有大括号,后跟分号),如下所示:

abstract void moveTo(double deltaX, double deltaY);

如果一个类包含抽象方法,那么该类本身必须被声明为abstract,如:

public abstract class GraphicObject {
   // declare fields
   // declare nonabstract methods
   abstract void draw();
}

当抽象类被子类化时,子类通常为其父类中的所有抽象方法提供实现,但是,如果没有,那么子类也必须声明为abstract

注意:未声明为defaultstatic的接口(参见接口部分)中的方法是隐式抽象的,因此abstract修饰符不用于接口方法(可以使用,但不需要)。

抽象类与接口相比

抽象类与接口类似,你不能实例化它们,它们可能包含有或没有实现声明的方法的组合,但是,使用抽象类,你可以声明非静态和final的字段,并定义publicprotectedprivate的具体方法。使用接口,所有字段都自动为publicstaticfinal,并且你声明或定义的所有方法(作为默认方法)都是public,此外,你只能扩展一个类,无论它是否是抽象的,而你可以实现任意数量的接口。

你应该使用哪个,抽象类或接口?

  • 如果任何这些语句适用于你的情况,请考虑使用抽象类:

    • 你希望在几个密切相关的类之间共享代码。
    • 你希望扩展抽象类的类具有许多公共方法或字段,或者需要非公共的访问修饰符(如protectedprivate)。
    • 你想声明非静态或非最终字段,这使你能够定义能够访问和修改它们所属的对象的状态的方法。
  • 如果任何这些语句适用于你的情况,请考虑使用接口:

    • 你希望不相关的类将实现你的接口,例如,ComparableCloneable接口由许多不相关的类实现。
    • 你希望指定特定数据类型的行为,但不关心谁实现其行为。
    • 你希望利用类型的多重继承。

JDK中的抽象类的一个示例是AbstractMap,它是集合框架的一部分,它的子类(包括HashMapTreeMapConcurrentHashMap)共享AbstractMap定义的许多方法(包括getputisEmptycontainsKeycontainsValue)。

JDK中实现多个接口的类的一个示例是HashMap,它实现了SerializableCloneableMap<K, V>接口。通过阅读这个接口列表,你可以推断出HashMap的实例(无论是实现该类的开发人员或公司)可以克隆,可序列化(这意味着它可以转换为字节流)。请参阅Serializable Objects部分,并具有map的功能,此外,Map<K, V>接口已经增强了许多默认方法,例如mergeforEach,实现此接口的旧类不必定义。

请注意,许多软件库都使用抽象类和接口,HashMap类实现了几个接口,并且还扩展了抽象类AbstractMap

抽象类示例

在面向对象的绘图应用程序中,你可以绘制圆形、矩形、线条、贝塞尔曲线和许多其他图形对象,这些对象都具有某些状态(例如:位置、方向、线条颜色、填充颜色)和行为(例如:moveTorotateresizedraw)。所有图形对象中的一些状态和行为都是相同的(例如:位置、填充颜色和moveTo),其他需要不同的实现(例如,resizedraw)。所有GraphicObjects必须能够自己绘制或调整大小,它们只是做的方式不同,这是抽象超类的完美情况。你可以利用相似性并声明所有图形对象从同一个抽象父对象(例如,GraphicObject)继承,如下图所示。

Java™ 教程(抽象方法和类)

首先,声明一个抽象类GraphicObject,以提供所有子类完全共享的成员变量和方法,例如当前位置和moveTo方法,GraphicObject还声明了方法的抽象方法,例如drawresize,它们需要由所有子类实现,但必须以不同的方式实现,GraphicObject类看起来像这样:

abstract class GraphicObject {
    int x, y;
    ...
    void moveTo(int newX, int newY) {
        ...
    }
    abstract void draw();
    abstract void resize();
}

GraphicObject的每个非抽象子类(例如CircleRectangle)必须提供drawresize方法的实现:

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作为超类
下一篇:数字
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java考试题
Java考试题一:单选题1.下列哪一种叙述是正确的(D)A.abstract修饰符可修饰字段、方法和类B.抽象方法的body部分必须用一对大括号{}包住C.声明抽象方法,大括号可有可无D.声明抽象方法不可写出大括号2.如下代码
Wesley13 Wesley13
3年前
java 设计模式之模板模式
什么是模板模式模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。模板方法模式的结构抽象类(AbstractClass):
Wesley13 Wesley13
3年前
java 07 接口
1.interface    接口2.接口中的成员修饰符固定  publicstaticfianl  //成员变量  只通过类访问   publicabstract    //成员函数   3.接口里所有的方法都是抽象的,抽象类中,可以没有抽象方法。  类与类继承,类与接口是实现的关系。降低耦合(高
Aidan075 Aidan075
4年前
Dart中的抽象类、多态、以及接口
一、Dart中的抽象类Dart中抽象类: Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。  1、抽象类通过abstract 关键字来定义  2、Dart中的抽象方法不能用abstract声明
Wesley13 Wesley13
3年前
Java面试基础篇——第八篇:抽象类与接口的区别
1.抽象类抽象类:如果一个类中包含有抽象方法,或这个类使用abstract关键字修饰,则称这个类是抽象类。抽象方法是什么呢?抽象方法就是指用abstract关键字修饰的方法。需要注意的是:抽象类不一定必须包含抽象方法,而如果一个类中有抽象方法,这个类必须是抽象类。packagecom.developlee.abstractI
Wesley13 Wesley13
3年前
C#中虚函数和抽象函数的区别
抽象方法:使用abstract关键字例如:publicabstractboolWithdraw(…);抽象方法是必须被派生类覆写的方法。抽象方法是可以看成是没有实现体的虚方法,如果类中包含抽象方法,那么类就必须定义为抽象类。不论是否还包含其它一般方法。虚方法:使用virtual关键字publicvirtual
Wesley13 Wesley13
3年前
JAVA抽象类和抽象方法(abstract)
一、抽象(abstract)的使用  当父类的某些方法不确定时,可以用abstract关键字来修饰该方法\抽象方法\,用abstract来修饰该类\抽象类\。  我们都知道,父类是将子类所共同拥有的属性和方法进行抽取,这些属性和方法中,有的是已经明确实现了的,有的还无法确定,那么我们就可以将其定义成抽象,在后日子类进行重用,进行具体化
Wesley13 Wesley13
3年前
Java 进程的建立方法
Java进程的建立方法在JDK中,与进程有直接关系的类为Java.lang.Process,它是一个抽象类。在JDK中也提供了一个实现该抽象类的ProcessImpl类,如果用户创建了一个进程,那么肯定会伴随着一个新的ProcessImpl实例。同时和进程创建密切相关的还有ProcessBuilder,它是
Wesley13 Wesley13
3年前
OCJP做完题后的一些总结。
1\.抽象类中不一定非得有抽象方法,就算没有抽象方法,编译也不会出错。2、interface继承interface用extends关键字。3、在泛型中E实现一个接口用extends关键字。4、枚举类型也可以作为HashMap中的key使用5、枚举类型也会被编译成class文件。命名格式和内部类相同。也可以被其他类调用,但
Wesley13 Wesley13
3年前
Java 设计模式系列(十三)模板方法
Java设计模式系列(十三)模板方法模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。一、模板方法的结构
小万哥 小万哥
1年前
Java 枚举(Enums)解析:提高代码可读性与易维护性
接口在Java中,实现抽象的另一种方式是使用接口。接口定义接口是一个完全抽象的类,用于将具有空方法体的相关方法分组:java//接口interfaceAnimalpublicvoidanimalSound();//接口方法(没有具体实现体)publicvo