Frage zu protected

Billie

Erfahrenes Mitglied
Hellas!

Also, gegeben ist eine Klasse A mit einer protected methode a(). Des weiteren eine Klasse B die von A ableitet und eine Methode b(A a) besitzt.

Warum darf die Methode b nicht auf die Methode a() der Instanz a zugreifen?!

Ich möchte eigentlich erreichen, dass nur abgeleitete Klassen von A auf die methode a() zugreifen können. Allerdings abgeleitete Klassen auch auf Instanzen von A.

In einem klassischem equals darf die Klasse ja auch direkt auf das Attribut einer anderen Klasse zugreifen, Bsp:

Java:
class A {

	private long attr = 0L;


	public boolean equals(Object obj) {
		A a = (A) obj;
		return attr == a.attr;
	}

}

Klar, es handelt sich um ein und dieselbe Klasse - trotzdem dachte ich protected ist hier etwas lockerer.
 
Zuletzt bearbeitet von einem Moderator:
Doch, jetzt habe ich das Problem gefunden. Die Methode b(A a) der Unterklasse B darf auf die Methode a() der Instanz a zugreifen, sofern die Klasse B im selben Package wie A liegt.

Ist bei mir aber leider nicht der Fall :(
 
Wenn du jetzt mit "ableiten" erben meinst, dann müsstest du die Methode überschreiben und mit einem super-Aufruf arbeiten, damit die Methode in der abgeleiteten Klasse ohne weitere Probleme verwendet werden kann. Nebenher kannst du dann auch den Modifier etwas lockern und auf public setzen, ist aber nicht notwendig.

Soweit ich das verstanden habe :)
 
Hellas!

Wenn ich in der Klasse B die Methode a überschreibe bringt mir das eigentlich nichts.

Als hier doch ein Beispiel-Code:


Java:
package a;

public class A {

    protected void a() {
        System.out.println("A:a()");
    }
}

Klasse B lässt sich nicht kompilieren:

Java:
package b;

import a.A;

public class B
    extends A {

    public void b(A a) {
        System.out.println("B:b(A)");
        a.a(); // The method a() from the type A is not visible
    }
}
 
Zuletzt bearbeitet von einem Moderator:
Ich hab das auch jetzt anderst gemeint. Du hast es nicht so umgesetzt, wie ich das meinte. Ich meinte das so:

Java:
package a;

public class A {

	protected void a() {
		System.out.println("A:a()");
	}
}

Java:
package b;

import a.A;

public class B extends A {
	
	public void b() {
		System.out.println("B:b(A)");
		a();
	}
	
	@Override
	public void a() {
		super.a();
	}

}

und meine Testklasse:

Java:
package test;

import b.B;

public class Test {

	static B b = new B();
	
	public static void main(String[] args) {
		b.b();
	}
}

So funktioniert es, denn durch die Vererbung ist die Methode bekannt und kann überschrieben(!) werden, damit sie in der Klasse sichtbar ist. Mit dem Codeschnipsel
Java:
super.a()
rufst du die Methode aus der Hauptklasse auf und verwendet neben möglichen eigenen Code der Klasse B den Inhalt der Klasse A.
Das habe ich damit gemeint.
 
Zurück