2016-03-24 10 views
-1

Ich bin ein C++ Programmierer, der versucht, Best Practices der Java-Sprache zu verstehen. Bitte passen Sie Ihre Antworten entsprechend an :)Wie kann eine Klasse ein öffentliches Mitglied einer anderen Klasse sehen, wenn das Mitglied eine private Klasseninstanz ist

Ich habe ein Beispiel ausgearbeitet und ich verstehe nicht warum/wie das von mir beobachtete Verhalten möglich ist.

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

Seit Test ist privat (gut nehme ich an), dann wie kann HelloWorld sogar den Inhalt von TEST (das heißt das i Mitglied) manipulieren?

nun das seltsame Teil, wenn ich TEST an eine private innere Klasse von Newfile bewegt es jetzt so verhalten, als ich das obige Experiment erwartet haben würde zu verhalten, und ich bekam:

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

'Test' ist package-private auf nicht vollständig privat. Dies bedeutet, dass auf Inhalte in demselben Paket zugegriffen werden kann. (Ich nehme an, dass sie in einem Paket sind) – SomeJavaGuy

+0

Downvoter, bitte erklären Sie das? Downvoting ist so zufällig geworden, dass es seinen Wert verloren hat. Die Frage ist klar, prägnant, keine Hausaufgabe (offensichtlich). Wenn du eine Frage leicht oder offensichtlich findest, heißt das nicht, dass sie schlecht ist. – Kam

+0

nicht der Downvoter, aber Sie könnten argumentieren, dass es keinen Forschungsaufwand gibt. Sie gehen davon aus, dass es privat ist, ohne zu erforschen, ob es tatsächlich der Fall ist. – SomeJavaGuy

Antwort

2

Since TEST is private (well I presume)

Nope. Es ist eigentlich package-private.

Von Java Tutorials:

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


EDIT

Sowohl Ihre HelloWorld und Ihre TEST Klassen sind Mitglieder der gleichen Paket (in Ihrem Fall, da Sie scheinen nicht zu haben spezifizierte das Paket explizit, sie sind Mitglieder des unbenannten Pakets). Obwohl TEST Paket-privat ist, ist es daher von HelloWorld zugänglich.

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 

von TEST eine private inneren Klasse von Newfile machen Sie zugänglich zu machen nur für Mitglieder der Newfile Klasse selbst, so, natürlich, es ist nicht mehr zugänglich von HelloWorld in diesem Fall.

+0

Ich kann es nicht spezifisch als privat zuordnen, warum ist das so? – Kam

+0

Klassen _ (** EDIT **: mit Ausnahme von inneren Klassen) _ in Java kann entweder explizit als 'public' deklariert werden oder gar keinen Zugriffsbezeichner haben (also package-privat). Eine Frage: Wenn es einen "privaten" Spezifizierer für Klassen gab (was nicht der Fall ist), was genau würden Sie davon erwarten? – TerraPass

+1

@TerraPass nur teilweise wahr, innere Klassen können privat sein. – SomeJavaGuy

Verwandte Themen