知识大全 构建器内部的多形性方法的行为

Posted

篇首语:花门楼前见秋草,岂能贫贱相看老。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 构建器内部的多形性方法的行为相关的知识,希望对你有一定的参考价值。

  构建器调用的分级结构(顺序)为我们带来了一个有趣的问题 或者说让我们进入了一种进退两难的局面 若当前位于一个构建器的内部 同时调用准备构建的那个对象的一个动态绑定方法 那么会出现什么情况呢?在原始的方法内部 我们完全可以想象会发生什么——动态绑定的调用会在运行期间进行解析 因为对象不知道它到底从属于方法所在的那个类 还是从属于从它衍生出来的某些类 为保持一致性 大家也许会认为这应该在构建器内部发生     但实际情况并非完全如此 若调用构建器内部一个动态绑定的方法 会使用那个方法被覆蓋的定义 然而 产生的效果可能并不如我们所愿 而且可能造成一些难于发现的程序错误     从概念上讲 构建器的职责是让对象实际进入存在状态 在任何构建器内部 整个对象可能只是得到部分组织——我们只知道基础类对象已得到初始化 但却不知道哪些类已经继承 然而 一个动态绑定的方法调用却会在分级结构里 向前 或者 向外 前进 它调用位于衍生类里的一个方法 如果在构建器内部做这件事情 那么对于调用的方法 它要操纵的成员可能尚未得到正确的初始化——这显然不是我们所希望的     通过观察下面这个例子 这个问题便会昭然若揭     //: PolyConstructors java  // Constructors and polymorphism  // don t produce what you might expect     abstract class Glyph    abstract void draw();   Glyph()     System out println( Glyph() before draw() );    draw();     System out println( Glyph() after draw() );         class RoundGlyph extends Glyph    int radius = ;   RoundGlyph(int r)     radius = r;    System out println(      RoundGlyph RoundGlyph() radius =      + radius);      void draw()     System out println(      RoundGlyph draw() radius = + radius);         public class PolyConstructors    public static void main(String[] args)     new RoundGlyph( );      ///:~    在Glyph中 draw()方法是 抽象的 (abstract) 所以它可以被其他方法覆蓋 事实上 我们在RoundGlyph中不得不对其进行覆蓋 但Glyph构建器会调用这个方法 而且调用会在RoundGlyph draw()中止 这看起来似乎是有意的 但请看看输出结果     Glyph() before draw()  RoundGlyph draw() radius =   Glyph() after draw()  RoundGlyph RoundGlyph() radius =     当Glyph的构建器调用draw()时 radius的值甚至不是默认的初始值 而是 这可能是由于一个点号或者屏幕上根本什么都没有画而造成的 这样就不得不开始查找程序中的错误 试着找出程序不能工作的原因     前一节讲述的初始化顺序并不十分完整 而那是解决问题的关键所在 初始化的实际过程是这样的     ( ) 在采取其他任何操作之前 为对象分配的存储空间初始化成二进制零     ( ) 就象前面叙述的那样 调用基础类构建器 此时 被覆蓋的draw()方法会得到调用(的确是在RoundGlyph构建器调用之前) 此时会发现radius的值为 这是由于步骤( )造成的     ( ) 按照原先声明的顺序调用成员初始化代码     ( ) 调用衍生类构建器的主体     采取这些操作要求有一个前提 那就是所有东西都至少要初始化成零(或者某些特殊数据类型与 零 等价的值) 而不是仅仅留作垃圾 其中包括通过 合成 技术嵌入一个类内部的对象句柄 如果假若忘记初始化那个句柄 就会在运行期间出现违例事件 其他所有东西都会变成零 这在观看结果时通常是一个严重的警告信号     在另一方面 应对这个程序的结果提高警惕 从逻辑的角度说 我们似乎已进行了无懈可击的设计 所以它的错误行为令人非常不可思议 而且没有从编译器那里收到任何报错信息(C++在这种情况下会表现出更合理的行为) 象这样的错误会很轻易地被人忽略 而且要花很长的时间才能找出     因此 设计构建器时一个特别有效的规则是 用尽可能简单的方法使对象进入就绪状态 如果可能 避免调用任何方法 在构建器内唯一能够安全调用的是在基础类中具有final属性的那些方法(也适用于private方法 它们自动具有final属性) 这些方法不能被覆蓋 所以不会出现上述潜在的问题 cha138/Article/program/Java/JSP/201311/19731

相关参考

知识大全 在构建器里调用构建器

    若为一个类写了多个构建器那么经常都需要在一个构建器里调用另一个构建器以避免写重复的代码可用this关键字做到这一点  通常当我们说this的时候都是指这个对象或者当前对象而且它本身会产生当前对

知识大全 从内部类继承

  由于内部类构建器必须同封装类对象的一个句柄联系到一起所以从一个内部类继承的时候情况会稍微变得有些复杂这儿的问题是封装类的秘密句柄必须获得初始化而且在衍生类中不再有一个默认的对象可以连接解决这个问题

知识大全 默认构建器

    正如早先指出的那样默认构建器是没有自变量的它们的作用是创建一个空对象若创建一个没有构建器的类则编译程序会帮我们自动创建一个默认构建器例如    //:DefaultConstructorjav

知识大全 Java中的构建器

Java中的构建器  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  为违例编写代码时我们经常要解决

知识大全 用构建器自动初始化

    对于方法的创建可将其想象成为自己写的每个类都调用一次initialize()这个名字提醒我们在使用对象之前应首先进行这样的调用但不幸的是这也意味着用户必须记住调用方法在Java中由于提供了名为

知识大全 如何构建高效财务管理运行机制

如何构建高效财务管理运行机制1.提高预算控制、风险控制以及内部报告控制等方面的意识预算控制要求企业及时分析和控制预算差异,采取改进措施,确保预算的执行,最大限度地降低企业的成本。企业应当按照内部经济活

构建和谐文化,就要使“团结互助、扶贫济困、平等友爱、融洽和谐”成为人们的自觉行为,为此必须__

构建和谐文化,就要使“团结互助、扶贫济困、平等友爱、融洽和谐”成为人们的自觉行为,为此必须_____。A、积极发展文化产业B、大力加强思想道德建设C、鼓励文化在继承中创新D、做新时期中华文化的传播者答

构建__的消费方式,要求通过倡导绿色、低碳生活,合理引导人们消费行为,节约利用资源,保护自然环境,发展新型消费业态

构建_____的消费方式,要求通过倡导绿色、低碳生活,合理引导人们消费行为,节约利用资源,保护自然环境,发展新型消费业态和节能环保型消费品,促进社会消费结构升级,形成一种与我国国情相适应的文明、节约、

内部行政行为是指行政机关作用于行政系统内部或行政机关内部的行政行为,内部行政行为不属于人民法院行政诉讼的受案范围,行政机

内部行政行为是指行政机关作用于行政系统内部或行政机关内部的行政行为,内部行政行为不属于人民法院行政诉讼的受案范围,行政机关工作人员对这类决定不服产生的争议,应当向该行政机关或监察、人事机关提出处理。下

知识大全 设计模式-行为型-迭代器模式(Iterator)

设计模式-行为型-迭代器模式(Iterator)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!