繁体   English   中英

Java Setter和Constructor混淆

[英]Java Setter and Constructor confusion

我对如何在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之间使用的区别,请指教,欢呼!

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

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

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

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

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

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

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

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

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

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

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

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

构造函数 - 我曾经构造过 name ,因此它会构造一个新name ,因此你无法使用它来更改预先存在的名称。

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

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

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

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

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

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

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

private String name; 

这是访问修饰符private和String类型的实例变量 ,它保持值为null 为什么? 因为,默认构造函数为您的实例变量赋值null 这就是为什么它被称为一个无效的构造函数

当您使用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-type参数,该参数最终将分配给您的实例变量。

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

链接-1

LINK-2

链路3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM