2

在一个类中,您可以在其中创建字段,如以下示例中的 int bar。

Class foo{
    int bar;
    foo(int bar){
         bar = bar;
    }

    int getBar() {
         return bar;
    }   

    void setBar(int bar) {
         bar = bar;
    }
}
  1. 每次我在另一个类中创建一个新的 foo 对象时,该特定对象(foo 的实例)是否会有一个 bar 属性,当使用 setBar() 更改时,只会影响该实例而不影响其他实例?

  2. 我经常看到人们在上面的示例中为 bar 等属性创建 getter 和 setter。如果我觉得懒惰并且我只是为自己/乐趣编写代码,我是否可以通过访问该属性FooInstance1.bar = 22;而不是编写 setter 来修改该类的任何实例的 bar 属性,它的效果与问题相同1(只是实例被改变了)?

  3. Java 编译器如何知道构造函数是什么方法?由于它与类具有相同的名称吗?还是由于没有在函数头中指定返回值这一事实?也许编译器认为什么是构造函数甚至都无关紧要(常规函数之间没有语法差异),它可能只是人们用来区分函数含义的语义事物。

编辑:我很难选择最佳答案。我从每个人身上学到了一些新东西。谢谢!

4

5 回答 5

3
  1. 是的,这就是成员变量的行为,每个实例都存在一个副本。static另一方面,变量是类级变量,所有实例共享一个副本。

  2. 最好不要直接公开成员并提供 getter 来访问它们。公共 setter 通常也不鼓励更好地控制对象状态的修改方式。但是,是的,一旦您将它们声明为公开,您也可以直接修改它们。

  3. 是的,构造函数是没有返回类型且名称与类相同的特殊方法。

于 2012-12-04T01:53:50.503 回答
3

1) 是的。这是正确的。

2)是的,你可以,但最好的做法是使用 getter 和 setter。这样,类的作者可以为确保在 get 或 set 上执行的属性编写特殊的逻辑。例如,某些属性可能是动态计算的,或者当属性更改时会向侦听器发送通知。

3) 构造函数是没有返回值并且与类同名的方法。可以有任意数量的构造函数,但每个构造函数都必须具有唯一的参数类型组合。

于 2012-12-04T01:53:02.363 回答
2
  1. 是的。
  2. 是的,但不鼓励这样做。使用 OO,您试图隐藏有关您的实例变量的信息,并根据需要为它们提供访问权限。此外,将变量设置为public使其容易受到无意写入或非特权读取的影响。
  3. Java 通过其签名识别每个方法。签名由其名称和参数类型组成。例如,该main方法的签名为main(String[]). 构造函数由它们标识,它们具有与类相同的区分大小写的名称。

顺便说一句,您可能想this.bar = bar改用,或完全重命名传入参数。在构造函数内部,bar变量的范围对于传入的内容是本地的,因此您的实例级别bar尚未分配。

于 2012-12-04T01:56:42.117 回答
2
  1. 是的。这正是它的工作原理。

  2. 是的,您可以这样做,但您必须将该字段声明为公开:

    public int bar;

    请注意,这通常是一个坏主意,应该避免。

  3. 是的,构造函数与类具有相同的名称,并且没有返回类型。

笔记:

您应该始终将类的名称大写。

于 2012-12-04T01:51:47.230 回答
1

Q1 & Q3 得到了很好的答案。只需为 Q2 添加一些内容:

即使您是为了好玩而编写代码,当您发现没有访问器就无法实现一些功能时,您可能会感到失望。

  1. 您不希望人们更改该字段的值,但仍对其具有读取权限。

  2. 当您设置字段值时,您可能希望为其提供一些验证机制。您可以在 setter 中进行验证。

  3. 如果你想玩反射、序列化、模拟对象等,你应该有 getter 和 setter。

仅列举一些没有访问器可能无法实现的功能。还有很多!

于 2012-12-04T02:39:23.613 回答