构造函数链接Java

时间:2010-11-15 10:03:30

标签: java class methods

我对构造函数链接程序的输出略有疑问,我在下面展示了:

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

怀疑是关于OutPut如何“1000”,“10”,“2000”& “20”是不是很明显?

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

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

首先使用“无参数”,第二个使用“两个参数”,带有“无参数”的第一个构造函数立方体()只有两个值this(10,10),带有“两个参数”的值具有值

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

我不明白如何生成Below OutPuts。

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

请有人帮助我!

谢谢, 大卫

6 个答案:

答案 0 :(得分:7)

当您拨打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)

构建的立方体

答案 1 :(得分:4)

好吧,让我们一次拿一个案例。对于第一个版本,构造函数链是:

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.

如果仍然没有向您解释所有内容,请提出一个非常具体的问题 - 最好是一个案例,说明您不理解哪一个。

答案 2 :(得分:3)

我认为很明显。 specialObj1是在默认构造函数中创建的,它调用1个参数构造函数,调用3个参数构造函数。每次调用都会发送10作为多维数据集维度的值。因此,体积为10 * 10 * 10 = 1000;

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

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

我希望这会有所帮助。

答案 3 :(得分:1)

下面是执行流程,

第1步:当" SpecialCube specialObj1 = new SpecialCube();"执行,默认构造函数" SpecialCube()"将被召唤。

第2步:现在"超级()"将被要求致电" SpecialCube"超级"立方体"。

第3步:现在"这(10,10)"在超级"立方体"将被执行,它将从同一个类" cube"中调用2个参数的构造函数。 ,即" Cube(int l,int b)"通过传递参数(l = 10,b = 10)。

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

步骤5:实例变量,如length = 10,breadth = 10,heigth = 10,对象" specialObj1"在步骤#1创建。

步骤6:然后java将分配"权重"变量为构造函数中的10" SpecialCube()"。 (参见步骤#1)

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

步骤7:System.out.println(" SpecialCube1的卷是:" + specialObj1.getVolume()); ,当这个语句执行时,java会调用超类" Cube"" " getVolume()"方法,因为子类" SpecialCube"通过关键字" extends"继承它,在下面的子类中引用。

公共类SpecialCube扩展了Cube

步骤8:步骤1至5,已经分配了instanace变量为"长度= 10,宽度= 10,高度= 10",您的音量为" 1000"。

步骤9:" System.out.println(" SpecialCube1的权重为:" + specialObj1.weight); - 此声明打印"重量"变量值为" 10",因为步骤#6。

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

答案 4 :(得分:0)

分解:

SpecialCube1构造了默认,因此调用默认构造函数SpecialCube(),后者又调用super(),默认构造Cube(),解释前两个。

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

答案 5 :(得分:0)

此处生成这些输出是因为

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即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 //在第二个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;