为什么动态绑定不适用于此?

时间:2014-06-28 20:04:57

标签: java inheritance arraylist dynamic-binding

我做了几节课。 GeoUnit是County and Holding直接扩展的基类。然而,县有一个由控股组成的子结构。

当我使用县的toString()方法时,它应显示其子结构,包括馆藏,通过调用馆藏' toString()方法。 问题在于我很困惑,当我调用郡的toString()方法时,我会得到他们的常规名称,例如" Wessex"虽然Hold的toString()方法仅返回哈希码而不是伦敦例如。 动态绑定是否适用于县的toString()方法中的for-each循环?

编辑1:威塞克斯和伦敦是一个很小的例子。

GeoUnit

public class GeoUnit {

private String name;
private Color RGB;
private Image COA;

public GeoUnit(String name, Color RGB, Image COA) {
    this.name = name;
    this.RGB = RGB;
    this.COA = COA;
}

public void setName(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

public class County extends GeoUnit {

private int positionLandedTitles;
private GeoUnit superstruct;
private ArrayList<GeoUnit> substruct;
private String capital;

public County(int positionLandedTitles, String name, Color RGB, Image COA, ArrayList<? extends GeoUnit> substruct, String capital, GeoUnit superstruct) {
    super(name, RGB, COA);
    this.positionLandedTitles = positionLandedTitles;
    this.substruct = substruct;
    this.capital = capital;
    this.superstruct = superstruct;
}

@Override
public void setName(String name) {
    super.setName(name);
}

@Override
public String toString() {
    String a = "";
    for (GeoUnit g : substruct) {
        a += g.toString() + "\n";
    }
    return ("Name County: " + super.getName()+ "\n \t\t\tSubstruct: " + a);
}

控股

public class Holding extends GeoUnit {

public Holding(String name, Color RGB, Image COA) {
    super(name, RGB, COA);
    this.name=name;
}

@Override
public void setName(String name) {
    super.setName(name);
}

@Override
public String getName(){
    return super.getName();
}

2 个答案:

答案 0 :(得分:1)

您应该在Holding类中定义toString()方法。因为它没有在那里定义,也没有在超类(GeoUnit)中定义,所以使用了超级超类方法(Object)

答案 1 :(得分:1)

您正在调用

g.toString()

但您尚未在toString()或其任何子类中实施GeoUnit方法。因此,将使用继承的Object#toString()实现。