Sichtbarkeit von Klassen außerhalb des Paketes?

flashray

Erfahrenes Mitglied
Hallo,

"Geben Sie an, welche Modifizierer einer Klasse dafür sorgen, dass die Klasse außerhalb
des Pakets, in dem sie deklariert ist, zugreifbar ist."

Lösung:
"Die einzigen Modifizierer für Klassen, die im Zusammenhang mit Paketschnittstellen
relevant sind, sind public (von außerhalb des Pakets kann nur auf Klassen zugegriffen
werden, die als public deklariert sind) und protected (für Subklassen eingebetteter
Klassen)."

Ich verstehe hier die Erwähnung von protected nicht! Ich konnte leider kein Beispiel konstruieren indem eine eingebettete geschütze (protected) Subklasse außerhalb des Pakets erreichbar wäre. Stimmt eurer Meinung nach die Lösung?


Vg Erdal
 
Hallo Erdal,

also ich denke das der protected Modifier nichts mit der Sichtbarkeit einer Klasse zu
tun hat, höchstens mit der Sichtbarkeit eines Attributes der Klasse.

Das Tutorial von sun sagt dazu folgendes:
http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html hat gesagt.:
At the member level, you can also use the public modifier or no modifier (package-private) just as with top-level classes, and with the same meaning. For members, there are two additional access modifiers: private and protected. The private modifier specifies that the member can only be accessed in its own class. The protected modifier specifies that the member can only be accessed within its own package (as with package-private) and, in addition, by a subclass of its class in another package.

Das sagt für mich nur das wenn ich ein Attribut a in einer Klasse A im Package
pack1 als protected definiert habe, kann eine andere Klasse B (auch Package Übergreifend wenn A public deklariert ist), falls Sie von A erbt, diese Attribut a benutzen.

Gruß,
RedWing
 
Hallo Redwing,

also ich darf das dann so verstehten:

Java:
package one;

public class Alpha {

	protected String attribut = "a";

	protected void methode(String s) {
		System.out.println(s);
	}

	protected class Delta {
		protected String attribut = "d";

		protected void methode(String s) {
			System.out.println(s);
		}
	}
}

////////////////////////////////////////////////

package two;

import one.Alpha;

public class AlphaSub extends Alpha {

	public static void main(String[] args) {
		AlphaSub as = new AlphaSub();
		as.methode(as.attribut);

		Delta d;
		// d = new Delta(); -> Funktioniert nicht
	}
}

Aber eine protected Subclass in einem anderen Package als die Superclass gibt es definitiv nicht, wie ich aus der Musterlösung zunächst verstanden hatte.

Redwing hat gesagt.:
also ich denke das der protected Modifier nichts mit der Sichtbarkeit einer Klasse zu tun hat, höchstens mit der Sichtbarkeit eines Attributes der Klasse.

Ja doch, so müsste es sein.
"Welche Modifizierer einer Klasse dafür sorgen, dass die Klasse außerhalb des Pakets, in dem sie deklariert ist, zugreifbar ist."

Wenn damit nicht der Modifizierer der Klasse sondern die Modifizierer der Attribute und Methoden verstanden werden dann stimmt die Angabe von public und protected.

Habe dann auch noch eine protected Klasse namens Delta in Alpha implementiert. Ich kann zwar in AlphaSub eine Variable des Typs Delta erzeugen nicht jedoch instanzieren.


Danke für den Hinweis!

Vg Erdal
 
Nein stimmt doch nicht so ganz!

Java:
package one;

public class Alpha {

	protected String attribut = "a";

	protected void methode(String s) {
		System.out.println(s);
	}

	protected class Delta {

		public Delta () {

		}
		public String attribut = "d";

		public void methode(String s) {
			System.out.println(s);
		}
	}
}

////////////////////////////////////

package two;

import one.Alpha;

public class AlphaSub extends Alpha {

	public static void main(String[] args) {
		AlphaSub as = new AlphaSub();
		as.methode(as.attribut);

		Delta d;
		d = as.new Delta();
		d.methode(d.attribut);
	}
}

Ausgabe:
Code:
a
d

Die Javasyntax ist doch ein wenig schwieriger und umfangreicher und komplexer als ich dachte.


Vg Erdal
 
Hallo,

das mit den verschachtelten Klassen hatte ich nicht bedacht...

Nein stimmt doch nicht so ganz!

Wenn du die geschachtelte Klasse Delta als protected deklarierst,
dann aber den Defaultzugriff des Konstruktors von protected auf public heraufsetzt
is es eigtl. ganz logisch das sich Delta dann in AlphaSub instanziieren lässt. Bei
deinem vorigen Beispiel war ja der Zugriff für den Defaultkonstruktor von Delta
auch protected,weswegen man sie nicht in AlphaSub instanziieren konnte.

Gruß,

RedWing
 
Hallo Redwing,

RedWing hat gesagt.:
das mit den verschachtelten Klassen hatte ich nicht bedacht...

du weisst doch das nur verschachtelte Klassen protected deklariert werden dürfen ;) . Das war ja mein Anliegen, hatte es zuvor nicht geschaft eine protected Klasse zu implementieren auf die ich außerhalb des Pakets zugreifen kann, bis mir das public eingefallen ist!


Vg Erdal
 
flashray hat gesagt.:
du weisst doch das nur verschachtelte Klassen protected deklariert werden dürfen ;) .

Ja, mehr oder weniger :) Ich glaube das ich dein Anliegen erst jetzt verstanden
habe :)
Darf ich nochmal zusammenfassen:

protected im Kontext einer eingeschachtelten Klasse macht die Klasse selbst
außerhalb des Packages in den Klassen sichtbar die Subklassen der äußeren
Klasse sind. Zusätzlich sind alle Attribute und Methoden defaultmäßig wenn die
eingeschachtelte Klasse als protected deklariert wurde selbst protected:
Also nochmal zusammenfassend:
Java:
package pack1;

public class A{
        protected class B{
                public B(){

                }
        }
        protected class F{
        }
}

--- Andres Package: ---
package pack2;

import pack1.A;

class C extends A{
    B b = new B(); //das geht
    F f = new F(); //das geht nimmer weil Konstruktor protected
}

class D{
    A.B b; //geht nicht weil B protected ist
}
Kann man das so stehen lassen?

Gruß,
RedWing
 
Hallo Redwing,

ja so kann man das stehen lassen :) .

Code:
"Die einzigen Modifizierer für Klassen, die im Zusammenhang mit Paketschnittstellen relevant sind, sind public (von außerhalb des Pakets kann nur auf Klassen zugegriffen werden, die als public deklariert sind) und protected (für Subklassen eingebetteter Klassen)."

Genau das war auch in diesem Text gemeint. Da ich aber das mit dem "public Konstruktor" nicht gewusst habe, hatte ich kein Beispiel aufstellen können, das dies realisiert. Also habe ich dann irrtümlicherweise daraufhin tendiert das die obige Musterlösung zur Frage falsch sei.


Vg Erdal
 
Zurück