当成员是私有类实例时,类如何看到另一个类的公共成员

时间:2016-03-24 14:34:56

标签: java

我是一名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

1 个答案:

答案 0 :(得分:2)

  

由于TESTprivate(我猜是假设)

不。它实际上是package-private

来自Java Tutorials

  

如果一个类没有修饰符(默认的,也称为包私有),它只在自己的包中可见

修改

您的HelloWorldTEST类都是同一个软件包的成员(在您的情况下,由于您似乎没有明确指定软件包,因此它们是未命名的软件包的成员包)。因此,即使TEST是包私有的,也可以从HelloWorld访问。

  

现在这个奇怪的部分,当我把TEST移到一个私人的内部类时   Newfile现在表现得像我希望上述实验一样   表现得很好,我得到了:

i in Newfile.TEST is defined in an inaccessible class or interface

通过TEST成为private Newfile内部类,您只能让Newfile类本身的成员访问它,所以,当然,它不是在这种情况下,HelloWorld可以访问更长时间。