2016-03-24 17 views
-1

私はJava言語のベストプラクティスを理解しようとするC++プログラマーです。それに応じてあなたの応答を調整してください:)メンバーがプライベートクラスインスタンスの場合、クラスが別のクラスのパブリックメンバーを表示する方法

私は例を演習しましたが、私が観察した振る舞いがなぜ/どのように理解できるのか分かりません。 Testので

//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 
*/ 

は(ウェルIが推定)次にどのHelloWorldTEST(即ちi部材)の内容を操作することができるプライベートですか?今

奇妙な部分、私は上記の実験は、動作するように期待ただろうと私が得たとして、それは今振る舞うNewfileのプライベート内部クラスへTESTを移動:

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

'Test'はpackage-privateであり、完全にprivateではありません。つまり、同じパッケージ内のコンテンツからアクセスできます。 (私はそれらが1つのパッケージにあると仮定します) – SomeJavaGuy

+0

Downvoter、説明するように気をつけますか?ダウン投票は、その価値を失ったほどランダムになっています。質問は、明確で簡潔であり、宿題(明らかに)ではありません。あなたが簡単な質問を見つけたら、それは悪いことではありません。 – 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はpackage-privateですが、HelloWorldからアクセスできます。あなただけNewfileクラス自体のメンバーからのアクセスを可能にできますNewfileTESTprivate内部クラスにすることにより

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 

は、そう、当然、それはこの場合にはHelloWorldからアクセスできなくなりません。

+0

私はそれをプライベートとして特別に割り当てることができません、なぜそうですか? – Kam

+0

クラス_(** EDIT **:内部クラスを除く)_ Javaでは、明示的に 'public'を宣言するか、アクセス指定子を一切持たない(パッケージプライベート)ことができます。質問:クラスのための 'private'指定子がある場合(そこにはありません)、それはどういう意味でしょうか? – TerraPass

+1

@TerraPassは部分的にしか真ではなく、内部クラスはプライベートにすることができます。 – SomeJavaGuy

関連する問題