如何控制Java中变量的可见性?

如何控制Java中变量的可见性?,java,variables,global,visibility,local,Java,Variables,Global,Visibility,Local,我可以想象变量的3种可见性,但我认为还有更多: 变量在方法中使用,并且该变量的值的任何更改从方法外部都不可见,因此它对于特定方法是局部的 变量是类的局部变量,这意味着从类的outisde无法看到它。但是,该类的任何方法都可以很容易地查看和更改该变量的值,而无需在方法的参数列表中给出该变量,因此它在类中是全局的 可以通过objectName.variableName访问变量 如何声明这些不同类型的变量?1在方法中声明的任何变量仅在该方法中可见。方法本地。程序员在这方面别无选择 2任何使用修饰符pr

我可以想象变量的3种可见性,但我认为还有更多:

变量在方法中使用,并且该变量的值的任何更改从方法外部都不可见,因此它对于特定方法是局部的


变量是类的局部变量,这意味着从类的outisde无法看到它。但是,该类的任何方法都可以很容易地查看和更改该变量的值,而无需在方法的参数列表中给出该变量,因此它在类中是全局的

可以通过objectName.variableName访问变量


如何声明这些不同类型的变量?

1在方法中声明的任何变量仅在该方法中可见。方法本地。程序员在这方面别无选择

2任何使用修饰符private声明的变量都只能从其所属类的实例中看到

3公共变量可以通过object.variable从任何类访问;受保护的变量只能通过这种方式从子类访问;只有在声明变量的类的实例中,才能以这种方式访问私有变量

有关详细信息和参考,请参阅

但是:将类成员变量公开给其他类是一种不好的做法,应该使用以下方法启用访问:

public class MyClass {
  private int myInt;

  public int getMyInt() {
    return myInt;
  }

  public void setMyInt(int newInt) {
    myInt = newInt;
  }
}

1方法中声明的任何变量仅在该方法中可见。方法本地。程序员在这方面别无选择

2任何使用修饰符private声明的变量都只能从其所属类的实例中看到

3公共变量可以通过object.variable从任何类访问;受保护的变量只能通过这种方式从子类访问;只有在声明变量的类的实例中,才能以这种方式访问私有变量

有关详细信息和参考,请参阅

但是:将类成员变量公开给其他类是一种不好的做法,应该使用以下方法启用访问:

public class MyClass {
  private int myInt;

  public int getMyInt() {
    return myInt;
  }

  public void setMyInt(int newInt) {
    myInt = newInt;
  }
}
1:就像int i一样;方法内

2:使用私有修饰符或受保护修饰符

3:使用public

1:就像inti一样;方法内

2:使用私有修饰符或受保护修饰符


3:使用public

重要的是要记住:如果在类中声明变量,并且不使用任何访问修饰符,那么它将是包私有的。这意味着从同一个包中的其他类可以使用objectname.variable引用它,而从其他包中的类则不能引用它。

重要的是要记住:如果在类中声明变量,并且不使用任何访问修饰符,那么它将是包私有的。这意味着从同一个包中的其他类可以使用objectname.variable引用它,而从其他包中的类则不能引用它。

不要忘记,首先省略修饰符会使它成为包私有的。这使得它在类外可见,但仅在本地包内可见,这是非常有用的。事实上,但问题中的用例并没有涉及到这一点:事实上——既然你提到了@chrisdennett,我必须承认我从来没有必要使用包私有。我一直认为它引入了对包结构不必要的依赖,并且用处非常有限。在这一点上还有另一个问题,如果您有未涉及的用例,您可能会想发布一个答案:当您希望共享方法,但不希望外部代码看到它时,它非常有用。否则,您必须在没有内部方法的情况下处理接口,然后从接口转换为实际类,如果在某些情况下人们决定自己实现接口,这可能会导致问题!不要忘记,首先省略修饰符会使包私有化。这使得它在类外可见,但仅在本地包内可见,这是非常有用的。事实上,但问题中的用例并没有涉及到这一点:事实上——既然你提到了@chrisdennett,我必须承认我从来没有必要使用包私有。我一直认为它引入了对包结构不必要的依赖,并且用处非常有限。在这一点上还有另一个问题,如果您有未涉及的用例,您可能会想发布一个答案:当您希望共享方法,但不希望外部代码看到它时,它非常有用。否则,您必须在没有内部方法的情况下处理接口,然后从接口转换为实际类,如果在某些情况下人们决定自己实现接口,这可能会导致问题!所以它在类内是一种全局的:类的实全局是一个静态变量。应该注意的是,3通常被认为是一个坏主意。所以它在类内是一种全局的:类的实全局是一个静态变量。Sho 请注意,3通常被认为是一个坏主意。