2021-07-26

构造器内部多态方法的行为

注:本文摘自On Java8

构造器调用的层次结构带来了一个困境。如果在构造器中调用了正在构造的对象的动态绑定方法,会发生什么呢?

在普通的方法中,动态绑定的调用是在运行时解析的,因为对象不知道它属于方法所在的类还是类的派生类。

如果在构造器中调用了动态绑定方法,就会用到那个方法的重写定义。然而,调用的结果难以预料因为被重写的方法在对象被完全构造出来之前已经被调用,这使得一些 bug 很隐蔽,难以发现。

从概念上讲,构造器的工作就是创建对象(这并非是平常的工作)。在构造器内部,整个对象可能只是部分形成——只知道基类对象已经初始化。如果构造器只是构造对象过程中的一个步骤,且构造的对象所属的类是从构造器所属的类派生出的,那么派生部分在当前构造器被调用时还没有初始化。然而,一个动态绑定的方法调用向外深入到继承层次结构中,它可以调用派生类的方法。如果你在构造器中这么做,就可能调用一个方法,该方法操纵的成员可能还没有初始化——这肯定会带来灾难。

下面例子展示了这个问题:

// polymorphism/PolyConstructors.java// Constructors and polymorphism// don't produce what you might expectclass Glyph { void draw() {  System.out.println("Glyph.draw()"); } Glyph() {  System.out.println("Glyph() before draw()");  draw();  System.out.println("Glyph() after draw()"); }}class RoundGlyph extends Glyph { private int radius = 1; RoundGlyph(int r) {  radius = r;  System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius); } @Override void draw() {  System.out.println("RoundGlyph.draw(), radius = " + radius); }}public class PolyConstructors { public static void main(String[] args) {  new RoundGlyph(5); }}

输出:

Glyph() before draw()RoundGlyph.draw(), radius = 0Glyph() after draw()RoundGlyph.RoundGlyph(), radius = 5

Glyphdraw() 被设计为可重写,在 RoundGlyph 这个方法被重写。但是 Glyph 的构造器里调用了这个方法,结果调用了 RoundGlyphdraw() 方法,这看起来正是我们的目的。输出结果表明,当 Glyph 构造器调用了 draw() 时,radius 的值不是默认初始值 1 而是 0。这可能会导致在屏幕上只画了一个点或干脆什么都不画,于是我们只能干瞪眼,试图找到程序不工作的原因。

初始化的实际过程是:

  1. 在所有事发生前,分配给对象的存储空间会被初始化为二进制 0。
  2. 如前所述调用基类构造器。此时调用重写后的 draw() 方法(是的,在调用 RoundGraph 构造器之前调用),由步骤 1 可知,<......

    原文转载:http://www.shaoqun.com/a/895460.html

    跨境电商:https://www.ikjzd.com/

    墩煌网:https://www.ikjzd.com/w/189

    zen cart:https://www.ikjzd.com/w/1282

    虚拟信用卡:https://www.ikjzd.com/w/1055


    注:本文摘自OnJava8构造器调用的层次结构带来了一个困境。如果在构造器中调用了正在构造的对象的动态绑定方法,会发生什么呢?在普通的方法中,动态绑定的调用是在运行时解析的,因为对象不知道它属于方法所在的类还是类的派生类。如果在构造器中调用了动态绑定方法,就会用到那个方法的重写定义。然而,调用的结果难以预料因为被重写的方法在对象被完全构造出来之前已经被调用,这使得一些bug很隐蔽,难以发现。从概念
    墩煌网:https://www.ikjzd.com/w/189
    西藏最美的六大边境小城:http://www.30bags.com/a/421494.html
    西藏最美的十个地方,进藏不可错过!:http://www.30bags.com/a/426972.html
    西藏最美神秘九大湖 :http://www.30bags.com/a/413083.html
    西昌大香格里拉旅游环线上的传奇 - :http://www.30bags.com/a/407873.html
    你家老公是怎么上你的 宝贝好想让你㖭我下面:http://lady.shaoqun.com/m/a/248214.html
    四个人同时玩我下面 男人放进女人阳道图片:http://www.30bags.com/m/a/249692.html
    我想㖭你腿间的花 乖乖宝贝让我爽一下:http://www.30bags.com/m/a/249760.html
    深圳大芬美术馆闭馆改造(恢复开放时间):http://www.30bags.com/a/523618.html
    深圳bang儿童艺术节在哪里、怎么去:http://www.30bags.com/a/523619.html
    深圳桃源之光书馆在哪里(地址+怎么去):http://www.30bags.com/a/523620.html
    深圳bang儿童艺术节有什么活动亮点:http://www.30bags.com/a/523621.html

No comments:

Post a Comment