理解超载超级呼叫时出现问题

  • 本文关键字:问题 呼叫 超载 java
  • 更新时间 :
  • 英文 :


为什么变量size等于 5 而不是 10?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实例变量的副本。初始化时v3实例通过调用超类构造函数将其自己的 size 变量副本增加到 5。

因此,在这种情况下,您需要使大小变量成为静态变量,相同的值将在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"));
    }
  }   
}

我想你错过了V3Radiator构造函数的size++;调用。

在这种情况下,正确的大小是:

v2.大小 - 5

v3.大小 - 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 传递给您的构造函数

最新更新