3

我对如何在 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方法的constructor,这就是为什么我不明白constructor和setter的使用有什么区别,请指教,干杯!

4

7 回答 7

7

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

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

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

于 2013-10-03T15:51:34.673 回答
3

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

于 2013-10-03T15:53:21.960 回答
3

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

于 2013-10-03T15:54:20.180 回答
2

你可以两者都做。这是您必须根据您的设计做出的选择。

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

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

如果您想允许重命名,您也可以决定两者都做(构造函数 + 设置器)。

更进一步:Java 中的所有装箱类(Integer、Double、Float 等)都是不可变的。因此,它们的内含价值没有设定者。

于 2013-10-03T15:53:43.510 回答
2

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

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

构造器 - 我曾经构造 name,所以它会构造一个新的name,因此你不能用它来改变预先存在的。

于 2013-10-03T16:05:12.683 回答
1

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

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

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

于 2013-10-03T16:26:22.567 回答
0

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

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

我需要对此做一个小小的澄清。说这里没有构造函数实际上是不对的。你在这里得到的是默认构造函数。除非您显式定义构造函数(参数化或非参数化),否则默认构造函数存在。如果程序员没有显式定义构造函数,默认构造函数是编译器自动生成的一个构造函数。默认构造函数通常也称为空值构造函数,因为它不包含任何参数。

现在说到重点。在您的第一个代码中:

private String name; 

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

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

在这种情况下:

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

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

a.setName("123");

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

好的,在您的第二个代码中:

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

您在这里创建的是用户定义的参数化构造函数。只要有用户定义的构造函数,就不再创建默认构造函数。用户定义的构造函数用于为您的实例变量分配一个“非空”值。在这种情况下,您的构造函数123在其参数中具有值,因此123将分配给您的实例变量name

由于在您的主要方法中,在对象创建期间:

Name a=new Name("123");

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

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

链接-1

Link-2

Link-3

于 2015-08-11T07:54:26.567 回答