我正在尝试教我自己的Java编程,来自Python和MatLab背景。在下面的代码中,第一组代码返回使用我定义的默认构造函数时应该返回的内容。但是在第二组代码中,当我尝试使用特定的构造函数时,结果为" null null null"。我试图理解为什么特定的构造函数返回null null null以及我如何解决这个问题。
第一段代码:
public class Name {
String firstName;
String middleName;
String familyName;
public Name() {
firstName = " ";
middleName = " ";
familyName = " ";
}
public Name(String firstName, String middleName, String familyName) {
setFirst(firstName);
setMiddle(middleName);
setFamily(familyName);
}
// setFirst(): first name mutator method
public void setFirst(String f) {
String firstName = f;
}
// setMiddle(): middle name mutator method
public void setMiddle(String m) {
String middleName = m;
}
// setFamily(): family name mutator method
public void setFamily(String fam) {
String familyName = fam;
}
// getFirst(): accessor method
public String getFirst() {
return firstName;
}
// getMiddle(): accessor method
public String getMiddle() {
return middleName;
}
// getFamily(): accessor method
public String getFamily() {
return familyName;
}
// toString(): mutator method
public String toString() {
return getFirst() + " " + getMiddle() + " " + getFamily();
}
public static void main(String[] args) {
Name myName = new Name();
String myNameString = myName.toString();
System.out.print("\n" + myNameString);
}
}
第二段代码:
public static void main(String[] args) {
Name myName = new Name("John", "Doe", "Smith");
String myNameString = myName.toString();
System.out.print("\n" + myNameString);
}
}
答案 0 :(得分:3)
执行此操作时:
public void setFirst(String f) {
String firstName = f;
}
您没有在对象中设置firstName
字段。相反,您正在创建一个不相关的本地变量,该变量恰好具有相同的名称。然后将f
的值赋给该局部变量,然后立即超出范围。同时,该字段的默认值仍为null
。
相反,这样做:
public void setFirst(String f) {
firstName = f;
}
通过删除类型,它不再是变量声明,因此您只需将值分配给现有字段。
答案 1 :(得分:1)
您的各种setter方法不是设置类成员,而只是设置局部变量。将setFirst更改为:
public void setFirst(String f) {
this.firstName = f;
}
答案 2 :(得分:1)
在setter方法中声明新的局部变量(与成员同名):
String familyName = fam;
只需写下:
familyName = fam;
优良作法是为成员(例如“我的”)添加前缀,以便将其与局部变量区分开来。我建议使用一个复杂的IDE,它会警告你声明一个与成员同名的局部变量。
答案 3 :(得分:1)
public void setMiddle(String m) {
String middleName = m;
}
这只是在内存中创建一个名为middleName的新对象。
要在middleName字段上设置值,您不应创建新对象,而是引用字段:
public void setMiddle(String m) {
middleName = m;
}