繁体   English   中英

在理解重载的超级调用时遇到问题

[英]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 变量设为静态,在这种情况下,将在v2v3之间共享相同的值。 在实例化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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM