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

How would one use this toString method for private variables via inheritance?

通常,对于我使用的 toString 方法,String.format ("%s, %s", variable, variable) 并且它工作得很好。

为了更清楚的例子,

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());
    }
}

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

这与toString()无关。您尚未初始化对象的 name 成员,这就是它被打印为 null 的原因。

我在你的代码中没有看到任何构造函数,所以你可能应该使用 setName() 方法来初始化名称。

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

编辑:

在您发布的 main 中,您创建了两个对象并仅在其中一个中设置了名称。另一方面,相同的内容仍然为空。 two.toString() 不打印名称,因为您只在 one 对象中设置了名称。

只需添加一个构造函数:

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);
    }
}

这样做,它调用初始化 name 变量的 example1 构造函数。现在,当调用 getName() 时,它 returns 字符串通过了构造函数。

现在,在 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());
}