String方法返回null

时间:2016-03-26 18:08:28

标签: java string methods

我正在尝试教我自己的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); 
   }
}

4 个答案:

答案 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; 
}