[英]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和构造函数的这些概念,请参阅以下链接:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.