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

Posted

技术标签:

【中文标题】如何控制 Java 中变量的可见性?【英文标题】:How to control visibility of variables in Java? 【发布时间】:2011-01-24 17:59:54 【问题描述】:

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

    变量在方法中使用,并且该变量的值的任何变化在方法外部是不可见的(因此它对于特定方法是局部的)。

    变量是类的本地变量,这意味着它在类外部是不可见的。但是,该类的任何方法都可以轻松查看和更改该变量的值,而无需在方法的参数列表中提供该变量(因此它在类中是全局的)。

    可以通过“objectName.variableName”访问变量。

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

【问题讨论】:

“(所以它在类中是一种全局)”:一个真正的“全局”类是一个static 变量。 应该注意的是,3通常被认为是一个坏主意。 【参考方案1】:

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

2) 使用修饰符 private 声明的任何变量仅在它所在的类的实例中可见。

3) public 变量可以通过object.variable从任何类访问; protected 变量只能从子类以这种方式访问​​; private 变量只能在声明变量的类的实例中以这种方式访问​​。

有关详细信息和参考,请参阅Java Learning Trail on Sun's website。

但是:将类成员(变量)暴露给其他类是不好的做法,应使用以下方法启用访问,例如:

public class MyClass 
  private int myInt;

  public int getMyInt() 
    return myInt;
  

  public void setMyInt(int newInt) 
    myInt = newInt;
  

【讨论】:

别忘了一开始就省略修饰符会使它成为包私有的。这使它在类外可见,但仅在本地包内可见(这非常有用)。 java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html 确实如此,但问题中的用例并未涵盖这一点:) 实际上 - 既然你提到了@Chris Dennett,我不得不承认我从来不需要使用包私有。我一直认为它引入了对包结构的不必要依赖,并且有用性非常有限。如果您有未涵盖的用例,您可能想在这一点上发布另一个 SO 问题 :) 当您想共享方法但又不想让外部代码看到它时,它真的很有用。否则你必须弄乱接口(没有内部方法),然后从接口转换为真正的类(如果人们决定在某些情况下自己实现接口,这可能会导致问题!)【参考方案2】:

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

【讨论】:

【参考方案3】:

1:就像方法中的 int i; 一样

2:使用private修饰符或protected修饰符

3:使用public

【讨论】:

以上是关于如何控制 Java 中变量的可见性?的主要内容,如果未能解决你的问题,请参考以下文章

Java 并发编程:如何保证共享变量的可见性?

Java内存模型之可见性问题

子组件如何在子组件初始化时控制父组件中自身的可见性?

细说Java多线程之内存可见性

Java线程安全:可见性,原子性,有序性

慕课网学习笔记Java共享变量的可见性和原子性