如何通过继承将此toString方法用于私有变量?

时间:2015-01-29 13:33:33

标签: java inheritance tostring

通常情况下,对于我使用的toString方法,String.format(“%s,%s”,变量,变量)并且它完全正常。

更清楚的例子,

public class example1
{
    int number;
    String name;

    public void setup(String names, int numbers) {
        name = names;
        number = numbers;
    }

    public String toString() {
        return String.format("Name: %s\n Number: %s", name, number);
    }
}

这完全没问题。但是,当涉及到继承和私有变量时,我遇到了一个问题。请注意以下示例。

public class example1
{
    int number;
    private String name;

    public void setName(String names) {
        name = names;
    }

    public String getName() {
        return name;
    }
}

public class example2 extends example1
{
    public void setUP(int z) {
        number = z;
    }

    public String toString() {
        return String.format("Name: %s\n Number: %s", getName(), number);
    }
}

使用toString方法时,数字打印正常,但我只获得名称的null。我尝试使用方法名称,但这不会工作,我尝试使用n,但这不会工作。我只想澄清一下如何做到这一点,因为知道它会非常有帮助。

所以,这是我的主要方法

public class example3
{
    public static void main(String[] args) {
        example1 one = new example1();
        one.setName("Uri");
        example2 two = new example2();
        two.setUP(500);

        System.out.println(one.getName());
        System.out.println(two.toString());
    }
}

toString方法中的数字打印得很好,只是名称为空。

明显的解决方案

public class example3
{
    public static void main(String[] args) {
        example1 one = new example1("Uri");
        test2 two = new test2(one.getName());
        two.setUP(500);

        System.out.println(one.getName());
        System.out.println(two.toString());
    }
}

这很好用,但我不确定这有多优雅。

2 个答案:

答案 0 :(得分:3)

这与toString()无关。您还没有初始化对象的name成员,这就是为什么它被打印为null。

我在代码中看不到任何构造函数,因此您应该使用setName()方法初始化名称。

example2 ex = new example2();
ex.setUp(5);
ex.setName("John");
System.out.println(ex);

编辑:

在您发布的main中,您创建了两个对象,并仅在其中一个对象中设置名称。在另一方面,同样保持无效。 two.toString()不会打印名称,因为您只在one对象中设置了名称。

答案 1 :(得分:1)

只需添加一个构造函数:

public class example1
{
    private String name;
    int number;

    public example1(String names) {
        name = names;
    }

    public void setName(String names) {
        name = names;
    }

    public String getName() {
        return name;
    }
}

public class example2 extends example1
{
    public example2(String names) {
        super(names);
    }

    public void setUP(int z) {
        number = z;
    }

    public String toString() {
        return String.format("Name: %s\n Number: %s", getName(), number);
    }
}

Doeing,它调用初始化example1变量的name构造函数。现在,当调用getName()时,它返回通过构造函数传递的字符串。

现在,在main()

public static void main (String [] args) {
    example1 one = new example1("Uri");// a name is required
    example2 two = new example2("Uri");// a name is required
    two.setUP(500);

    System.out.println(one.getName());
    System.out.println(two.toString());
}