Java 字符串方法返回null

Java 字符串方法返回null,java,string,methods,Java,String,Methods,我试图自学Java编程,来自Python和MatLab背景。在下面的代码中,第一组代码返回使用我定义的默认构造函数时应该返回的内容。然而,在第二组代码中,当我尝试使用特定构造函数时,结果是“null”。我试图理解为什么特定的构造函数返回null,以及如何解决这个问题 第一个代码段: public class Name { String firstName; String middleName; String familyName; public Name() {

我试图自学Java编程,来自Python和MatLab背景。在下面的代码中,第一组代码返回使用我定义的默认构造函数时应该返回的内容。然而,在第二组代码中,当我尝试使用特定构造函数时,结果是“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); 
   }
}

您的各种setter方法没有设置类成员,它们只是设置局部变量。将setFirst更改为:

   public void setFirst(String f) { 
      this.firstName = f; 
   }

您的各种setter方法没有设置类成员,它们只是设置局部变量。将setFirst更改为:

   public void setFirst(String f) { 
      this.firstName = f; 
   }

在setter方法中声明新的局部变量(与成员同名):

String familyName = fam; 
只要写下:

familyName = fam; 

最好在其中一个成员前面加前缀(例如,加上“my”),以便将其与局部变量区分开来。我建议使用复杂的IDE,它会警告您声明与成员同名的局部变量。

在setter方法中声明新的局部变量(与成员同名):

String familyName = fam; 
public void setMiddle(String m) { 
  String middleName = m; 
}
只要写下:

familyName = fam; 
最好在其中一个成员前面加前缀(例如,加上“my”),以便将其与局部变量区分开来。我建议使用一个复杂的IDE,它会警告您声明一个与成员同名的局部变量

public void setMiddle(String m) { 
  String middleName = m; 
}
这只是在内存中创建一个名为middleName的新对象

要设置middleName字段的值,不应创建新对象,而应引用该字段:

public void setMiddle(String m) { 
   middleName = m; 
}
这只是在内存中创建一个名为middleName的新对象

要设置middleName字段的值,不应创建新对象,而应引用该字段:

public void setMiddle(String m) { 
   middleName = m; 
}

您没有设置在实例级别定义的字段。您正在set方法中声明一个新变量,而不是执行
此操作。propertyName
etcin在从构造函数调用的setFirst方法中,您正在将firstname分配给只具有方法setFirst作用域的新变量firstname。您需要像这样将该变量分配给当前实例;在我看来,您的public Name()被使用两次可能会导致一些问题。到处都有方法。你可能想了解更多关于方法的知识以及如何更多地使用它们(这里是一个很好的学习网站):FYI toString不是一个mutator,因为它不会更改对象的状态。您没有设置在实例级别定义的字段。您正在set方法中声明一个新变量,而不是从构造函数调用的this.propertyNameetcin setFirst方法,您正在将firstname分配给新变量firstname,该变量的作用域仅为方法setFirst。您需要像这样将该变量分配给当前实例;在我看来,您的public Name()被使用两次可能会导致一些问题。到处都有方法。您可能想了解更多关于方法以及如何更多地使用它们的信息(这里是一个很好的学习站点):FYI toString不是一个变体,因为它不会改变对象的状态。