为什么 getName() returns 为空?
Why does getName() returns null?
编辑:感谢您的所有回答!我不知道 List.java 中的对象 p
与 Main.java 中的 p
不同。我将它作为参数传递,它现在工作正常。谢谢!
在Main.java中:
System.out.println("Enter your name:");
String name = scan.next();
name+=scan.nextLine();
String words[]=name.split("\s");
String capitalizeWord="";
for(String w:words){
String first=w.substring(0,1);
String afterfirst=w.substring(1);
capitalizeWord+=first.toUpperCase()+afterfirst+" ";
}
Person p = new Person(capitalizeWord);
在Person.java
private String name;
private int age;
Person(String newName){
name=newName;
}
Person(int newAge){
age=newAge;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
在List.java中:
public void printInvoice(){
System.out.println("Enter your age:");
int age = scan.nextInt();
Person p = new Person(age);
System.out.println("Thank you for shopping with us, "+p.getName());
}
最后的输出是
Thank you for shopping with us, null
我不知道为什么会这样。我做错什么了吗?我认为代码是正确的?
你有两个构造函数。一种接受字符串,一种接受数字。
在您最近的示例中,您调用了接受数字的那个,并且由于没有初始化 name
成员,它默认初始化为 null
。
Main.java
中的p
和List.java
中的p
没有任何关系(是两个不同的变量),所以初始化前者没有对后者的影响。
创建您的代码 person
-> Person p = new Person(age);
调用了构造函数 -> Person(int newAge){
age=newAge;
}
这个构造函数让名称具有他的默认值..所以null
每次调用构造函数时,您都会获得对象的不同实例。在 Main.java
中创建的具有名称的对象存储在仅存在于 Main.java
范围内的局部变量 p
中。在 List.java
中,您创建了第二个具有年龄但没有名称的对象。它也存储在一个名为 p
的变量中,但该变量仅在 List.java
的范围内,与之前创建的对象无关。
听起来您想将名称添加到较早的对象而不是创建新对象。为此,您应该将第一个对象作为参数传递给添加年龄的代码,可能像这样:
public void addAge(Person p) {
System.out.println("Enter your age:");
int age = scan.nextInt();
p.setAge(age); // will have to make this method in the Person class
System.out.println("Thank you for shopping with us, "+p.getName());
}
调用 Person p = new Person(age);
会得到一个全新的 Person 对象,它还没有名字。
正如我在您的 List.java class 中看到的,您已经实例化了一个新的 Person
对象 age
作为一个参数,因此对于该对象,名称将是 null
,因为两个引用变量指向不同的 Person
对象
对对象 Person
的第一个引用 p
已使用构造函数实例化了 person 对象:-
Person(String name) {
this.name = name;
}
对对象 Person
的第二次引用 p
已使用构造函数实例化了 person 对象:-
Person(int age) {
this.age = age;
}
您应该使用 setter 将 属性 age
设置为已创建的 Person
对象
编辑:感谢您的所有回答!我不知道 List.java 中的对象 p
与 Main.java 中的 p
不同。我将它作为参数传递,它现在工作正常。谢谢!
在Main.java中:
System.out.println("Enter your name:");
String name = scan.next();
name+=scan.nextLine();
String words[]=name.split("\s");
String capitalizeWord="";
for(String w:words){
String first=w.substring(0,1);
String afterfirst=w.substring(1);
capitalizeWord+=first.toUpperCase()+afterfirst+" ";
}
Person p = new Person(capitalizeWord);
在Person.java
private String name;
private int age;
Person(String newName){
name=newName;
}
Person(int newAge){
age=newAge;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
在List.java中:
public void printInvoice(){
System.out.println("Enter your age:");
int age = scan.nextInt();
Person p = new Person(age);
System.out.println("Thank you for shopping with us, "+p.getName());
}
最后的输出是
Thank you for shopping with us, null
我不知道为什么会这样。我做错什么了吗?我认为代码是正确的?
你有两个构造函数。一种接受字符串,一种接受数字。
在您最近的示例中,您调用了接受数字的那个,并且由于没有初始化 name
成员,它默认初始化为 null
。
Main.java
中的p
和List.java
中的p
没有任何关系(是两个不同的变量),所以初始化前者没有对后者的影响。
创建您的代码 person
-> Person p = new Person(age);
调用了构造函数 -> Person(int newAge){
age=newAge;
}
这个构造函数让名称具有他的默认值..所以null
每次调用构造函数时,您都会获得对象的不同实例。在 Main.java
中创建的具有名称的对象存储在仅存在于 Main.java
范围内的局部变量 p
中。在 List.java
中,您创建了第二个具有年龄但没有名称的对象。它也存储在一个名为 p
的变量中,但该变量仅在 List.java
的范围内,与之前创建的对象无关。
听起来您想将名称添加到较早的对象而不是创建新对象。为此,您应该将第一个对象作为参数传递给添加年龄的代码,可能像这样:
public void addAge(Person p) {
System.out.println("Enter your age:");
int age = scan.nextInt();
p.setAge(age); // will have to make this method in the Person class
System.out.println("Thank you for shopping with us, "+p.getName());
}
调用 Person p = new Person(age);
会得到一个全新的 Person 对象,它还没有名字。
正如我在您的 List.java class 中看到的,您已经实例化了一个新的 Person
对象 age
作为一个参数,因此对于该对象,名称将是 null
,因为两个引用变量指向不同的 Person
对象
对对象 Person
的第一个引用 p
已使用构造函数实例化了 person 对象:-
Person(String name) {
this.name = name;
}
对对象 Person
的第二次引用 p
已使用构造函数实例化了 person 对象:-
Person(int age) {
this.age = age;
}
您应该使用 setter 将 属性 age
设置为已创建的 Person
对象