如何通过继承将这种 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());
}
通常,对于我使用的 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());
}