Java中的Set、Get和构造函数

Java中的Set、Get和构造函数,java,constructor,Java,Constructor,尽管有Java教程、Wikipedia搜索、stackoverflow trolling和数小时的代码示例阅读,构造器仍然把我搞糊涂了。我有三个相关的问题,我一直试图回答,以帮助我更好地了解构造函数 首先,我的印象是,构造函数的名称必须与其类的名称相同。考虑: public class Money { public Money(long l) { this.value = l; } public Money(String s) { thi

尽管有Java教程、Wikipedia搜索、stackoverflow trolling和数小时的代码示例阅读,构造器仍然把我搞糊涂了。我有三个相关的问题,我一直试图回答,以帮助我更好地了解构造函数

首先,我的印象是,构造函数的名称必须与其类的名称相同。考虑:

public class Money {
    public Money(long l) {
        this.value = l;
    }

    public Money(String s) {
        this.value = toLong(s);
    }

    public long getLong() {
        return this.value;
    }

    public String getString() {
        return toString(this.value);
    }
} 
 public class GetSetSample {
     public int getFoo()  {
 return int Foo;
 }
 public void setFoo(int fooValue) {
 int Foo = fooValue;
 } 
} 
我认为这是四个构造器…对吗?因此,构造函数的名称似乎与包含它们的类的名称不同。有人能证实吗

第二,我似乎对理解set和get方法有阻碍。考虑:

public class Money {
    public Money(long l) {
        this.value = l;
    }

    public Money(String s) {
        this.value = toLong(s);
    }

    public long getLong() {
        return this.value;
    }

    public String getString() {
        return toString(this.value);
    }
} 
 public class GetSetSample {
     public int getFoo()  {
 return int Foo;
 }
 public void setFoo(int fooValue) {
 int Foo = fooValue;
 } 
} 
为什么我不能这样做:

public class getFoo(int fooValue){
     foo=fooValue;
}
public class getFoo(int fooValue){
    foo=fooValue;
}
并使用来自其他类/方法的
foo=getFoo(12)


第三个问题有点深奥,但会帮助我构想更大的图景…这是我的学习风格,有助于我在调试时跟踪程序流的能力。
get
set
方法建议与我建立“to”和“from”关系。e、 例如,将值“传递”给构造函数,从get方法“接收”结果。在我看来,“to”和“from”将根据你的观点而改变。我认为任何
setMethod
都是为一个对象设置参数,即使变量来自另一个类或方法,
GetMethod
get
使用适当的
set
参数设置结果对象(比如,
this.foo
)。无论在何处使用
get
set
,在主方法或具有单个构造函数的独立类中,“set”始终与发送参数相关联,
get
始终与接收具有该参数的对象相关联。这是一个很好的理解吗?还是我遗漏了一个重要部分?

您已经展示了两个构造函数,它们确实需要与类同名

您还展示了两个“getter”方法,它们以用户请求的形式返回类变量的值。您还可以创建“setter”方法,用于将值转换为类变量

您可以使用构造函数创建特定类的对象,还可以选择设置其部分或全部内部状态(即其成员变量)

您使用setter和getter将类变量与外部世界隔离开来,因此不需要允许其他代码直接访问它们。为什么?因为,在setter更新变量之前,它可以验证新值是否有效,以及操作是否违反类正常工作所需的任何规则(“业务逻辑”)

因此,您可以添加setter并更新构造函数以使用它:

public Money(long l) {
    setValue(l);
}

public Money(String s) {
    setValue(toLong(s));
}

// Example setter that validates `l` by prohibiting negative values
public Money setValue(long l) {
  if (l < 0) {
    // Warn about negative values
  }
  this.value = l;
  return this;  // Return the current object to allow chaining; see below.
}
这将创建类型为
Money
的对象,设置各种属性,并将其存储在变量
earnings
中。显然,这对于这样一个简单的类来说并不是非常有用,但对于更复杂的类来说却非常有用:

Paycheck check = new Paycheck("MyCompany")
  .setEmployee("YourName")
  .setSalary(50,000)
  .setPaySchedule(Schedule.BIWEEKLY)
  .setAccountNumber("1234567")
  .setDefaultTaxRate();
问题1:

我认为这是四个构造器…对吗

不,该类有两个构造函数和两个方法。(
getLong
getString
是方法。)

问题2:

为什么我不能这样做:

public class getFoo(int fooValue){
     foo=fooValue;
}
public class getFoo(int fooValue){
    foo=fooValue;
}
好吧,这是在试图用参数声明一个类,并且在get方法中设置一个值,这将非常奇怪。现在还不清楚您试图在这里实现什么,但该代码完全无效

问题3:

get和set方法向我暗示了一种“到”和“从”的关系

嗯,在我看来,这不是一种真正的关系。一种关系意味着比这两种方法都更长期的东西。setter通常以某种方式更改对象的状态,getter通常只返回对象状态的某些方面。现在还不太清楚你其余的解释是什么意思,因为你在玩弄术语。例如:“
get
总是与接收带有该参数的对象相关联”对我来说没有意义。对象没有参数,方法/构造函数有-getter可以获取原语值或引用


我想你会从阅读中受益,它讨论了构造函数和方法。

关于第一个答案,只有两个构造函数。区别在于如何调用它们(使用字符串调用将使用具有参数的字符串的构造,使用long调用将使用另一个)。因此,答案是肯定的,构造函数与类具有相同的名称

两位施工人员:

public Money(long l) {
        this.value = l;
    }

    public Money(String s) {
        this.value = toLong(s);
    }
关于第二个答案,getter和setter并不意味着类。他们应该在班级内部

考虑以下示例,该示例使用getter和setter获取打印机类的ans设置值:

public class Printer {

    @Inject @Informal Greeting greeting;

    private String name;
    private String salutation;

    public void createSalutation() {
        this.salutation = greeting.greet(name);
    }

    public String getSalutation() {
        return salutation;
    }

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

    public String getName() {
       return name;
    }
}
好好阅读一下这个链接肯定能帮到你!

我想试着回答你隐含的概念性问题——你已经有很多这样那样的例子了,所以我想试着解释一下。我毫不怀疑,你们以前听过大部分——也许所有这些——但我不确定,也不确定是哪一部分

面向对象编程主要以对象为中心;对象是代码和数据的合并。通过编写类来定义对象,并使用类构造函数(称为实例化类)创建该类定义的对象的一个或多个副本

其他语言中的并行程序:您可以有一个相关项的数据结构和一组在该数据结构上操作的子程序。将类看作是将数据结构中的项和对其进行操作的子例程收集到一个单元中的一种方式

调用构造函数后,就有了该类中定义的数据的副本以及引用该副本的方法。引述