Kapselung protected aber in einer Kindklasse nicht zugänglich

HansD

Mitglied
Java:
package p1;

public class Acc {
    int p;
    private int q;
    protected int r;
    public int s;
}
Folgender Code ergibt eine Compile-Time-Error, weil die Variable r protected deklariert ist.
Java:
package p2;
import p1.Acc;

public class Test extends Acc
{
    public static void main (String[] args)
    {
        Acc obj = new Test();

     // obj.p = 12;
     // obj.q = 13;
        obj.r = 14;  // Test.java:12: error: r has protected access in Acc
        obj.s = 15;
    }
}

Test ist ja ein Erbe von Acc und überall lese ich, dass eine protected deklarierte Variable im selben Package, und darüber hinaus in auch allen Kindklassen zugänglich sei. Trotzdem die Fehlermeldung des Compilers.

Ändere ich den Quelltext wie folgt, wird ohne Beanstandung kompiliert.

Java:
package p2;
import p1.Acc;

public class Test extends Acc
{
    public static void main (String[] args)
    {
        Test obj = new Test();

        obj.r = 14;
        obj.s = 15;
    }
}

Ich verstehe bisher nicht, warum.

Während ich das schreibe, denke ich es ist vielleicht so zu verstehen:
  1. Durch Acc obj = new Test(); wird kein Objekt von Test erstellt, sondern eines von Acc, deswegen greift die Regel, das Kindklassen auf die protected-Variable zugreifen können nicht, denn ein Acc-Objekt ist nie ein Kind seiner eigenen Klasse.
  2. Als Acc-Objekt kann obj auch nicht auf die Variable r zugreifen, da Acc in diesem Fall im Package p2 erzeugt und daher nicht im selben Package ist.
Irgendwie verwirrend.
 

httpdigest

Top Contributor
  • If the access is by a field access expression E.Id, where E is a Primary expression, or by a method invocation expression E.Id(. . .), where E is a Primary expression, then the access is permitted if and only if the type of E is S or a subclass of S.
In E.id muss der compilezeit-Typ von E also die abgeleitete Klasse sein, in deinem Fall Test
 
Zuletzt bearbeitet:

HansD

Mitglied

In E.id muss der compilezeit-Typ von E also die abgeleitete Klasse sein, in deinem Fall Test

Danke für den Hinweis!

Ich habe mir das wie folgt zu dem Beispiel notiert:

Zugriff auf ein geschütztes Feld (Access to a protected Member)

Sei C die Klasse, in der ein Feld (Member) als protected deklariert ist. Der Zugriff ist nur in einer Unterklasse S von C erlaubt.

Wenn Id darüber hinaus ein Instanzfeld oder eine Instanzmethode bezeichnet, dann:

Wenn der Zugriff über einen qualifizierten Namen Q.Id erfolgt, wobei Q ein Ausdrucksname ("an ExpressionName") ist, dann ist der Zugriff nur dann erlaubt, wenn der Typ des Ausdrucks Q S oder eine Unterklasse von S ist.

Erfolgt der Zugriff über einen Feldzugriffsausdruck ("field access expression") E.Id, wobei E ein primärer Ausdruck ("primary expression") ist, oder über einen Methodenaufrufsausdruck ("method invocation expression") E.Id(...), wobei E ein primärer Ausdruck ist, so ist der Zugriff nur dann zulässig, wenn der Typ von E S oder eine Unterklasse von S ist.

Weitere Informationen über den Zugriff auf geschützte Mitglieder finden Sie in Checking Access to Protected Members in the Java Virtual Machine von Alessandro Coglio, im Journal of Object Technology, Oktober 2005.

(Quelle: James Gosling e. al.: "The Java® Language Specification Java SE 7 Edition", "Chapter 6 Names", Oracle, 28. Februar 2013, https://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.2.1, abgerufen am 14. Juni 2022)
 

Jw456

Top Contributor
Protected :
Heißt für mich zugriff in einer erbenden Klasse und im selben Package.

Die Klasse Acc und Test sind aber nicht im gleichen Package.
Also ist von "Test" auf "Acc protected int r" nicht möglich.

Würdest du das Package von Test auf p1 ädern würde es gehen.


Test ist ja ein Erbe von Acc und überall lese ich, dass eine protected deklarierte Variable im selben Package, und darüber hinaus in auch allen Kindklassen zugänglich sei.
Du hast es eigentlich schon selbst beantwortet. Du bist nicht im selben Package.
 
Zuletzt bearbeitet:

httpdigest

Top Contributor
Ich glaube, die Verwirrung kam eher, weil der Code, der auf Acc.r zugreifen möchte, ja "in der Subklasse" ist.
Also der Code befindet sich ja in Test.main() und Test ist eine Subklasse von Acc.
Sein Punkt war eher der Teil ".... und darüber hinaus in auch allen Kindklassen zugänglich sei."
Ausschlaggebend ist aber nicht die Klasse, in der sich der Code befindet, der versucht, auf Acc.r zuzugreifen, sondern der statische compilezeit-Typ des Ausdrucks E in E.r. Dieser muss ein Subtyp von Acc sein, wenn Acc und die Subklasse nicht imselben Package sind.

Oh cool! Hab gerade gesehen, dass Backticks wie in Markdown hier jetzt auch einen inline Codeblock bedeuten. Sehr cool!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Sichtbarkeit protected: Attribute trotzdem aufrufbar. Java Basics - Anfänger-Themen 4
B Vererbung - Sichtbarkeitsmodifikation - protected Java Basics - Anfänger-Themen 10
S Zugriff auf protected Fields = guter Programmierstil? Java Basics - Anfänger-Themen 11
S protected = nicht protected? Java Basics - Anfänger-Themen 9
Aprendiendo Zwei Fragen und ein geerbtes "protected"-Attribut Java Basics - Anfänger-Themen 2
wilmaed protected class Java Basics - Anfänger-Themen 0
K Vererbung protected NUR für Unterklassen? Java Basics - Anfänger-Themen 17
M Schlüsselworte Ohne Modifizierer gleichbedeutend mit protected? Java Basics - Anfänger-Themen 6
K Compiler-Fehler vererbtes protected Java Basics - Anfänger-Themen 41
K Protected und Private Deklaration Java Basics - Anfänger-Themen 8
B Vererbung Probleme bei Zugriff auf protected-Methoden in einer Unterklasse Java Basics - Anfänger-Themen 27
J protected Methoden Java Basics - Anfänger-Themen 8
W Frage public protected konstruktor Java Basics - Anfänger-Themen 6
B Kapselung Klasse private, Konstruktor protected Java Basics - Anfänger-Themen 10
T Kapselung: public-Methoden in protected-Klassen Java Basics - Anfänger-Themen 3
A protected Java Basics - Anfänger-Themen 18
F Ewiges Leid mit "protected" (oder "wie der beste Freund eine hinrücks betrügt") Java Basics - Anfänger-Themen 26
A Frage zu Protected in SubSubKlasse Java Basics - Anfänger-Themen 4
G Protected Variablen außerhalb der eigenen Klassenhierarchie sichtbar Java Basics - Anfänger-Themen 5
N Wann muss eine Methode - protected sein wann public wann. Java Basics - Anfänger-Themen 5
stekoe2000 protected abstrac class Java Basics - Anfänger-Themen 3
B public und protected Java Basics - Anfänger-Themen 11
S Veränderung von Protected Daten durch Übergabe? Java Basics - Anfänger-Themen 3
G Public ,private,protected Java Basics - Anfänger-Themen 1
M Konstruktor protected machen Java Basics - Anfänger-Themen 7
H protected Java Basics - Anfänger-Themen 2
U public, private, protected und "default access" - Java Basics - Anfänger-Themen 14
V Auf protected ArrayList von anderer Klasse zugreifen Java Basics - Anfänger-Themen 4
J protected und Standard Sichtbarkeit Java Basics - Anfänger-Themen 2
M Jede Variable als private, protected etc. deklarieren? Java Basics - Anfänger-Themen 7
P protected funktioniert nicht? Java Basics - Anfänger-Themen 5
I Exception wird gefangen, aber trotzdem in Error Log? Java Basics - Anfänger-Themen 10
K Programm compilierbar aber nicht ausführbar... Java Basics - Anfänger-Themen 21
N Hey Leute und zwar versuche ich gerade ein 2D Spiel zu Programmieren aber die Figur will sich nicht nach links oder rechts bewegen :( Java Basics - Anfänger-Themen 12
T float soll durch schleife die größte mögliche Zahl herausfinden, Ausgabe ist aber "Infinity" Java Basics - Anfänger-Themen 1
monsterherz Fehler Semikolon fehlt - ich weiss aber nicht wo da noch eines hin sollte... Java Basics - Anfänger-Themen 21
M Konstruktor-Aufruf im Konstruktor, aber nicht am Anfang? Java Basics - Anfänger-Themen 4
N Programm Funktioniert mit .txt Datei aber nicht mit .rtf Datei Java Basics - Anfänger-Themen 2
N Interpreter-Fehler Compiler zeigt keine Fehler an, aber das Programm läuft nicht (BlueJ) Java Basics - Anfänger-Themen 2
L Hilfe! Liste mit Items werden ausgegeben aber nicht in zufälliger Reihenfolge Java Basics - Anfänger-Themen 6
P Installation JRE 8u321 startet, geht aber nicht weiter Java Basics - Anfänger-Themen 1
berserkerdq2 Ich gebe eine ArrayList als List zurück per MEthode, wie kann ich nun aber die ArrayList speichern? Java Basics - Anfänger-Themen 46
L Mergesort (aber anders) Java Basics - Anfänger-Themen 2
P Mein Programm wird zwar erfolgreich Compiliert, öffnet sich aber nicht Java Basics - Anfänger-Themen 6
HelpInneed Baum ausgeben (aber mal anders) Java Basics - Anfänger-Themen 3
U Kann man bei Java gleich mehrere Bedingungen prüfen in der If, aber in einem "Satz"? Java Basics - Anfänger-Themen 1
H Kapselung JProgressBar in JTable, aber getValueAt() greift nicht Java Basics - Anfänger-Themen 7
U Den Kuchen aufteilen - aber wie? (Rebalancing-Algorithmus) Java Basics - Anfänger-Themen 14
OSchriever Jar-Programm läuft auf Windows aber nicht auf Linux(Raspberri Pi4) Java Basics - Anfänger-Themen 22
R Fehlermeldung aber WO liegt der Fehler? Java Basics - Anfänger-Themen 7
I DecimalFormat in Zahlenformat für Währung, habe 7,99, bekomme aber 7 Java Basics - Anfänger-Themen 4
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
AGW App programmiert lassen, aber Änderungen vornehmen Java Basics - Anfänger-Themen 13
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
B Fehler, aber ich weiß nicht warum Java Basics - Anfänger-Themen 3
J Fehler im Code, aber ich weiß nicht wieso! Java Basics - Anfänger-Themen 6
B Java Mail -> Mail senden, ist aber nich in IMAP unter "Gesendet" Java Basics - Anfänger-Themen 3
A Figur erkennen, aber Abweichung falsch Java Basics - Anfänger-Themen 2
A Haben KNNs ein Gedächtnis, lernen etwas oder verändern sich, während sie nicht trainieren, aber aktiv sind? Java Basics - Anfänger-Themen 3
C "HelloWorld" - Dateien erstellt, aber ist es eine class-Datei? Java Basics - Anfänger-Themen 2
S Programmierung simulieren - aber wie?! Java Basics - Anfänger-Themen 3
S Interpreter-Fehler Endlosschleife zur Laufzeit aber warum? Java Basics - Anfänger-Themen 15
J Mit OpenJDK entwickeln aber Oracle SE Runtime installieren? Java Basics - Anfänger-Themen 6
X Threads Zwei Threads, aber doppelte Ausgabe verhindern (synchronized) Java Basics - Anfänger-Themen 54
A Java-Programm läuft bei installierter JDK aber nicht mit JRE? Java Basics - Anfänger-Themen 5
C Statischer Typ aber Variable nicht statisch? Java Basics - Anfänger-Themen 5
J ShortCut erstellen aber wie die dll einbinden Java Basics - Anfänger-Themen 3
I "\n" aus ArrayList enfernen, aber wie?! Java Basics - Anfänger-Themen 4
B Türme von Hanoi mit einer beliebigen aber gültigen Eingabe lösen Java Basics - Anfänger-Themen 5
S JDK 9 für Windows 32 bit installiert, aber es funktioniert nix Java Basics - Anfänger-Themen 6
D Zwei Strings sind gleich bei if aber nicht true Java Basics - Anfänger-Themen 2
U Null Exception aber keine Ahnung warum Java Basics - Anfänger-Themen 5
J Strings sind gleich werden aber ungleich ausgewertet Java Basics - Anfänger-Themen 2
A Kfz - Händler Klasse. JUnit-Test gibt noch Fehler an, aber finde Ursache nicht Java Basics - Anfänger-Themen 7
J JavaEditor kompiliert aber startet nicht Java Basics - Anfänger-Themen 1
B Email versand - aber akzeptiert auch falscher Username und Passwort??? Java Basics - Anfänger-Themen 1
O Array benutzen aber WIE? Java Basics - Anfänger-Themen 18
E Mastermind programmieren, wie den falschen Platz aber richtige Farbe schecken? Java Basics - Anfänger-Themen 23
A Variabler Rekursionsaufruf, aber wie? Java Basics - Anfänger-Themen 6
N Ausführung gibt keinen Fehler an, Return wird aber nicht ausgegeben Java Basics - Anfänger-Themen 22
M Methoden Zwei Methoden in einem Program laufen lassen...aber wie? Java Basics - Anfänger-Themen 2
K Armstrong Programm geht nur bis 1000, aber nicht weiter Java Basics - Anfänger-Themen 2
pkm Best Practice BufferedImage in JPane darstellen - aber wie? Java Basics - Anfänger-Themen 22
it_is_all Bild-Pfad wird gefunden, nicht aber Textdatei-Pfad Java Basics - Anfänger-Themen 8
B Fakultätsfunktion Rekursiv Berechnen aber mit Array Java Basics - Anfänger-Themen 10
D int x in System.out.println(), aber wie? Java Basics - Anfänger-Themen 1
J Serialisieren, aber wie? Java Basics - Anfänger-Themen 3
A Warum funktioniert switch aber nicht if/else? Java Basics - Anfänger-Themen 23
T Datum wird auf der Konsole richtig ausgegeben, aber im Textarea kommt ERROR Java Basics - Anfänger-Themen 8
snipesss Java-Code gedownloaded, funktioniert aber nicht? Java Basics - Anfänger-Themen 9
H NullPointerException, aber wieso? Java Basics - Anfänger-Themen 5
P Irgendein billiger Fehler aber ich find ihn nicht Java Basics - Anfänger-Themen 16
Thallius Date für DatePicker formatieren aber wie? Java Basics - Anfänger-Themen 9
J Nullpointer aber wo? Java Basics - Anfänger-Themen 12
E Dumme Frage, aber... Java Basics - Anfänger-Themen 15
S Erste Schritte Generische Klassen sind toll ....aber warum sollte ich das je benutzen? Java Basics - Anfänger-Themen 3
Z Erste Schritte Versuche ein Labyrinth in einem Terminal zu erstellen, aber kann die properties Datei nicht einlesen Java Basics - Anfänger-Themen 3
Tacofan Schleife aber nur wie? Java Basics - Anfänger-Themen 10
V char Eingabe aber nur für Buchstaben Java Basics - Anfänger-Themen 4
J Eine Art verkettete Liste aber mit teils mehr als einem Nachfolger Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben