我是一名C ++程序员,试图了解Java语言的最佳实践。请相应地定制您的回复:)
我找到了一个例子,我不明白为什么/我观察到的行为是可行的。
//HelloWorld.java
public class HelloWorld{
public static void main(String []args){
Newfile nf = new Newfile();
nf.setTest(5);
System.out.println(Integer.toString(nf.test.i));
System.out.println("Hello World");
}
}
//Newfile.java
class TEST {
public int i;
}
public class Newfile{
public TEST test = new TEST();
public int setTest(int i) {
return test.i = i;
}
}
// THIS WORKED
/*
5
Hello World
*/
由于Test
是私有的(我认为是这样),那么HelloWorld
如何操纵TEST
的内容(即i
成员)?
现在奇怪的是,当我将TEST
移动到私人内部类Newfile
时,它现在表现得像我预期的那样,上述实验表现得很好,我得到了:
i in Newfile.TEST is defined in an inaccessible class or interface
答案 0 :(得分:2)
由于
TEST
是private
(我猜是假设)
不。它实际上是package-private
。
如果一个类没有修饰符(默认的,也称为包私有),它只在自己的包中可见
修改强>
您的HelloWorld
和TEST
类都是同一个软件包的成员(在您的情况下,由于您似乎没有明确指定软件包,因此它们是未命名的软件包的成员包)。因此,即使TEST
是包私有的,也可以从HelloWorld
访问。
现在这个奇怪的部分,当我把TEST移到一个私人的内部类时 Newfile现在表现得像我希望上述实验一样 表现得很好,我得到了:
i in Newfile.TEST is defined in an inaccessible class or interface
通过TEST
成为private
Newfile
内部类,您只能让Newfile
类本身的成员访问它,所以,当然,它不是在这种情况下,HelloWorld
可以访问更长时间。