【发布时间】:2011-11-19 00:57:15
【问题描述】:
如果不是:
private JButton theButton;
我这样定义一个字段:
JButton theButton;
有什么区别?
【问题讨论】:
标签: java
如果不是:
private JButton theButton;
我这样定义一个字段:
JButton theButton;
有什么区别?
【问题讨论】:
标签: java
包。它们对同一包中的其他类可见。
FWIW,我通常在这些上使用我自己的无操作 @Package 注释,只是为了清楚地表明我知道我在做什么——我不只是忘记了一些东西。尽管它是默认设置,但包访问在高质量代码中的使用可能比其他三种可能性中的任何一种都少——有一个很大的例外:
在某些风格的单元测试中,希望能够访问通常是私有的方法或字段。提供访问的一种方法是将它们设置为包访问,并将单元测试类放在同一个包中(但通常在不同的“测试”目录树中)。一些开发人员认为这是不好的做法——一般来说,在测试中使用私有(或用于测试的包)方法是不好的。
【讨论】:
在 Java 中有公共、受保护、包(默认)和私有可见性;从最显眼到最显眼的顺序排列。
如果不指定,默认可见性为package。
package mytest.myvisibility;
public class MyClass
{
public int myPublicInt; // visible to all
protected myProtectedInt; // visible to subclasses of MyClass and to other members of the mytest.myvisibility package
int myPackageInt; // visible only to other members of the mytest.myvisibility package
private int myPrivateInt; // visible only to MyClass objects
}
【讨论】:
与 c 上的静态函数相同。仅在同一个文件中可见。
【讨论】:
这是一个有用的概述,显示了每个修饰符允许的访问:
| Modifier | Class | Package | Subclass | World |
|---|---|---|---|---|
| public | Y | Y | Y | Y |
| protected | Y | Y | Y | N |
| no modifier | Y | Y | N | N |
| private | Y | N | N | N |
第一个数据列表示类本身是否有权访问由访问级别定义的成员。如您所见,一个类总是可以访问它自己的成员。第二列指示与该类位于同一包中的类(无论其父级如何)是否可以访问该成员。第三列表示在这个包之外声明的类的子类是否可以访问该成员(即扩展这个类的类)。第四列表示是否所有类都可以访问该成员。
【讨论】: