我对构造函数链接程序的输出略有疑问,我在下面展示了:
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
请有人帮助我!
谢谢, 大卫
答案 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;