Protected access modifier in Java
Ich bin mit ein wenig Schwierigkeiten zu verstehen, die protected access modifier in java (oder das design dahinter). Ich dachte, es bedeutete Paket-Zugriff und Zugriff über Objekte Erben von der Klasse, die eine abstrakte member.
Schrieb ich den folgenden Beispielcode. Ich sehe, dass der auskommentierten Zeile erzeugt einen Kompilierungsfehler, wenn Sie unkommentiert. Warum kann ich auf pro durch ein Zweites Objekt in der Zweiten, aber nicht durch ein Erstes Objekt in der Zweiten?
package first;
public class First {
protected void pro(){
System.out.println("Can see protected method");
}
}
package first;
public class InFirst {
public static void main(String[] args){
First fst = new First();
fst.pro();
}
}
package second;
import first.First;
public class Second extends First {
public static void main(String[] args){
First fst = new First();
// fst.pro();
Second sec = new Second();
sec.pro();
}
}
- Vielleicht nehmen Sie einen Lesevorgang durch Steuerung des Zugriffs auf die Mitglieder einer Klasse für mehr details
- Gute Beobachtung. Normalerweise ist dies verwirrend für viele Entwickler. Sehen Sie das Diagramm unten, vielleicht ist es hilfreich.
- Danke, habe ich gelesen. Ich bin grundsätzlich verwirrt durch den Satz "durch eine Unterklasse Ihrer Klasse in einem anderen package", die Sie verwenden für die geschützten modifier. Wie oben gezeigt, auf die ich zugreifen kann pro Sekunde, sondern nur durch ein Zweites Objekt sec und nicht durch ein Erstes Objekt fst.
- Ich denke, die wichtigen Details, die Sie fehlen in der Unterklasse Zugriff von einer übergeordneten Klasse protected-Mitglied, ist, dass der Zugriff zu erfolgen hat, die im Kontext der Unterklasse 'Umsetzung' (die Skillung bezieht sich auf den Körper, gleichen Unterschied). Die main-Methode einer Klasse ist nicht als Teil seiner Implementierung, die ist, warum Sie eine Fehlermeldung erhalten.
- Wenn ich Schreibe den gleichen Satz von Anweisungen in einer nicht-statischen Methode in der Zweiten, ich bekomme immer noch die gleiche Fehlermeldung, wenn ich kommentieren Sie die auskommentierte Zeile. Das ist also nicht die Quelle des Fehlers.
- Sie sich da sicher? Check out das Projekt, und lassen Sie mich wissen, wenn Ihre Probe ist anders.
- Sorry, ich bin nicht in der Lage, um zu sehen, alle source-Dateien von diesem link. Im Grunde, in eine nicht-statische Methode aus der Zweiten, kann ich nicht auf pro auf einem Ersten Objekt, genau wie in der main-Methode. Natürlich kann ich das überschreiben pro Sekunde und auch pro Anruf von einer nicht-statischen Methode, die effektiv aufrufen pro-am "dieses". Ich habe dies alles schriftlich sameple code.
- Sie haben, um einen Drilldown in die Verzeichnisse. Hier für die Beispiele, sind die Klassen in der
first
Paket. - Hier ist eine einfache Spickzettel erklärt, dass
protected
und die anderen zugriffsmodifizierer.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Webseite @MadProgrammer verknüpft gibt eine anständige Erklärung:
Dies bedeutet, dass die geschützten member muss direkt zugegriffen werden, entweder über die Klasse in der Sie definiert ist oder eine Unterklasse der Klasse sagte, während auch in das entsprechende Paket. Es muss nicht unbedingt bedeuten, dass Sie Zugriff auf die protected-member durch eine Instanz der besagten Klasse erstellt eine Unterklasse der Klasse sagte. Der Fokus ist auf die Pakete beteiligt.
Hier sind Ihre Beispiele:
Versuch zu access Mitglied aus, welches Paket? ersten
Ist die (sub -) Klasse, enthält Sprach-Mitglied, oder dessen parent-Klasse erbt die member aus, definiert im selben Paket? Ja,
First
definiert ist, inpackage first
, so dieprotected
Mitglied zugänglich ist, ausFirst
impackage first
.Versuch zu access Mitglied aus, welches Paket? zweiten
Ist die (sub -) Klasse, enthält Sprach-Mitglied, oder dessen parent-Klasse erbt die member aus, definiert im selben Paket? Nein,
First
definiert ist, inpackage first
, soprotected
macht das Mitglied nichtFirst
impackage second
.Versuch zu access Mitglied aus, welches Paket? zweiten
Ist die (sub -) Klasse, enthält Sprach-Mitglied, oder dessen parent-Klasse erbt die member aus, definiert im selben Paket? Ja,
Second
definiert inpackage second
erbt, die dem Mitglied ausFirst
, so dieprotected
Mitglied zugänglich ist, ausSecond
impackage second
.Weitere Beispiele für Klarheit:
Versuch zu access Mitglied aus, welches Paket? ersten
Ist die (sub -) Klasse, enthält Sprach-Mitglied, oder dessen parent-Klasse erbt die member aus, definiert im selben Paket? Ja,
Second
erbt, die dem Mitglied ausFirst
definiert inpackage first
, so dieprotected
Mitglied zugänglich ist, ausSecond
impackage first
.Versuch zu access Mitglied aus, welches Paket? ersten
Ist die (sub -) Klasse, enthält Sprach-Mitglied, oder dessen parent-Klasse erbt die member aus, definiert im selben Paket? Ja,
Third
erbt, die dem Mitglied ausSecond
, die erbt es vonFirst
wo das Element definiert ist (package first
), so dass dieprotected
Mitglied zugänglich ist, ausThird
impackage first
.Hier ist ein Diagramm zum anzeigen der Zugriffsebene. Sie gehört zu den R(Referenz) Fall im Cabrio in der Abbildung. Das ist Referenz in der Unterklasse in einem anderen Paket ist, nicht zugreifen darf.
Geschützt Mitglied in java
Gleiche Paket-(es verhält sich wie Standard)
Es ist leicht zugänglich in der sameclass,werden seine child-Klassen und auch nicht Kind-Klassen.(es verhält sich wie Standard)
Sie können auch den Zugriff auf geschützte Mitglieder mit übergeordneten oder untergeordneten Referenz.
Außerhalb des Pakets-
Es ist nur zugänglich für itz Kind-Klasse und der wichtigste Punkt ist hier, dass die Referenz verwendet werden, müssen von der gleichen Kind-Klasse
nur
geschützt bedeutet sichtbar für andere Klassen im gleichen Paket. da Zweite ist in einem anderen Paket 'zweite.Zweite', die es nicht zugreifen kann .pro() in der ersten.
wenn Sie Zweite unter dem Namen des Pakets der 'ersten' - es würde dann funktionieren.