`

四:Java抽象类

阅读更多
抽象类仅提供一个类型的部分实现,它可以有实例变量以及多个构造子。一个抽象类不会有实例,它的构造子不能被客户端调用来创建实例,但它的构造子可以被其子类调用,从而使一个抽象类的所有子类都可以有一些共同的实现,而不同的子类可以在此基础上有其自己的实现。抽象类和子类的这种关系实际上是模板方法模式的应用。

(1)抽象类的用途
抽象类提供了一个继承的出发点,而具体的类不同,具体类可以实例化,应当给出一个有商业逻辑实现的对象模板。由于抽象类不可以被实例化,因此设计一个抽象类一定是用来被继承的,反过来也是对的:具体类不是用来继承的!
A:具体类不是用来继承的
在类图里,非叶子节点一定不会是具体类,一定是接口或者抽象类。如果在一个原始的设计里,有两个具体类之间有继承关系,那么应该怎么进行代码重构呢?如假设有两个具体的类A和B,B是A的子类,那么最简单的修改方案应当是建立一个抽象类(或者接口)C,然后让类A和类B成为C的子类
B:抽象类应当拥有尽可能多的共同代码
把重复的代码从子类里面移动到超类里面,可以提高代码的复用率,由于代码在共同的超类而不是几个子类中出现,在代码发生改变时,只需要改变一个地方。一个对象从超类继承而来的代码,在不使用时不会造成对资源的浪费
C:抽象类应当拥有尽可能少的数据
与代码的移动方向相反的是,数据的移动是从抽象类到个体类,也即从继承的等级结构的高端向等级的低端移动,一个对象的数据不论是否使用都会占用资源,因此数据应当尽量放到具体的类或者等级的低端。

(2)基于抽象类的模式和原则
A:针对抽象编程,不要对具体编程,这就是依赖倒转原则。换言之,就是要针对抽象类编程,不要针对子类编程,这一原则点出了抽象类对代码复用的一个重要作用.
B:正确使用继承
Java中继承分为两种:一种是类对接口的实现,称作接口继承,另一种是类对类的继承,称为实现继承,第二种继承是很容易被滥用的一种复用工具,只要可能,尽量使用合成而不是继承来达到复用的目的。

(3)什么时候才应当使用继承复用
A:子类扩展超类的责任
子类应当扩展超类的责任,而不是置换掉(Override)或撤消掉(Nullify)超类的责任,如果一个子类需要将继承自超类的责任取消或置换后才能使用的话,很有可能这个子类根本就不是那个超类的子类。打个比方,如果将狗设计成猫的子类,猫有上树的能力,狗没有,为了使继承成立,只好把猫上树的能力取消掉,这个继承关系显然是错误的。我们应当设计一个动物抽象类让猫和狗去继承.一般而言,如果子类需要置换太多超类的行为,那么一定是因为子类的行为与超类的有太大的区别,这个时候,很有可能子类并不能取代超类出现在任何需要超类的地方,也就是说它们不满足里氏代换原则.
B:不要从工具类继承
这个只讲一个例子:这是一个真实的华尔街金融网站的系统设计,设计师将内容划分为Aticile,Alert,Survey,Contact,MarketSpin,Link等几种,所有的这些内容都分别由一个javabean负责,而所有的这些javabean都是一个ContentDataBean类的子类。同时,这个系统还有一个操纵数据库的工具类DBManager...如果到此为止一切还算好,但是负责这个设计的设计师将ContentDataBean设计成DBManager类的子类,看上去这个好处很明显,所有的子类一下子就得到了所有DBManager的数据库功能...这就是将继承关系当成权宜之计,而没有做分类学上的考虑。所有的ContentDataBean的各个内容子类都是同一类型的东西,而这些内容类和DBManager的区别就像猫和狗的区别,这就是一种滥用继承关系的例子.
纠正:这种滥用的情况不能使用引进一个抽象类的办法进行代码重构,而是应当采用将继承关系改为委派的办法纠正,也就是说,将DBManager到ContentDataBean的继承关系改成从ContentDataBean到DBManager的委派关系.
分享到:
评论

相关推荐

    实验5:Java抽象类与接口.doc

    Java 抽象类与接口实验报告 一、实验目的及要求 本实验的目的是掌握 Java 中的抽象类和接口的概念及其应用。通过本实验,学生将了解抽象类和接口的定义、特点及使用场景,并掌握如何使用抽象类和接口来描述不同的...

    Java:使用抽象类定义一个“形状类”,能够计算周长和面积。

    在Java编程语言中,抽象类是一种特殊的类,它不能被实例化,但可以作为其他类的基类。在这个场景中,我们使用抽象类来定义一个"形状类",该类包含计算周长和面积的通用方法。这允许我们创建一个统一的接口,使得所有...

    java 抽象类与接口的练习

    在Java编程语言中,抽象类和接口是两种重要的面向对象设计概念,它们允许我们定义规范,供其他类去实现或继承。在这个练习中,我们将深入理解这两种机制,并通过实际的代码示例和注释来加深理解。 首先,让我们讨论...

    Java抽象类高难度面试题及解析

    以下是对一些高难度Java抽象类面试题的详细解析: 1. **抽象类和接口的区别**: - 抽象类可以包含成员变量和非抽象方法,接口则只能包含常量和抽象方法。 - 类只能继承一个抽象类,但可以实现多个接口。 2. **...

    Java抽象类和抽象方法

    在深入探讨Java抽象类与抽象方法之前,我们首先需理解其基本概念以及它们在面向对象编程中的作用。Java作为一种广泛使用的编程语言,提供了多种机制来实现代码的复用性和灵活性,其中抽象类和抽象方法是关键特性之一...

    java抽象类与接口实例java抽象类与接口实例

    java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例...

    JAVA:抽象类和接口

    ### JAVA:抽象类和接口 #### 一、概念与特性 **抽象类**与**接口**作为Java语言中实现抽象的两种主要手段,在面向对象编程中扮演着至关重要的角色。它们各自具有独特的特性和用途,使得开发人员可以根据具体的...

    Java源代码:抽象类和接口

    在Java编程语言中,抽象类和接口是两种重要的面向对象设计概念,它们允许我们定义规范,为其他类提供模板或行为指南。让我们深入探讨这两个概念及其在Java中的应用。 首先,我们来理解抽象类。在Java中,抽象类是一...

    基于Java抽象类和接口实现疯狂动物城

    学生通过对该项目整体框架的搭建和对动物城信息管理等模块的设计与功能实现,训练了学生对项目框架的搭建、类的封装、抽象类定义与继承、接口的定义与接口的实现等Java OOP面向对象知识点的掌握。 本项目主要包括...

    Java实例化一个抽象类对象的方法教程

    在Java编程语言中,抽象类是用来作为其他类的基类,它定义了一组抽象方法,这些方法必须在子类中实现。由于抽象类自身不能被实例化,这意味着你不能使用`new`关键字直接创建一个抽象类的对象。然而,尽管不能直接...

    Java 抽象类

    通过学习和熟练掌握Java抽象类,开发者能够更好地设计和组织代码,提高代码的灵活性和可维护性,是成为一名优秀Java程序员的必备技能之一。在实际开发中,合理利用抽象类和接口,可以帮助我们构建出高效、可扩展的...

    java抽象类与接口区别

    ### Java抽象类与接口的区别 #### 一、引言 在Java编程中,抽象类(Abstract Class)与接口(Interface)都是实现抽象的关键工具。它们各自有着独特的优势和适用场景,掌握这两者的区别有助于开发者更好地设计系统...

    Java抽象类与接口实验报告

    Java抽象类与接口实验报告

    本项目适合于新手小白入门快速了解掌握Java 大部分必备知识,用于Java的学习与进阶,也可以用于回忆巩固Java 基础用法语法

    Study4 类:Java 抽象类 Study5 类:Java 封装 Study6 类:Java 接口 Study7 类:Java 枚举 Study8 类:Java 反射 Study9 类:Java 注解 Study10 类:Java List、Set、Map Study11 类:Java try-catch-finally 异常...

    Java中抽象类和接口的区别

    在Java语言中,abstract class和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,...

    java 抽象类与接口的区别

    在Java编程语言中,抽象类和接口是两种重要的面向对象设计概念,它们都用于实现多态性,但各自具有不同的特点和应用场景。了解并熟练掌握它们的区别对于编写高质量的Java代码至关重要。 首先,抽象类是一种不能被...

    详细解析Java中抽象类和接口的区别

    ### 详细解析Java中抽象类和接口的区别 #### 引言 在面向对象编程中,Java作为一种广泛应用的编程语言,提供了多种方式来实现抽象的概念。其中最常用的两种机制是抽象类(abstract class)和接口(interface)。这...

    浅析Java抽象类和接口的比较

    Java中的抽象类(abstract class)和接口(interface)都是用于创建抽象化模型的重要工具,它们在面向对象编程中扮演着核心角色。这两种机制都允许我们定义一组方法的签名,但不提供具体实现,从而实现“设计契约”...

    宠物系统(java抽象类)

    本系统以Java为编程语言,它利用了抽象类来定义宠物的基本属性和行为,使得我们可以方便地创建各种不同类型的宠物,如狗、猫或其他动物。 在Java中,抽象类是一种不能被实例化的特殊类,它用于定义一类对象的通用...

Global site tag (gtag.js) - Google Analytics