如何使用Java中的super.toString()将toString从子节点传递给父节点

时间:2018-02-10 00:10:27

标签: java arrays object arraylist tostring

研究Java项目以研究多态性。我正在尝试学习如何从底层子项向上传递一个toString()。我必须将toString表单Hardware.java传递给Tool.java到ScrewDriver.java,然后在Player.java中,我需要打印出我已定义的数组。

以下是文件:

public class Player {
    public static void main(String[] args) {
        List<Hardware> hardware = new ArrayList<>();
        ScrewDriver screwdriver1 = new ScrewDriver("Flathead", "Use this to open paint cans", 150, "Woodworking", true, 15, 10);

        hardware.add(screwdriver1);

        for(Hardware tool : hardware)
            System.out.print(tool);
    }
}

public class Hardware {
    private String name;
    private String message;
    private int points;

    @Override
    public String toString() {
        super.toString();
        return "Name: " + name + " Message: " + message + " Points: " + points;
    }
}

public class Tool extends Hardware {
    private String type;
    private boolean isDangerous;
    private int percentDangerous;

    @Override
    public String toString() {
        super.toString();
        return "Type: " + type + " Message: " + isDangerous + " Percent Dangerous: " + percentDangerous;
    }
}

public class ScrewDriver extends Tool {
    private double length;

    @Override
    public String toString() {
        super.toString();
        return "Length: " + length;
    }
}

我遇到的问题是,从阵列打印的唯一内容是长度。

非常感谢任何帮助!提前谢谢。

2 个答案:

答案 0 :(得分:3)

您无法从超类访问子类的方法。只有相反的方式才有可能。因此,您可以在Tool类中访问Hardware的toString(),在ScrewDriver类中访问Tool的toString()。

为了在ScrewDriver的toString()方法中打印ScrewDriver的所有超类的toString()信息,您需要修改此继承链中的所有toString()方法。

假设Hardware的toString()是这样的:

@Override
public String toString()
{
    return "Name: " + name + " Message: " + message + " Points: " + points;
}

您需要将Tool的toString()修改为以下内容,以便它使用其超类的toString()方法:

@Override
public String toString()
{
    return super.toString() + " Type: " + type + " Message: " + isDangerous + " Percent Dangerous: " + percentDangerous;
}

最后,ScrewDriver的toString()应调用其超类的toString()方法,如下所示:

@Override
public String toString()
{    
    return super.toString() + " Length: " + length;
}

只有这时,ScrewDriver的toString()才会打印其所有超类的信息。

答案 1 :(得分:0)

super.toString();

方法调用返回String,但是你没有使用这个调用的结果,所以基本上你在浪费CPU周期。

可能的解决方案是:

@Override
public String toString()
{
    return super.toString() + "\nLength: " + length;
}