protected

Cstar

Mitglied
Hi,

ich hab mal eine Frage zum Schlüsselwort protected:
Soweit ich weiß ist es Subklassen erlaubt auf protected-Variablen zuzugreifen...
Jedoch hab ich in einem tutorial folgenden Code gesehen, der sich aus der Superklasse "Alpha" und deren Subklasse "Delta" zusammensetzt:

----------------------------------------------
package Greek;

public class Alpha {
protected int iamprotected;
protected void protectedMethod() {
System.out.println("protectedMethod");
}
}
-----------------------------------------------
package Latin;

import Greek.*;

class Delta extends Alpha {
void accessMethod(Alpha a, Delta d) {
a.iamprotected = 10; // illegal
d.iamprotected = 10; // legal
a.protectedMethod(); // illegal
d.protectedMethod(); // legal
}
}
------------------------------------------------

Wieso soll der Code in der Klasse Delta "illegal" sein? Hier greift doch die Subklasse Delta auf die Superklasse Alpha (über das a-Object) zu. Das ist doch legal?!

mfg
 
ich bin mir nicht sicher ob das in Java mit der Superklasse und protected so stimmt.
Protected gilt auf jeden Fall auch für gleiches package (protected ist komisch in Java).
 
Original geschrieben von Cstar
Glaubst du also, dass der mit "illegal" markierte Code eigentlich doch "legal" ist?

mfg

Nein ist er nicht, denn protected gilt nur für vererbte Variablen.

Code:
class Delta extends Alpha {
void accessMethod(Alpha a, Delta d) {
a.iamprotected = 10; // illegal

Wenn ich ein Alpha a an ein Delta übergebe sind die Member von a nicht Delta zugehörig.

Rufe auf:
this.iamprotected = 10; dann siehst du das es geht. Sprich jede Instanz kann nur auf seine eigenen Werte zugreifen, das protected bedeutet einfach nur das Delta auf die Instanzen von Alpha zugreifen kann die in dem selben Object "gehören".

Schwer zu erklären ich versuche es etwas genauer aufzuzeichnen:

Code:
Alpha                             vererbt an    Delta
     int iamprotected   ------------------>    int iamamprotected
         |                                                        |
         | instanz von Alpha                       | instanz von Delta
  Alpha alphaInstanz                            Delta deltaInstanz
          |  
           ---------------------------------------->           alphaInstanz.iamprotected  (Bemerk: a)
             übergebe instanz an deltaInstanz  this.iamprotected (Bemerk: b)
Bemerk: a
aphaInstanz.iamprotected ist kein vererbter Wert. Das heisst er ist trotz protected nicht erreichbar, er gehört einer anderen Instanz.

Bemerk: b
this.iamprotected ist ein Vererbter Wert. Das heisst die Klasse Delta erbt der Wert von Alpha
weshalb deltaInstanz auf diesen Wert zugriff hat.

Der Modifier protected erklärt einzig und allein das der vererbte Wert für Instanzen der Subklasse sichtbar ist. alphaInstanz ist aber eine Instanz von Alpha und sein Wert ist nicht public. deltaInstanz ist erbt der Wert und nur innerhalb von deltaInstanz ist dieser sichtbar. Sogar eine delta2Instanz hat keinen Zugriff auf deltaInstanz.iamprotected.
 
Zurück