了解超载超级调用时遇到问题

时间:2019-01-18 17:01:38

标签: java

为什么变量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);
    }
}

2 个答案:

答案 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。

因此,在这种情况下,您需要将大小变量设为静态,从而在v3v3之间共享相同的值。实例化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传递给构造函数