Java Protected Access funktioniert nicht
-
22-07-2019 - |
Frage
In Java gibt es drei Zugriffsebene:
- Public - Offen für die Welt
- Privat - Öffnen Sie nur auf die Klasse
- Schutz -. Öffnen Sie nur auf die Klasse und ihre Unterklassen (Vererbung)
Warum also der Java-Compiler geschehen lassen?
TestBlah.java:
public class TestBlah {
public static void main(String[] args) {
Blah a = new Blah("Blah");
Bloo b = new Bloo("Bloo");
System.out.println(a.getMessage());
System.out.println(b.getMessage()); //Works
System.out.println(a.testing);
System.out.println(b.testing); //Works
}
}
Blah.java:
public class Blah {
protected String message;
public Blah(String msg) {
this.message = msg;
}
protected String getMessage(){
return(this.message);
}
}
Bloo.java:
public class Bloo extends Blah {
public Bloo(String testing) {
super(testing);
}
}
Lösung
Eigentlich sollte es sein:
Öffnen nur auf die Klassen auf dem gleichen Paket die Klasse und ihre Unterklassen (Vererbung)
Deshalb
Andere Tipps
Da geschützt bedeutet Unterklasse oder andere Klassen im selben Paket.
Und es gibt tatsächlich eine vierte „default“ Zugriffsebene, wenn der Modifikator weggelassen wird, die der Zugang zu anderen Klassen im selben Paket bereitstellt.
So protected
ist zwischen Standard und public
Zugriff.
Um genauer zu sein, Sie erwarten protected
zu arbeiten, wie es in C ++ tut.
Doch in Java, es hat eine andere Bedeutung. In Java, eine geschützte Methode zur Klasse verfügbar ist (natürlich), alle anderen Klassen im gleichen Paket und alle Subklassen dieser Klasse. Klassen in anderen Paketen keinen Zugriff haben, wenn sie diese ursprüngliche Klasse Unterklasse.
Sehen Sie diese ähnliche Frage für spezifischere Informationen zur Vererbung Markierungen.
Ich persönlich so gut wie nie protected
verwenden. Ich entwickle Anwendungen, anstatt Frameworks so bin ich viel eher public
Methoden, private
Daten und ziemlich oft, an meine ganze Klasse als final
.
Es gibt tatsächlich vier Zugriffsebene: „public“, „geschützt“, „private“ und Standard auch als Paket private oder Paket geschützt bekannt. Standardgrenzen Zugänglichkeit zum Paket. Standard ist sehr nützlich und ich benutze es häufig.
Sie sind in der Lage b.getMessage()
zu nennen, weil b
vom Typ Bloo
ist, die Blah
erstreckt und getMessage()
ist geschützt. Geschützte, wie Sie bereits erwähnt, ermöglicht Subklassen die Methode zuzugreifen.
Sie haben die folgenden Fehler bekommen, aber:
- Beim
super()
ohne Argumente imBloo
Konstruktor ist ein Fehler. Der Compiler kann nicht finden, den no-ParameterBlah
Konstruktor, weil Sie einen mit einem String-Parametern definiert. - Beim
new Blah()
inTestBlah
main
Methode ist ein Fehler, aus dem gleichen Grunde wie oben. - Mit Bezug auf
a.testing
undb.testing
ist ein Fehler, weil Sie nicht die Variabletesting
für jede Klasse definiert haben.