您的位置:网站首页 > Java游戏 > 正文

java 编程思想-类再生

类别:Java游戏 日期:2018-5-15 7:51:52 人气: 来源:

  类再生的意义在于实现代码的重复使用。在这一章中,介绍两个达到这一个目的的方法。第一个最简单:在新类里简单地创建原有类的对象即“合成”,因为新类由现有类的对象合并而成。简单的重复利用代码的功能,而不是采用它的形式。

  第二种方法:创建一个新类,将其作为现有类的一个“类型”。我们可以远洋采取现有类的形式,并在其中加入新代码,同时不会对现有的类产生影响,即“继承”方法。

  在新类里简单地置入对象句柄就可以进行合成操作。假如需要在一个对象里容乃几个String对象、两种基本数据类型以及属于另一个累的对象。对于非基本类型的对象来说,只需要将句柄置于新类即可,而对于基本数据类型来说,则需要在自己的类中定义它们;

  在类主体的起始花括号之前,需要放置一个关键字extends,在后面跟随“基础类”的名字,这样就完成继承的基本语法,就可以自动获得基础类的所有数据以及方法。继承示例:

  初始化构建实在基础类的“外部“进行的,所以基础类会在衍生类访问它之前得到正确的初始化。没有创建构建器,编译器也会自动为我们自动合成一个默认的构建器,并发出对基础类构建器的调用。

  上述例子有自己默认的构建器:也就是说,它不含任何自变量。编译器很容易地调用它们 ,因为不存在集体传递什么自变量的问题。如果没有默认的自变量,或者想调用含有一个自变量的某个基础类构建器,必须明确地编写对基础类的调用代码。这是用super关键字以及适当的自变量列表实现的,如下所示:

  如果java基础类有一个方法被“过载”使用多次,在衍生类里对那个方法名的重新定义就不会影藏在任何基础类的版本。所以无论方法在这一级还是在一个基础类中定义,过载都会生效。(过载即覆盖,以后面的定义为准。)

  如果想利用新类内部的一个现有类的特性,而不是使用它的接口,通常应该选择合成。也就是说,我们可嵌入一个对象,使自己能用它实现新累的特性。但是新类的用户会看到我们已定义的接口,而不是来自嵌入对象的接口。考虑到这种效果,我们需在新类里嵌入现有类的private对象。

  有些时候,我们想让新类用户直接访问新类的合成。也就是说,需要将对象的属性变为public。对象会将自身隐藏起来,所以这是一种很安全的做法。而且在用户知道我们准备合成一系组件时,接口就更容易理解。

  protected这个关键字的意义在继承下显得更加的好解释。在理想状态下,private是随时都是“私有”的,任何人不得访问,但实际应用中,经常想把某些东西深深地隐藏起来,但同时允许访问衍生类。protected关键之就可以很好的帮助实现这一点。它实际上是”它本身是私有的,但可由从这个类继承的任何东西或者同一个包内的其他任何东西访问“。也就是说,java中的protected会成为进入”友好“状态。

  继承的一个好处就是它支持“累积开发”,允许我们引入新的代码,同时不会为现有代码造成错误。这样可将新错误隔离到新代码里。通过从一个现成的、功能性的类继承,同时增添数据及方法(并重新定义现有方法),我们可保持现有代码原封不动,不会为其引入自己的编程错误。一旦错误肯定知道是由于自己的新代码造成的。这样一来,与修改现有代码相比,改正错误所需的事件和精力可以得到很大的节省。

  尽管继承是一种非常有用的技术手段,但在某些情况下,特别实在项目稳定下来以后,仍然需要从新的角度考察自己的类结构,将其收缩成一个更灵活的结构。记住,继承是对一种特殊关系的表达,以为这“这个新类属于那个旧类的一种类型”。我们程序不应该纠结于一些细枝末节,而应该着眼于创建和操作各种类型的对象,用它们表达出来字“问题空间”的一个模型。

  继承值得注意的地方就是它没有为新类提供方法。继承是对新类和基础类之间的关系的关系的一种表达。可这样描述该关系:“新类属于现有类的一种类型”。

  因语境(应用)不同,fianl关键字的含义可能会稍微产生一些差异。但它一般的意思就是声明“这个东西不能改变”。之所以要改变,可能是考虑到两方面的因素:设计或效率。

  对于编译器的,编译器(程序)可将值“封装”到需要的计算过程里。也就是说,可在编译期间提前执行,从而节省圆形时的一些开销。在Java中,这些形式的必须属于基本数据类型(primitives),而且要用fianl关键字进行表达。在对这样的一个进行定义的时候,必须给出一个值。

  Java1.1允许我们创建“空白的final”,它们属于一些特殊的字段。尽管被声明成final,但却未得到一个初始值。无论在哪种情况下,空白的final都必须在实际使用前得到正确的初始化。而且编译器会主动这一得以贯彻。然而,对于final关键字的各种应用,空白final具有最大的灵活性。举个例子来说,位于类内部的一个final字段现在对每个对象都可以有所不同,同时依然保持其“不变”的本质。实例:

  java 1.1 允许我们将自变量设成final属性,方法在自变量列表中对它们进行适当的声明。这意味着在一个方法的内部,我们不能改变自变量句柄指向的东西。示例:

  如果说整个类都是final(在它的定义前冠以final关键字),就表面光自己不希望从这个类继承,或者不允许其他任何人采取这中操作。换言之,出于某些原因,我们的类肯定不需要进行扔个改变;或者出于安全方面的理由,我们不希望进行这样的子类化(子类处理)。

  此外,我们或许还考虑到执行效率的问题,并确保涉及这个类各对象的所有行动都要尽可能地有效,示例:

  数据既可以是final,也可以不是,取决于我们具体选择。应用于final的规则同样适用于数据,无论类是否被定义成final。将类定义成final后,结果只是进行继承—没有更多的。然而由于继承,所以一个final类中的所有方法都默认final。因为此时无法覆盖它们。所以final类内的一个方法添加final符,但这样做没有任何意义。6.9 初始化和类装载

  在许多传统语言里,程序都是作为启动过程的一部分一次性载入的。随后进行的是初始化,再是正式执行程序。在这些语言中,必须对初始化进行慎重的控制,static数据的初始化不会带来麻烦。比如在一个static数据获得初始化之前,就有另一个static数据希望他是一个有效值。示例:

  无论继承还是合成,我们都可以在现有类型的基础上创建一个新类型。但在典型情况下,我们通过合成来实现现有类型的“再生”或“重复使用”,将其作为新类型基础实施过程的一部分使用。但如果向实现接口的“再生”,就应该使用继承。

  尽管继承在面向对象的程序设计中得到了特别的强调,但在实际启动一个设计时,最好还是先考虑采用合成技术。

  

关键词:java编程思想
0
0
0
0
0
0
0
0
下一篇:没有资料

网友评论 ()条 查看

姓名: 验证码: 看不清楚,换一个

推荐文章更多

热门图文更多

最新文章更多

关于联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助

郑重声明:本站资源来源网络 如果侵犯了你的利益请联系站长删除

CopyRight 2010-2012 技术支持 FXT All Rights Reserved