2016-03-24 3 views
-1

Я программист на 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

'Test' является закрытым пакетом, не полностью закрытым. Это означает, что к нему можно получить доступ к содержимому в одном пакете. (Я предполагаю, что они в одном пакете) – SomeJavaGuy

+0

Downvoter, пожалуйста, объясните? Downvoting, стал настолько случайным, что он потерял свою ценность. Вопрос, ясный, краткий, а не домашнее задание (очевидно). Когда вы находите вопрос легким или очевидным, это не значит, что это плохо. – Kam

+0

не путник, но вы можете поспорить, что никаких усилий по поиску нет. Вы предполагаете, что это личное, не исследуя, действительно ли это так. – SomeJavaGuy

ответ

2

Since TEST is private (well I presume)

Неа. На самом деле это package-private.

От Java Tutorials:

If a class has no modifier (the default, also known as package-private), it is visible only within its own package


EDIT

И ваш HelloWorld и ваши TEST классы являются членами одного и того же пакета (в вашем случае, так как вы, кажется, не имеют явно указали пакет, они являются членами неназванного пакета). Поэтому, хотя TEST является закрытым пакетом, он доступен от HelloWorld.

Now the strange part, when I moved TEST to a private inner class of Newfile it now behave as I would've expected the above experiment to behave and I got:

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

Делая TESTprivate внутренний класс Newfile вы сделать его доступным только для членов Newfile самого класса, поэтому, естественно, он больше не доступен из HelloWorld в этом случае.

+0

Я не могу назначить его как частное, почему это так? – Kam

+0

Классы _ (** EDIT **: за исключением внутренних классов) _ в Java могут быть явно объявлены 'public' или вообще не иметь спецификатора доступа (таким образом, это private-package). Вопрос: если существует _was_ «частный» спецификатор для классов (его нет), что именно вы ожидаете от него? – TerraPass

+1

@TerraPass только частично истинно, внутренние классы могут быть частными. – SomeJavaGuy

Смежные вопросы