`
wanjianfei
  • 浏览: 319241 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java编程——继承(二)

    博客分类:
  • J2SE
阅读更多
方法覆盖

前面介绍了继承的一些基础知识,现在介绍一些在使用继承时需要注意的问题。熟悉这些问题将更好的解决项目中的实际问题。

例如在实际的游戏中,会按照怪物的种类实现设计。首先设计一个基础类Monster,然后按照怪物类别设计Monster的子类,如BossNormalMonster等。则在实际实现时,每个怪物都有移动(move)的功能,但是在BossNormalMonster的移动规则存在不同。这样就需要在子类的内部重新编写移动的功能,从而满足实际的移动要求。该示例的实现代码如下:

//Monster.java

public class Monster{

public void move(){

//移动功能

}

}

//Boss.java

public class Boss extends Monster{

public void move(){

//Boss类的移动规则

}

}

//NormalMonster.java

public class NormalMonster extends Monster{

public void move(){

// NormalMonster类的移动规则

}

}

这样在Monster的每个子类内部都重新书写了move方法的功能,这种在子类内部重新父类中的方法的语法现象,称作方法覆盖(override)

方法覆盖在实际中保持了类的结构的统一,在实际使用时将极大的方便程序开发人员的使用,使项目的整体结构保持统一,便于项目的维护。

在使用子类的对象时,子类内部的方法将覆盖从父类继承过来的方法,也就是说子类的对象调用的是子类的功能方法,而不是父类的方法。

在进行方法覆盖时,子类内部的方法和父类的方法声明相同,而且子类方法的限制不能比父类的方法严格。例如不能使用比父类限制更大的访问控制符或抛出比父类更多的异常等,这个在实际使用方法覆盖时需要特别的注意。

在实际的项目中大量的存在需要在子类内部重写父类的功能方法的地方,恰当的使用方法覆盖将为项目开发带来很大的便利。

8.2.2.4 需要注意的问题

除了方法覆盖以外,在实际使用继承时还有很多需要注意的问题。下面就这些问题进行一一说明。

1、 属性覆盖没有必要

方法覆盖可以重写对应的功能,在实际继承时在语法上也支持属性覆盖(在子类内部声明和父类属性名相同的属性),但是在实际使用时修改属性的类型将导致类结构的混乱,所以在继承时不能使用属性覆盖。

2、 子类构造方法的书写

该项是继承时书写子类最需要注意的问题。在子类的构造方法内部必须调用父类的构造方法,为了方便程序员进行开发,如果在子类内部不书写调用父类构造方法的代码时,则子类构造方法将自动调用父类的默认构造方法。而如果父类不存在默认构造方法时,则必须在子类内部使用super关键字手动调用,关于super关键字的使用将在后续进行详细的介绍。

说明:子类构造方法的参数列表和父类构造方法的参数列表不必完全相同。

3、 子类的构造过程

在构造子类时由于需要父类的构造方法,所以实际构造子类的过程就显得比较复杂了。其实在实际执行时,子类的构造过程遵循:首先构造父类的结构,其次构造子类的结构,无论构造父类还是子类的结构,都是首先初始化属性,其次执行构造方法。则子类的构造过程具体如下:

如果类A是类B的父类,则类B的对象构造的顺序如下:

a) A的属性初始化

b) A的构造方法

c) B的属性

d) B的构造方法

由于任何一个类都直接或间接继承自Object类,所以Object类的属性和构造方法都是首先执行的。

4、 不要滥用继承

在实际的项目设计中,继承虽然很经常使用,但是还是不能滥用,使用继承的场合以及相关问题参看下面的说明。

8.5.2.5 如何设计继承

在实际的项目中,类和类之间的关系主要有三种:

1、 没有关系

项目中的两个类之间没有关联,不需要进行消息传递,则这两个类之间就没有关系,可以互相进行独立的设计。

2、 使用关系(has-a)

如果一个类的对象是另外一个类的属性,则这两个类之间的关系是使用关系。例如把房屋(House)看作是一个类,把门(Door)看成另外一个类,则房屋有一个门,代码的实现如下:

//House.java

public class House{

public Door door;

}

//Door.java

public class Door{

 

}

则这里Door的对象是House类的属性,则DoorHouse类之间的关系就是使用关系,House使用Door类来制作自身。

使用关系提供了使用已有类来声明新类的方式,可以以组合的方式来构建更复杂的类,这是项目中使用类的常见方式之一。

判断是否是使用关系的依据就是:has-a,一个类具备另外一个类的对象,例如一个House有一个门。

3、 继承关系(is-a)

如果一个类是另外一个类的一种,也就是在分类上存在包含关系,则应该使用继承来实现。例如Boss是怪物的一种,则使Boss继承Monster类。

下面简单介绍一些项目中继承的设计方法。在实际设计继承时,一般有两种设计的方法:

1、 自上而下的设计

在实际设计时,考虑类的体系结构,先设计父类,然后根据需要来增加子类,并在子类的内部实现或添加对应的方法。

2、 自下而上的设计

在实际设计时,首先不考虑类的关系,每个类都分开设计,然后从相关的类中把重复的属性和方法抽象出来形成父类。

对于初学者来说,第二种设计方式相对来说比较容易实现,所以一般初学者都按照第二种设计方式进行设计,设计完成以后再实现成具体的代码。

分享到:
评论

相关推荐

    java编程——Java线程

    Java线程是Java编程中一个强大且必要的特性,它极大地扩展了Java程序的能力范围,使其能够处理更复杂、更高效的并发任务。然而,线程的管理和使用也需要谨慎,避免常见的并发问题,确保程序的稳定性和安全性。通过...

    JAVA初级编码——继承JDialog, 利用JTextArea显示文档中的内容

    在Java编程语言中,"JAVA初级编码——继承JDialog, 利用JTextArea显示文档中的内容"这个主题涉及到了两个核心概念:JDialog和JTextArea。JDialog是Java Swing库中的一个组件,它用于创建独立于主应用程序窗口的...

    12.java学习第十二章——继承extends.pdf

    在标题“12.java学习第十二章——继承extends.pdf”以及描述“12.java学习第十二章——继承extends.pdf”中,明确指出了本章节的主要内容是关于Java语言中的继承概念。继承是面向对象编程中的一个重要特性,它允许...

    java课件——全面介绍java知识

    这个"java课件——全面介绍java知识"提供了一套完整的Java学习资源,旨在帮助初学者和进阶者深入理解和掌握Java编程技术。 首先,让我们从基础开始。Java的核心概念包括类、对象、封装、继承、多态。类是对象的模板...

    java基础——————试题库

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而闻名。这份“java基础——————试题库”资源旨在...在学习过程中,不断实践和总结是非常重要的,理论结合实际,才能真正掌握Java编程。

    清华大学JAVA教程——比较基础

    【清华大学JAVA教程——比较基础】是一套专门为初学者设计的JAVA编程学习资源,旨在帮助学习者从零开始逐步掌握这门流行的编程语言。这套教程以其深入浅出的方式,深受广大编程爱好者欢迎,尤其适合对JAVA感兴趣但...

    java实例——闹钟——看看吧 总有思路的

    在Java编程语言中,创建一个闹钟应用是一个常见的实践任务,可以帮助我们理解事件处理、定时器和多线程等核心概念。在这个实例中,我们将探讨如何利用Java来设计一个简单的闹钟系统。首先,我们需要了解Java中的关键...

    Java实验报告——类的继承、多态的应用

    在本实验报告中,我们将深入探讨Java编程中的两个核心概念:类的继承和多态的应用。实验主要目标是加深对抽象类和抽象方法的理解,并掌握如何在实际编码中实现类的继承以及多态性。 首先,让我们理解抽象类和抽象...

    个人学习的java笔记——思维导图

    这份"个人学习的java笔记——思维导图"涵盖了上述诸多Java编程的核心知识点,通过思维导图的方式,使得学习者可以更直观地理解和记忆这些复杂的概念,对提升Java学习效果大有裨益。无论你是初学者还是有经验的开发者...

    黑马程序员入学Java知识——精华总结

    "黑马程序员入学Java知识——精华总结"这份文档很可能包含了Java编程的基础到进阶的知识点,旨在帮助初学者快速掌握Java的核心概念和技能。 1. **Java基础知识**:Java是一种面向对象的语言,它的基础包括语法、...

    Java之——类热加载

    在Java编程中,类的加载是程序运行的重要环节。传统的Java应用程序在启动时,由JVM(Java虚拟机)通过类加载器将类加载到内存中,一旦加载完成,除非程序退出,否则这些类通常不会被重新加载。然而,在开发过程中,...

    几个java小程序——自己写的

    在"几个java小程序——自己写的"这个主题中,我们可以深入探讨Java编程的一些关键知识点。 1. **面向对象编程(OOP)基础**:Java的核心是基于面向对象编程的原理,包括封装、继承和多态。封装意味着隐藏实现细节,...

    Java代码——D-tools

    【Java代码——D-tools】是针对Java编程语言的特定工具集,主要在C盘下运行。这个工具包可能包含了各种实用程序和库,旨在简化Java开发者的工作流程,提高开发效率。下面将详细介绍Java编程和D-Tools可能涉及的知识...

    java面试——深圳-腾讯-Java高级.zip

    在准备深圳腾讯Java高级面试的过程中,你需要掌握一系列深入的Java编程和相关技术知识。这份压缩包文件"java面试——深圳-腾讯-Java高级.zip"包含了关键的面试指南,特别是对于那些寻求在大型科技公司如腾讯工作的...

    java语言——老师随机点名系统

    在Java编程领域,开发一个“老师随机点名系统”是一个常见的练习项目,它可以帮助教育工作者在课堂上公平、高效地选取学生进行互动。这个系统的核心是实现一个随机数生成算法,结合用户界面来呈现和执行点名过程。...

    精通JAVA——JDK(高清PDF文件)

    《精通JAVA——JDK》是一本深度探讨Java编程语言及其开发工具集JDK的专业教程,旨在帮助Java开发者提升技能,实现技术的精进。作为Java的基石,JDK(Java Development Kit)是学习和开发Java应用程序必不可少的工具...

    Java小程序——动物乐园zoo

    在Java编程语言中,"Java小程序——动物乐园zoo"是一个很好的实践项目,它结合了面向对象编程(Object-Oriented Programming, OOP)和接口(Interface)等核心概念。面向对象是Java的灵魂,它通过类(Class)来定义...

    java面试——深圳-银盛支付-Java中级.zip

    1. **面向对象编程**:这是Java的基础,包括类、对象、封装、继承、多态等概念。理解如何设计和实现面向对象的解决方案是中级开发者必备的能力。 2. **异常处理**:理解Java中的异常类型,如何使用try-catch-...

    深入java虚拟机——applet 演示

    Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了跨平台的运行环境。Applet是Java在Web浏览器中运行的一种小程序,它极大地丰富了网页的交互性。本篇将深入探讨Java虚拟机与Applet的相关知识点。...

Global site tag (gtag.js) - Google Analytics