为什么变量size
等于5而不是10? super(lglist)
调用不会将size的值增加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);
}
}
答案 0 :(得分:1)
为什么应该是10?在V2Radiator v2 = new V2Radiator(aList);
中,对象v2
有一个实例成员size
,当在for循环内实例化该成员时,实例成员V3Radiator v3 = new V3Radiator(aList);
会增加到5。
实例化v3
时,您正在创建一个新实例V3Radiator
,该实例完全是v2
的新实例,并且与早期实例v2
不同。
因此v3
实例不受v3
实例化的影响,并且size
具有从V2Radiator
继承的v3
实例变量的副本。初始化后的size
实例通过调用超类构造函数将其自己的v2
变量副本增加到5。
因此,在这种情况下,您需要将大小变量设为静态,从而在v3
和v3
之间共享相同的值。实例化size
时,您还需要将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"));
}
}
}
增至10。
.handle((p, h) ->
new MethodInvokingMessageProcessor(h.get("myHandler"), h.get("myMethod", String.class)
.processMessage(new GenericMessage<>(p, h))))
答案 1 :(得分:0)
我认为您错过了size++;
的构造函数发出的V3Radiator
调用。
在这种情况下,正确的尺寸是:
v2.size-5
v3.size-15
V2Radiator
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++;
}
}
}
V3Radiator
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 <>,以便调用者可以决定该接口的实现
您应该将type参数添加到该列表中,以使调用者无法将例如List传递给构造函数