Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类的字段和实例上的基本Java/OOP不确定性_Java - Fatal编程技术网

类的字段和实例上的基本Java/OOP不确定性

类的字段和实例上的基本Java/OOP不确定性,java,Java,在类中,可以在这些字段中创建字段,如以下示例中的int-bar Class foo{ int bar; foo(int bar){ bar = bar; } int getBar() { return bar; } void setBar(int bar) { bar = bar; } } 每次我在另一个类中创建一个新的foo对象时,该特定对象(foo的实例)是否会有一个ba

在类中,可以在这些字段中创建字段,如以下示例中的int-bar

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

    int getBar() {
         return bar;
    }   

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

  • 我经常看到人们为上面示例中的bar之类的属性创建getter和setter。如果我觉得很懒,只是在为自己/乐趣编写代码,我可以通过访问属性
    FooInstance1.bar=22来修改这个类的任何实例的bar属性吗
    不必编写setter,它将具有与问题1相同的效果(只是实例发生了更改)

  • Java编译器如何知道什么方法是构造函数?因为它与类同名?或者由于没有在函数头中指定返回值?也许编译器认为什么是构造函数并不重要(常规函数之间没有语法上的区别),它可能只是人们用来区分函数含义的语义

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

  • 对。这就是它的工作原理

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

    public int-bar

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

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

  • 注意:

    您应该始终将类名大写。

    1)是的。没错

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

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

  • 是的,这是成员变量的行为,每个实例都有一个副本<另一方面,代码>静态变量是类级变量,所有实例共享一个副本

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

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

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

  • 另一方面,您可能希望改用
    this.bar=bar
    ,或者完全重命名传入参数。在构造函数内部,
    bar
    变量的作用域是传入内容的局部变量,因此您的实例级别
    bar
    尚未分配。

    Q1和Q3得到了很好的答案。只需为第二季度添加一些内容:

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

  • 您不希望人们更改字段的值,但仍然具有对该字段的读取权限

  • 设置字段值时,可能需要为其提供一些验证机制。您可以在setter内部进行验证

  • 如果您想使用反射、序列化、模拟对象等,那么您需要有getter和setter


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

    reg2:默认字段访问修饰符不是公共的吗?@wuschelbeutelkartofelhuhn-默认范围是包私有的。+1获取有关重命名参数或使用此的建议(我一直不明白为什么有人会为参数选择相同的名称,但它一直都是公共的)。您的“bar=bar;”语句将无效。我很确定你想做“this.bar=bar;”