[英]How to call both super(…) and this(…) in case of overloaded constructors?
[英]Having a problem understanding overloaded super call
为什么可变size
等于 5 而不是 10? super(lglist)
调用不是将super(lglist)
的值增加 5 吗?
class V2Radiator {
int size=0;
V2Radiator(ArrayList list) {
for (int x = 0; x<5; x++) {
list.add(new SimUnit("V2Radiator"));
size++;
}
}
}
class V3Radiator extends V2Radiator {
V3Radiator(ArrayList lglist) {
super(lglist);
for(int g=0; g<10; g++) {
lglist.add(new SimUnit("V3Radiator"));
}
}
}
public class TestLifeSupportSim {
public static void main(String[] args) {
ArrayList aList = new ArrayList();
V2Radiator v2 = new V2Radiator(aList);
V3Radiator v3 = new V3Radiator(aList);
System.out.println(v2.size);
}
}
为什么应该是10? 在V2Radiator v2 = new V2Radiator(aList);
对象v2
有一个实例成员size
,当它在 for 循环内实例化时,它会增加到 5。
当你实例化V3Radiator v3 = new V3Radiator(aList);
您正在创建一个新实例v3
,它完全是V3Radiator
一个新实例,与之前的实例v2
。
所以v2
实例不受v3
实例化的影响,并且v3
有它自己的从V2Radiator
继承的size
实例变量的V2Radiator
。 初始化时的v3
实例通过调用超类构造函数将其自己的size
变量副本增加到 5。
因此,您需要将 size 变量设为静态,在这种情况下,将在v2
和v3
之间共享相同的值。 在实例化v3
您还将size
增加到 10。
class V2Radiator {
static int size=0;
V2Radiator(ArrayList list) {
for (int x = 0; x<5; x++) {
list.add(new SimUnit("V2Radiator"));
size++;
}
}
}
class V3Radiator extends V2Radiator {
V3Radiator(ArrayList lglist) {
super(lglist); //here size variable will be incremented for all instances.
for(int g=0; g<10; g++) {
lglist.add(new SimUnit("V3Radiator"));
}
}
}
我想你错过了size++;
从V3Radiator
的构造函数调用。
在这种情况下,正确的尺寸是:
v2.size - 5
v3.size - 15
V2散热器
import java.util.List;
class V2Radiator {
int size = 0;
V2Radiator(List<SimUnit> list) {
for(int x = 0; x < 5; x++) {
list.add(new SimUnit("V2Radiator"));
size++;
}
}
}
V3散热器
import java.util.List;
class V3Radiator extends V2Radiator {
V3Radiator(List<SimUnit> lglist) {
super(lglist);
for(int g = 0; g < 10; g++) {
lglist.add(new SimUnit("V3Radiator"));
size++;
}
}
}
对我所做的更改的一些解释:
您应该在构造函数中使用 List<> 接口而不是 ArrayList<>,以便调用者可以决定该接口的实现
您应该将类型参数添加到该列表中,以便调用者无法将例如 List 传递给您的构造函数
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.