Java Setter和Constructor混淆

时间:2013-10-03 15:49:44

标签: java constructor setter

我对如何在Java中使用构造函数和setter感到困惑,请参阅下面的示例代码:

public class Name {
   private String name;

   public void setName(String name){
      this.name=name;
   }  
   public String getName(){
      return name;
   }
}

public static void main(String[] args) {
    Name a=new Name();
    a.setName("123");       
    System.out.println(a.getName());
}

打印出123,它是使用没有构造函数的setter方法,我还写了下面的其他代码:

public class Name {
   private String name;


   public Name(String nm){
      name=nm;
   }
   public String getName(){
      return name;
   }  
}



public static void main(String[] args) {
   Name a=new Name("123");

   System.out.println(a.getName());

}

这个也打印出123,它使用没有setter方法的构造函数,这就是为什么我不明白构造函数和setter之间使用的区别,请指教,欢呼!

7 个答案:

答案 0 :(得分:7)

如果要更改实例的name值,该怎么办?当然,你不会使用构造函数,因为它会创建一个新实例。在这种情况下,你会使用setter

当然,如果您正在编写不可变类,那么您不会给任何setters。实例字段中的任何修改都将创建一个新实例。

这里要理解的另一个重点是,由于您在第二个代码中提供了参数化构造函数,因此编译器不会添加任何默认构造函数。所以,第二类实际上没有任何0-arg构造函数。如果您想稍后使用它,那么您必须明确添加一个。

答案 1 :(得分:3)

如果您有一个setter,您可以在创建后随时更改该值。否则,在构造之后不能修改该字段(它是不可变的)。

答案 2 :(得分:3)

这一切都与name变量的必要性有关。如果将其设置为setter,则可以在不设置Name变量的情况下创建新的name对象。如果它在构造函数中,则无法在未指定Name属性的情况下创建新的name对象。

答案 3 :(得分:2)

你可以做到这两点。根据您的设计,这是您必须做出的选择。

设计类时,必须确保其实例始终处于一致状态。

在这种情况下,没有名称的类Name可能会被视为不一致。因此,在调用setter之前,您的类处于不一致状态。在这种情况下,更喜欢构造函数选项。

如果要允许重命名,也可以决定同时执行这两种操作(构造函数+设置器)。

更进一步:Java中的所有拳击类(Integer,Double,Float等)都是不可变的。因此,他们没有固定内含价值。

答案 4 :(得分:2)

理解它的最简单方法就是查看用于描述两种方法的词语:

Setter - 可用于设置 name,因此您可以在任何其他实例中更改name的值。

构造函数 - 我曾经构建 name,所以它会构建一个新的name因此你不能用它来改变原有的那个。

答案 5 :(得分:1)

构造函数创建一个对象的新实例,您可以使用您希望它最初采用的变量来实例化该对象。

Setters允许您在创建对象后更改变量的值。

Getters允许您访问变量的值,而无需实际让您访问它们。

答案 6 :(得分:0)

在您的问题中,在第一个代码段之后,您提到了:

  

打印出123,它使用没有构造函数的setter方法

我需要对此做一点澄清。说这里没有构造函数实际上是不对的。你在这里得到的是默认构造函数。除非您明确定义构造函数(参数化或非参数化),否则默认构造函数就在那里。 默认构造函数是编译器在未明确定义构造函数时自动生成的构造函数。 默认构造函数通常也称为 nullary构造函数,因为它不包含任何参数。

现在谈到这一点。在你的第一个代码中:

private String name; 

这是访问修饰符private和类型String的实例变量,它持有值null。为什么?因为,默认构造函数会将null分配给您的实例变量。这就是为什么它被称为 nullary构造函数

当您使用setter方法时,会为您的实例变量分配一定的值。

在这种情况下:

public void setName(String name){
      this.name=name;
   } 

public setter方法在其参数中包含值123,因为在创建Name类的对象之后,在main方法中提供了此值。像这样:

a.setName("123");

此值现在存储在您的实例变量中。

好的,在你的第二段代码中:

public Name(String nm){
      name=nm;
   }

您在此处创建的是用户定义的参数化构造函数。只要有用户定义的构造函数,就不再创建默认构造函数。用户定义的构造函数用于为实例变量赋值'not-null'。在这种情况下,您的构造函数在其参数中具有值123,因此123将分配给您的实例变量name

因为在main方法中,在对象创建期间:

Name a=new Name("123");

您在这些括号中提供了值123。这表示您正在创建一个参数化构造函数,它将采用123的String类型参数,该参数最终将分配给您的实例变量。

为了更好地理解有关getter-setter和构造函数的这些概念,请参阅以下链接:

Link-1

Link-2

Link-3