【问题标题】:Constructor Chaining in JavaJava中的构造函数链
【发布时间】:2010-11-15 10:03:30
【问题描述】:

我对下面展示的构造函数链接程序的输出有点怀疑:

class Cube {

    int length;
    int breadth;
    int height;
    public int getVolume() {
        return (length * breadth * height);
    }
    Cube() {
        this(10, 10);
        System.out.println("Finished with Default Constructor of Cube");
    }
    Cube(int l, int b) {
        this(l, b, 10);
        System.out.println("Finished with Parameterized Constructor having
                                    2 params of Cube");
    }
    Cube(int l, int b, int h) {
        length = l;
        breadth = b;
        height = h;
        System.out.println("Finished with Parameterized Constructor having
                                    3 params of Cube");
    }
}

public class SpecialCube extends Cube {

    int weight;
    SpecialCube() {
        super();
        weight = 10;
    }
    SpecialCube(int l, int b) {
        this(l, b, 10);
        System.out.println("Finished with Parameterized Constructor having
                                    2 params of SpecialCube");
    }
    SpecialCube(int l, int b, int h) {
        super(l, b, h);
        weight = 20;
        System.out.println("Finished with Parameterized Constructor having
                                    3 params of SpecialCube");
    }
    public static void main(String[] args) {
        SpecialCube specialObj1 = new SpecialCube();
        SpecialCube specialObj2 = new SpecialCube(10, 20);
        System.out.println("Volume of SpecialCube1 is : "
                + specialObj1.getVolume());
        System.out.println("Weight of SpecialCube1 is : "
                + specialObj1.weight);
        System.out.println("Volume of SpecialCube2 is : "
                + specialObj2.getVolume());
        System.out.println("Weight of SpecialCube2 is : "
                + specialObj2.weight);
    }
}

输出:

Finished with Parameterized Constructor having 3 params of SpecialCube
Finished with Parameterized Constructor having 2 params of SpecialCube
Volume of SpecialCube1 is : 1000
Weight of SpecialCube1 is : 10
Volume of SpecialCube2 is : 2000
Weight of SpecialCube2 is : 20

疑问是关于如何实现“1000”、“10”、“2000”和“20”的输出?

在主类中我们创建了两个对象:

SpecialCube specialObj1 = new SpecialCube();
SpecialCube specialObj2 = new SpecialCube(10, 20);

第一个有“无参数”,第二个有“两个参数”,第一个“无参数”的构造函数 Cube() 只有两个值this(10,10),而一个有“两个参数”的有值

Cube(int l, int b) 
    {this(l, b, 10);}

我不明白下面的输出是如何生成的。

Volume of SpecialCube1 is : 1000
Weight of SpecialCube1 is : 10
Volume of SpecialCube2 is : 2000
Weight of SpecialCube2 is : 20

请谁能帮帮我!

谢谢, 大卫

【问题讨论】:

  • 尝试调试代码,这是跟踪流程的最佳方式
  • 操作似乎错误。应该首先打印 cube() 构造函数中的语句

标签: java class methods


【解决方案1】:

当你调用SpecialCube()时,流程是这样的(伪代码):

SpecialCube()
  -> Cube()
     -> Cube(10,10)
        -> Cube(10,10,10)
           l:=10, b:=10, h:=10
           print message "Finished with Parameterized Constructor having 3 params of Cube"
        print message "Finished with Parameterized Constructor having 2 params of Cube"
     print message "Finished with Default Constructor of Cube"
  weight:=10

最后你有一个用(l,b,h) = (10,10,10)构造的立方体

【讨论】:

    【解决方案2】:

    好吧,让我们一次处理一个案例。对于第一个版本,构造函数链如下:

    SpecialCube()
    Cube()
    Cube(10, 10)
    Cube(10, 10, 10)
    

    所以立方体最终的体积为 1000,默认权重为 10(在 SpecialCube 无参数构造函数中指定)。

    在第二种情况下,构造函数链如下所示:

    SpecialCube(10, 20)
    SpecialCube(10, 20, 10)
    Cube(10, 20, 10)
    

    SpecialCube(int l, int b, int h) 无参数构造函数将权重设置为 20 - 所以我们有 2000 的体积和 20 的权重。

    如果这仍然不能向您解释一切,请提出一个非常具体的问题 - 最好是关于 一个 案例,说明您不理解的部分。

    【讨论】:

      【解决方案3】:

      我认为这是显而易见的。 specialObj1 在调用 1 个参数构造函数的默认构造函数期间创建,该构造函数调用 3 个参数构造函数。每次调用都会发送 10 作为多维数据集维度的值。所以,体积是 10*10*10 = 1000;

      重量不是方法。它是在默认和 3-arg 构造函数中初始化的字段。由于构造函数所做的第一件事是调用 this(...) ,因此在其他构造函数中为该变量分配什么值并不重要。链中的第一个构造函数实际上覆盖了所有先前设置的值。这就是为什么第一个对象的 weight = 10 的原因。

      第二个对象是使用带参数 10 和 20 调用的 2-arg 构造函数创建的,因此体积为 10*20*10 = 2000。(第二个 10 在 2args 构造函数调用 3args 构造函数时设置。) 在第二个对象的情况下,权重由 3-args 构造函数设置,因为 2-args 构造函数不会覆盖此值。

      我希望这会有所帮助。

      【讨论】:

      • 无参数构造函数是不带任何参数的构造函数。当没有其他构造函数可用于对象时,默认构造函数是编译器提供的对象的无参数构造函数。此示例中没有默认构造函数!
      【解决方案4】:

      下面是执行流程,

      第 1 步:当“SpecialCube specialObj1 = new SpecialCube();”时执行后,会调用默认构造函数“SpecialCube()”。

      第 2 步:现在“Super()”将被执行以调用“SpecialCube”的超类“Cube”。

      第 3 步:现在将执行超类“cube”中的“this(10,10)”,它将调用来自同一类“cube”的 2 个参数的构造函数,即“Cube(int l,int b) " 通过传递参数(l=10,b=10)。

      第4步:现在“this(l,b,10)将被执行,在第3步中传递的实际参数是“this(10,10,10)”,它将调用3个参数化构造函数“Cube(int l , int b, int h)",从第 3 步传递值,它将类似于 "Cube(int l=10,int b=10,int h=10)"。

      第 5 步:实例变量,如在第 1 步创建的对象“specialObj1”的长度 = 10、宽度 = 10、高度 = 10。

      步骤 6:然后 java 将在构造函数“SpecialCube()”中将“Weight”变量分配为 10。 (参考第 1 步)

      现在查看对象“SpecialCube()”的方法执行(我只考虑“specialObj1”。

      第七步:System.out.println("SpecialCube1的体积为:"+ specialObj1.getVolume()); ,当这条语句执行时,java会调用父类“Cube”的“getVolume()”方法,因为子类“SpecialCube”继承了它的关键字“extends”,请参考下面的子类。

      公共类 SpecialCube 扩展了 Cube

      第 8 步:第 1 步到第 5 步,已将实例变量分配为“长度 = 10,宽度 = 10,高度 = 10”,您的获取量为“1000”。

      第 9 步:“System.out.println("SpecialCube1 的权重是:"+ specialObj1.weight); - 由于第 6 步,此语句将“权重”变量值打印为​​“10”。

      希望,它会解释原因。为对象“specialObj2”尝试相同的流程。

      【讨论】:

        【解决方案5】:

        分解:

        SpecialCube1默认构造的,所以调用默认构造函数SpecialCube(),然后调用super(),默认构造Cube(),这将解释前两个。

        其中SpecialCube2 遵循SpecialCube 的正确构造函数链。

        【讨论】:

          【解决方案6】:

          这里生成这些输出是因为

          SpecialCube1 的体积为:1000 //当第一次调用getVolume函数时,它得到10,10,10,作为参数 观察以下代码,其中 l、b、h 值分配给长度、宽度、高度

          Cube(int l, int b, int h) {
          //l=10,b=10,h=10
          
          System.out.println(l);
          System.out.println(b);
          System.out.println(h);
              length = l;
              breadth = b;
              height = h;
          

          SpecialCube1 的重量为:10 //在第一个constr权重分配给10(即第一个对象)

          SpecialCube2 的体积为:2000 // getVolume 函数第二次从 specialcube(3 argmted constr ie 10,20,10;

          获取参数
          SpecialCube(int l, int b, int h) 
          {
          //l=10,b=20,h=10
              super(l, b, h);
              System.out.println(l);
          System.out.println(b);
          System.out.println(h);
              weight = 20;
          

          SpecialCube2 的重量为:20 //在第2个constr权重被分配给20(即第一个对象)

          SpecialCube(int l, int b, int h) { //l=10,b=20,h=10

              super(l, b, h);
              System.out.println(l);
          System.out.println(b);
          System.out.println(h);
              weight = 20;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-07-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-12-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多