Vererbung Probleme bei Zugriff auf protected-Methoden in einer Unterklasse

blauerninja

Mitglied
Hallo mal wieder,
hab mal rumgetestet und folgendes unlogisches Problem in Eclipse festgestellt:

Java:
package myProg.moves.moves;

import myProg.moves.*;

public final class DummyMove extends Move {
  private static final int  POWER  = 20;


  DummyMove() {
    super(POWER);
  }


  public static void main(String[] args) {
    Move move = new DummyMove();
    System.out.println(move.getPower());
  }
} // End DummyMove





package myProg.moves;

public abstract class Move {
  private final int POWER;


  protected Move(int power) {
    this.POWER = power;
  }


  protected int getPower() {
    return this.POWER;
  }
} // End Move

Der Fehler ist Folgender: wenn ich versuche zu kompilieren, beschwert sich Eclipse, dass getPower() nicht zugreifbar sei und ich doch bitteschön die Methode mit protected deklarieren solle! XD
Fehler von Eclipse? Oder Java-Problem?
 
Weder noch, das Problem sitzt vorm Bildschirm 😉
protected bedeutet dass nur innerhalb des Packages auf diese Methode zugegriffen werden kann.
Code:
DummyMove
(und damit die Main Methode) liegt aber in einem anderen package.
 
protected heißt aber auch, dass ich in Unterklassen Zugriff habe. Also nach meinem Verständnis auch, wenn sie in einem anderen Paket sitzen. Oder nicht?

Zumal es besteht Zugriff (durch public auf getPower() getestet) auf den Konstruktor von Move, obwohl dieser auch protected ist.
 
Zuletzt bearbeitet:
Nein, mein ich nicht. Wir sind hier nicht bei Wünsch-Dir-Was. Das ist die Realität. So, N8
 
Ja richtig. Aber nicht auf Oberklassen! Du versuchst von der Unterklasse auf die Oberklasse zuzugreifen, andersrum würde das natürlich gehen.

Sprich in einer Unterklasse kann ich nur auf den Konstuktor der Oberklasse zugreifen, auch wenn dieser protected ist, wohingegen entsprechende Methoden nicht sichtbar sind? Wer hat sich dabei was gedacht? Unkonsequent meiner Meinung nach.???:L


Nein, mein ich nicht. Wir sind hier nicht bei Wünsch-Dir-Was. Das ist die Realität. So, N8

Wie meinst du es dann?


Nachtrag: die Fehlermeldung von Eclipse ist auch unverständlich. Sagt, dass man als protected deklarieren soll, obwohl es schon ist. Fast schon bug-like.
 
Zuletzt bearbeitet:
ja, innerhalb der statischen main-Methode bist du außerhalb des Kontextes der Klasse

OHNE eine genaue Fehlermeldung, kann auch niemand wissen, was eigentlich gemeint ist. So is dat, werde konkreter

N( Mfg
 
Java:
package myProg.moves.moves;

import myProg.moves.*;

public final class DummyMove extends Move {
  private static final int  POWER  = 20;


  DummyMove() {
    super(POWER);
  }

[B]
  @Override
  public int getPower() {
    return super.getPower();
  }
[/B]

  public static void main(String[] args) {
    Move move = new DummyMove();
    System.out.println(move.getPower());
  }
} // End DummyMove





package myProg.moves;

public abstract class Move {
  private final int POWER;


  protected Move(int power) {
    this.POWER = power;
  }


  protected int getPower() {
    return this.POWER;
  }
} // End Move


Wenn ich noch verstehen würde, wieso nicht die public Methode nicht die andere überschreibt, bin ich der Erleuchtung schon näher^^ Fehler ist wieder in der main(). Der Zugriff mit super.getPower() wird akzeptiert. Was ich so verstehe, dass ich auf protected Methoden der Oberklasse nur in Objekt-Methoden einer Unterklasse zugreifen kann, aber nicht in statischen. Korrekt?
 
Fehler habe ich oben beschrieben. Aber hier noch mal die konkrete Fehlermeldung:

The method getPower() from the type Move is not visible

1 quick fix available
change visibility of 'getPower()' to 'protected'
 
Mal andersrum:
Die Klasse DummyMove hat eine Methode getPower() geerbt. Auf diese hast du innerhalb der Klasse zugriff. Aber du hast keinen Zugriff auf die Methode getPower() der Klasse Move.

Folgendes geht also z.B. auch

Java:
public final class DummyMove extends Move {
  private static final int POWER  = 20;
 
  DummyMove() {
    super(POWER);
  }
   
  public static void main(String[] args) {
    DummyMove move = new DummyMove();
    System.out.println(move.getPower());
  }
}
 
The method getPower() from the type Move is not visible

1 quick fix available
change visibility of 'getPower()' to 'protected'
Das haben wir ja jetzt schon geklärt oder? Siehe oben.


Wenn ich noch verstehen würde, wieso nicht die public Methode nicht die andere überschreibt
Wie kommst du dadrauf? Natürlich überschreibst du die Methode (sonst würde der Compiler bei @Override auch meckern).
 
Fehler habe ich oben beschrieben. Aber hier noch mal die konkrete Fehlermeldung:

The method getPower() from the type Move is not visible

1 quick fix available
change visibility of 'getPower()' to 'protected'

W[STRIKE]�[/STRIKE][STRIKE]r[/STRIKE][STRIKE]d[/STRIKE]e sa[STRIKE]g[/STRIKE]en, die Fehlerm[STRIKE]e[/STRIKE]l[STRIKE]d[/STRIKE]u[STRIKE]n[/STRIKE]g stimmt[STRIKE],[/STRIKE][STRIKE] [/STRIKE][STRIKE]d[/STRIKE]i[STRIKE]e[/STRIKE] [STRIKE]M[/STRIKE]etho[STRIKE]d[/STRIKE]e [STRIKE]i[/STRIKE]st ni[STRIKE]c[/STRIKE]ht s[STRIKE]i[/STRIKE][STRIKE]c[/STRIKE]htbar,[STRIKE] [/STRIKE]ab[STRIKE]e[/STRIKE]r [STRIKE]d[/STRIKE]er [STRIKE]V[/STRIKE]e[STRIKE]r[/STRIKE]be[STRIKE]s[/STRIKE]se[STRIKE]r[/STRIKE]ungsvorsch[STRIKE]l[/STRIKE]a[STRIKE]g[/STRIKE] is[STRIKE]t[/STRIKE] nic[STRIKE]h[/STRIKE]t korrekt.
 
Mal andersrum:
Die Klasse DummyMove hat eine Methode getPower() geerbt. Auf diese hast du innerhalb der Klasse zugriff. Aber du hast keinen Zugriff auf die Methode getPower() der Klasse Move.

Folgendes geht also z.B. auch

Java:
public final class DummyMove extends Move {
  private static final int POWER  = 20;
 
  DummyMove() {
    super(POWER);
  }
   
  public static void main(String[] args) {
    DummyMove move = new DummyMove();
    System.out.println(move.getPower());
  }
}


Hm, mit Move move = new DummyMove() beziehen sich die Referenzen also auf die Klasse Move. Aber wenn ich die getPower() überschreib, dann sollte doch die Polymorphie zuschlagen und der Zugriff sollte auf die public getPower() erfolgen....
 
Das haben wir ja jetzt schon geklärt oder? Siehe oben.



Wie kommst du dadrauf? Natürlich überschreibst du die Methode (sonst würde der Compiler bei @Override auch meckern).

Die Fehlermeldung wurde ja nochmal gewünscht. Mit Überschreiben habe ich gemeint, dass ich trotzdem noch keinen Zugriff habe. Stimmt, falsche Formulierung. Nächstes Mal präzieser.
 
Also ich hab's - denke ich - verstanden, wo es mir noch an Verständnis fehlte. Vielen Dank an alle für die schnellen Antworten.

Thread gelte also als beendet und mögen andere daraus lernen.

Gute Nacht!
 
Doch, du hast Zugriff. Aber eben nur auf die Methode getPower() der Klasse DummyMove (welche du geerbt hast und natürlich auch überschreiben kannst, wenn du magst) und du versuchst ja auf die Methode der Klasse Move zuzugreifen .. und das geht eben nicht, weil diese protected ist und du in einem anderen Paket bist.
 
PO[STRIKE]W[/STRIKE][STRIKE]E[/STRIKE]R ist ja priv[STRIKE]a[/STRIKE]te deklariert. D[STRIKE]u[/STRIKE] [STRIKE]s[/STRIKE]o[STRIKE]l[/STRIKE]l[STRIKE]t[/STRIKE]es[STRIKE]t[/STRIKE] dar[STRIKE]a[/STRIKE]uf a[STRIKE]l[/STRIKE]so inn[STRIKE]e[/STRIKE]r[STRIKE]h[/STRIKE]a[STRIKE]l[/STRIKE]b [STRIKE]v[/STRIKE]on Du[STRIKE]m[/STRIKE]myMov[STRIKE]e[/STRIKE] kei[STRIKE]n[/STRIKE]e Zug[STRIKE]r[/STRIKE][STRIKE]i[/STRIKE]ff hab[STRIKE]e[/STRIKE][STRIKE]n[/STRIKE][STRIKE].[/STRIKE]
 
PO[STRIKE]W[/STRIKE][STRIKE]E[/STRIKE]R ist ja priv[STRIKE]a[/STRIKE]te deklariert. D[STRIKE]u[/STRIKE] [STRIKE]s[/STRIKE]o[STRIKE]l[/STRIKE]l[STRIKE]t[/STRIKE]es[STRIKE]t[/STRIKE] dar[STRIKE]a[/STRIKE]uf a[STRIKE]l[/STRIKE]so inn[STRIKE]e[/STRIKE]r[STRIKE]h[/STRIKE]a[STRIKE]l[/STRIKE]b [STRIKE]v[/STRIKE]on Du[STRIKE]m[/STRIKE]myMov[STRIKE]e[/STRIKE] kei[STRIKE]n[/STRIKE]e Zug[STRIKE]r[/STRIKE][STRIKE]i[/STRIKE]ff hab[STRIKE]e[/STRIKE][STRIKE]n[/STRIKE][STRIKE].[/STRIKE]

Wie meinst du diesen Zugriff konkret? So:

Java:
  public static void main(String[] args) {
    DummyMove move = new DummyMove();
    System.out.println(move.POWER);
  }
 
Das war nur ein Bespiel. Ich hab bloß manche Methoden, die sollen protected sein. Hab dann angefangen zu experimentieren, um den passenden Zugriffsmodifizierer zu suchen, sprich protected oder default. Und bin auf mein Problemchen gestoßen^^
 
Wie meinst du diesen Zugriff konkret? So:

Java:
  public static void main(String[] args) {
    DummyMove move = new DummyMove();
    System.out.println(move.POWER);
  }

Das [STRIKE]i[/STRIKE][STRIKE]s[/STRIKE][STRIKE]t[/STRIKE] ja P[STRIKE]O[/STRIKE]W[STRIKE]E[/STRIKE][STRIKE]R[/STRIKE] von DummyMove. Ich mein[STRIKE]t[/STRIKE]e aber das POWER v[STRIKE]o[/STRIKE][STRIKE]n[/STRIKE] Mov[STRIKE]e[/STRIKE] 😉

Verwi[STRIKE]r[/STRIKE][STRIKE]r[/STRIKE]e[STRIKE]n[/STRIKE]d[STRIKE],[/STRIKE] wenn alle[STRIKE]s[/STRIKE] die[STRIKE]s[/STRIKE]elb[STRIKE]e[/STRIKE] Be[STRIKE]z[/STRIKE]e[STRIKE]i[/STRIKE]c[STRIKE]h[/STRIKE][STRIKE]n[/STRIKE][STRIKE]u[/STRIKE]ng h[STRIKE]a[/STRIKE]t 😉 Aber wenn du d[STRIKE]a[/STRIKE]rauf nich[STRIKE]t[/STRIKE] [STRIKE]d[/STRIKE]ir[STRIKE]e[/STRIKE]kt zugreifen wi[STRIKE]l[/STRIKE]lst, [STRIKE]a[/STRIKE]uch in erbe[STRIKE]n[/STRIKE]d[STRIKE]e[/STRIKE]n K[STRIKE]l[/STRIKE][STRIKE]a[/STRIKE]sse[STRIKE]n[/STRIKE] nich[STRIKE]t[/STRIKE][STRIKE],[/STRIKE] dann ist pri[STRIKE]v[/STRIKE]ate als [STRIKE]M[/STRIKE]o[STRIKE]d[/STRIKE]ifi[STRIKE]e[/STRIKE]r [STRIKE]r[/STRIKE]ichtig. [STRIKE]G[/STRIKE]ut, da[STRIKE]s[/STRIKE] [STRIKE]T[/STRIKE]he[STRIKE]m[/STRIKE]a s[STRIKE]c[/STRIKE]heint gel�st zu sein
 
Das [STRIKE]i[/STRIKE][STRIKE]s[/STRIKE][STRIKE]t[/STRIKE] ja P[STRIKE]O[/STRIKE]W[STRIKE]E[/STRIKE][STRIKE]R[/STRIKE] von DummyMove. Ich mein[STRIKE]t[/STRIKE]e aber das POWER v[STRIKE]o[/STRIKE][STRIKE]n[/STRIKE] Mov[STRIKE]e[/STRIKE] 😉

Verwi[STRIKE]r[/STRIKE][STRIKE]r[/STRIKE]e[STRIKE]n[/STRIKE]d[STRIKE],[/STRIKE] wenn alle[STRIKE]s[/STRIKE] die[STRIKE]s[/STRIKE]elb[STRIKE]e[/STRIKE] Be[STRIKE]z[/STRIKE]e[STRIKE]i[/STRIKE]c[STRIKE]h[/STRIKE][STRIKE]n[/STRIKE][STRIKE]u[/STRIKE]ng h[STRIKE]a[/STRIKE]t 😉 Aber wenn du d[STRIKE]a[/STRIKE]rauf nich[STRIKE]t[/STRIKE] [STRIKE]d[/STRIKE]ir[STRIKE]e[/STRIKE]kt zugreifen wi[STRIKE]l[/STRIKE]lst, [STRIKE]a[/STRIKE]uch in erbe[STRIKE]n[/STRIKE]d[STRIKE]e[/STRIKE]n K[STRIKE]l[/STRIKE][STRIKE]a[/STRIKE]sse[STRIKE]n[/STRIKE] nich[STRIKE]t[/STRIKE][STRIKE],[/STRIKE] dann ist pri[STRIKE]v[/STRIKE]ate als [STRIKE]M[/STRIKE]o[STRIKE]d[/STRIKE]ifi[STRIKE]e[/STRIKE]r [STRIKE]r[/STRIKE]ichtig. [STRIKE]G[/STRIKE]ut, da[STRIKE]s[/STRIKE] [STRIKE]T[/STRIKE]he[STRIKE]m[/STRIKE]a s[STRIKE]c[/STRIKE]heint gel�st zu sein

Es wäre nett, wenn du solchen Schwachsinn lässt. Mit sowas ist keinem geholfen und es wird nur schwer lesbar.
 
Es wäre nett, wenn du solchen Schwachsinn lässt. Mit sowas ist keinem geholfen und es wird nur schwer lesbar.

Bem[STRIKE]�[/STRIKE]he mich, es zu [STRIKE]v[/STRIKE][STRIKE]e[/STRIKE]rmei[STRIKE]d[/STRIKE][STRIKE]e[/STRIKE][STRIKE]n[/STRIKE] 😉 [STRIKE]S[/STRIKE]ehe scho[STRIKE]n[/STRIKE], habe e[STRIKE]i[/STRIKE]nen [STRIKE]e[/STRIKE]mp[STRIKE]f[/STRIKE]indl[STRIKE]i[/STRIKE]c[STRIKE]h[/STRIKE]en N[STRIKE]e[/STRIKE]rv ge[STRIKE]t[/STRIKE]ro[STRIKE]f[/STRIKE]f[STRIKE]e[/STRIKE][STRIKE]n[/STRIKE] b[STRIKE]e[/STRIKE][STRIKE]i[/STRIKE]m Bos[STRIKE]s[/STRIKE] 😉
 

Neue Themen


Zurück
Oben