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);
    }
}
War es hilfreich?

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.

definieren,

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 im Bloo Konstruktor ist ein Fehler. Der Compiler kann nicht finden, den no-Parameter Blah Konstruktor, weil Sie einen mit einem String-Parametern definiert.
  • Beim new Blah() in TestBlah main Methode ist ein Fehler, aus dem gleichen Grunde wie oben.
  • Mit Bezug auf a.testing und b.testing ist ein Fehler, weil Sie nicht die Variable testing für jede Klasse definiert haben.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top