Verwendung von Super

Status
Nicht offen für weitere Antworten.

siebeck

Mitglied
Habe folgendes Programm geschrieben:

Code:
class Superklasse {
	String a;
	int b;
	
	Superklasse() {a="Test";}
	Superklasse(int i) {b=i;}
	
	void m() {System.out.println("aktuell");}
}


class Subklasse extends Superklasse {
	Subklasse() {}

	Subklasse(int i,int j) {
		super(i+j);
		a="nicht notwendig";
}
}

class Vererbungstest {
	public static void main (String[] args) {
		Subklasse sk=new Subklasse();
		System.out.println(sk.a);
		sk.m();
	}
}

Dazu 2 Fragen:

1)
Es kommt die Ausgabe "Test aktuell".
Ich verstehe das Programm so, das mit dem super-Aufruf der Konstruktor der Superklasse aufgerufen wird. Dieser weist a="Test" zu, damit Ausgabe "Test".
Wenn ich aber super(i+j) weglasse, dürfe doch eigentlich der KOnstruktor der SUperklasse nicht aktiviert werden, oder? Trotzdem kommt bei Ausführung die Meldung "Test aktuell".

2)
Wenn ich die Main-Auführung ändere in System.out.println(sk.b), kommt die Ausgabe "0 aktuell".
Ändere ich die Zeile der SUperklasse in Superklasse(int i) {b=5}, kommt trotzdem die Ausgabe "0 aktuell", nicht "5 aktuell", weshalb?

Danke für die Antworten.

[Edit by Beni: Codetags]
 
S

SlaterB

Gast
1)
so wie das Programm derzeit aussieht wird der Konstrukter Subklasse(int i,int j) gar nicht verwendet, es wäre also egal wenn du darin was wegläßt,

aber selbst wenn du diesen Konstruktor verwendest und super(i+j) wegläßt gilt: das Super-Objekt muss irgendwie initialisiert werden,
solange du nicht super(irgendwas); hinschreibst wird stillschweigend super(); angenommen/ eingefügt

hätte deine Super-Klasse keinen default-Konstruktor Superklasse(),
dann würdest du sogar eine Fehlermeldung bekommen, dass du den Super-Konstruktor manuell setzen musst,
Beispiel:

Code:
public class Test {

    public static void main(String[] args) {

        Subklasse sk = new Test().new Subklasse(2, 3);
        System.out.println(""+sk.b);
        sk.m();

    }

    class Superklasse {
        String a;

        int b;

       

        Superklasse(int i) {
            b = i;
        }

        void m() {
            System.out.println("aktuell");
        }
    }

    class Subklasse extends Superklasse {
        Subklasse() {
        }

        Subklasse(int i, int j) {
            a = "nicht notwendig";
        }
    }

}



------------


hat eine Klasse überhaupt keine Konstruktoren, dann wird übrigends der StandardKonstruktor
Klassenname() {
}
automatisch eingefügt, bzw. es gibt wieder Fehlermeldungen wenn Superklasse dies nicht mit einem Defaultkonstruktor unterstützt

-------------------

2)
wieder weil der Konstruktr i,j gar nicht verwendet wird?
bei mir klappts:

Code:
public class Test {

    public static void main(String[] args) {

        Subklasse sk = new Test().new Subklasse(2, 3);
        System.out.println(""+sk.b);
        sk.m();

    }


    class Superklasse {
        String a;

        int b;

        Superklasse() {
            a = "Test";
        }

        Superklasse(int i) {
            b = i;
        }

        void m() {
            System.out.println("aktuell");
        }
    }

    class Subklasse extends Superklasse {
        Subklasse() {
        }

        Subklasse(int i, int j) {
            super(i + j);
            a = "nicht notwendig";
        }
    }

}
 
Hi,
erstmal ein dringender Tipp, überarbeite deinen Codestil. Auch ganz wichtig, wenn du in diesem Forum Code postest, dann benutz doch bitte auch die Code-Tags, darin sieht dein Code dann auch lesbar aus.
Was den Codestil angeht, ich kann dir "The Elements of Java Style" sehr empfehlen.
Ein paar einfache Regeln die du jedenfalls beachten solltest:
  • Einrücken von Code, so dass die Hierachie deutlich wird
  • Jede Anweisung erhält eine eigene Zeile
  • Variablen sollten Sinnvoll benannt werden (hier noch mal ok)
  • Qualifiziere deine Klassenvariablen mit this
  • ....

Wenn du die Vererbung verstanden hast, solltest du eigentlich wissen, warum das passiert. Wenn du von einer Klasse erbst, so erbst du alle ihre Eigenschaften und Methoden (die du nicht überschreibst). Du kannst deine SubKlasse überall dort verwenden, wo die SuperKlasse benötigt wird, denn sie ist nur eine spezielle SuperKlasse. Alle Eigenschaften der SuperKlasse werden also auch von der SubKlasse zur Verfügung gestellt. Das heißt insbesondere, dass du alle Variablen durch den Konstruktor anlegen lassen musst. Das heißt, dass eine abgeleitete Klasse immer implizit den Konstruktor von der SuperKlasse aufrufen wird. Die einzigste Ausnahme besteht darin, dass du explizit einen Konstruktor angibst. In jedem anderen Fall wird der parameterlose Konstruktor aufgerufen (ohne dass du eine Zeile Code schreibst). In dem muss ja schließlich mindestens der Speicher für dein Objekt reserviert werden.

Code:
class SuperClass {
  String a;
  int b;

  SuperClass() {
    this.a = "Test";
  }

  SuperClass(int i) {
    this.b = i;
  }
}

class SubClass extends SuperClass {

  SubClass(int i, int j) {
    super(i + j); <-- expliziter Aufruf eines speziellen Konstruktors
    a = "nicht notwendig";
  }

  SubClass() {
     // <-- Kein Konstruktoraufruf der Super-Klasse
     // führt zu implizitem Aufruf von super();
  }

}
 

siebeck

Mitglied
Wegen super hier nochmal ein anderes Programm

Code:
class X {

		void compare(X x) {
			if (this.getClass().isInstance(x)) {
				System.out.println("x ist vom selben Typ wie this bzw. vom Supertyp");
				//wird aufgerufen
			}
			else
				System.out.println("x ist ni8cht zuweisungskompatible mit this");
			}
		}

class Y extends X {
	void compare (X x) {
		System.out.println("Test class Y");
		super.compare(x); //Xx von Supertyp wird aufgerufen
	}
}

class Z extends Y {
	public static void main (String argv[]) {
		X x =new Y(); //Xx von Klasse Y wird aufgerufen
		x.compare(new Z());
	}
}

Bei Ausführung des Programms erscheint: "x ist vom selben Typ.."

wenn ich hier super weglasse, wird der Konstruktor der Superklasse nicht aufgerufen. Liegt das daran, das hier bei der Klasse y der Konstruktor y() nicht aufgerufen wird?

Entschuldige, wenn ich total daneben liege, ich bin totaler Anfänger

[Edit by Beni: Codetags]
 

Lim_Dul

Top Contributor
Das sind Methoden, die du da definierst, keine Konstruktoren.

Bei Methoden wird nicht automatisch die Methode der Oberklasse aufgerufen, nur bei Konstruktoren.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Input/Output Verwendung des Euro-Zeichens in Java Java Basics - Anfänger-Themen 7
D Probleme bei Verwendung short und int im Constuctor Java Basics - Anfänger-Themen 6
T Verwendung jna Java Basics - Anfänger-Themen 15
L Zufälligen Zahlencode, ohne mehrfacher Verwendung einer Ziffer Java Basics - Anfänger-Themen 15
Kirby.exe Frage zur Verwendung von Interfaces Java Basics - Anfänger-Themen 6
S Exception bei Verwendung von LocalDate Java Basics - Anfänger-Themen 19
S Try-Catch in Verwendung einer while Schleife Java Basics - Anfänger-Themen 2
A OOP Richtige Verwendung von ArrayList und equals Java Basics - Anfänger-Themen 24
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
b1ck Scanner schließen, erneute Verwendung Java Basics - Anfänger-Themen 12
H Datentypen Fehler bei Verwendung von enum Java Basics - Anfänger-Themen 9
A Verwendung von Interfaces Java Basics - Anfänger-Themen 7
G Variablen Verwendung von Variablen in anderer Klasse Java Basics - Anfänger-Themen 6
G Verwendung von Konstruktor Java Basics - Anfänger-Themen 8
M Verwendung von System.exit(0) problematisch? Java Basics - Anfänger-Themen 1
D native Methoden, Verwendung? Java Basics - Anfänger-Themen 8
fLooojava kleines Projekt - Verwendung von Youtube Java Basics - Anfänger-Themen 22
X Array Ausgabe bei Verwendung von 2 Schleifen erklären Java Basics - Anfänger-Themen 8
G verwendung von regex Java Basics - Anfänger-Themen 3
K Problem bei der Verwendung von Gregorian Calender Java Basics - Anfänger-Themen 3
T NullPointerException bei Verwendung einer Klasse einer anderen .jar datei Java Basics - Anfänger-Themen 3
B Wie wichtig ist Verwendung von StringBuffer in Schleifen? Java Basics - Anfänger-Themen 10
B Verwendung von Arrays Java Basics - Anfänger-Themen 2
U Verwendung von Interface Java Basics - Anfänger-Themen 33
A Methoden Verwendung von crypt? Java Basics - Anfänger-Themen 2
D Muss ich eigentlich immer auf die Verwendung des richtigen Datentyps achten? Java Basics - Anfänger-Themen 7
D reg Exp, verwendung des endezeichen "$" Java Basics - Anfänger-Themen 5
C Verwendung von Schleifen? Java Basics - Anfänger-Themen 18
J Datentypen Array - Verwendung im Konstruktor Java Basics - Anfänger-Themen 8
C Verwendung von primitiven Datentypen Java Basics - Anfänger-Themen 8
J Problem mit NullPointerException bei Verwendung eines Arrays Java Basics - Anfänger-Themen 6
D Frage zur Verwendung einer Schnittstelle Java Basics - Anfänger-Themen 4
A Verwendung von abstrakten Klassen Java Basics - Anfänger-Themen 17
D Verwendung der Klasse Map Java Basics - Anfänger-Themen 9
C Verwendung von Matrizen in einer Schleife Java Basics - Anfänger-Themen 5
F Umlaute eines Strings entfernen (Verwendung von this?) Java Basics - Anfänger-Themen 2
Daniel_L Verwendung von try und catch bei exceptions Java Basics - Anfänger-Themen 7
I Verwendung von Constant Field Values Java Basics - Anfänger-Themen 4
J Verwendung von eigenen Klassen in JSP Java Basics - Anfänger-Themen 2
G try. catch Verwendung Java Basics - Anfänger-Themen 11
Z Beispiel Würfelspiel mit Verwendung von Feldern Java Basics - Anfänger-Themen 7
H Verwendung lokaler Einstellungen Java Basics - Anfänger-Themen 4
G getName, substring Verwendung Java Basics - Anfänger-Themen 3
I Fehler bei Verwendung von substring Java Basics - Anfänger-Themen 4
M Verwendung von Robot... wie? Java Basics - Anfänger-Themen 6
M Verwendung von "this" Java Basics - Anfänger-Themen 2
U Liste importieren und für weitere Verwendung sichern Java Basics - Anfänger-Themen 4
feuervogel Integral unter Verwendung der Java-Bibliothek berechnen Java Basics - Anfänger-Themen 10
frau-u Probleme mit richtiger Verwendung von FileInputStream Java Basics - Anfänger-Themen 2
S valueOf() vs. toString() Verwendung??? Java Basics - Anfänger-Themen 13
A Kurze Frage zur Verwendung von this Java Basics - Anfänger-Themen 9
S Verwendung bitweiser Operatoren Java Basics - Anfänger-Themen 6
F Verwendung von this in statischen Kontext nicht möglich Java Basics - Anfänger-Themen 8
A "Super" anwenden Java Basics - Anfänger-Themen 13
mrStudent <? extends T> und <? super T> Java Basics - Anfänger-Themen 1
Say super.methode / super.variable und super(variable) Java Basics - Anfänger-Themen 2
M Super(); Java Basics - Anfänger-Themen 1
districon Super-Stichwort/ Vererbung Java Basics - Anfänger-Themen 3
N extends und super vs new object Java Basics - Anfänger-Themen 4
CptK Vererbung Attributtyp in Super-Klasse noch nicht festlegen Java Basics - Anfänger-Themen 1
B Warum können super() und this() nicht gemeinsam in einem Konstruktor verwendet werden? Java Basics - Anfänger-Themen 7
Queiser Super boolean Java Basics - Anfänger-Themen 11
E Vererbung super-Methoden Aufruf Java Basics - Anfänger-Themen 3
B super vs. this Java Basics - Anfänger-Themen 24
M Was macht super (...)? Java Basics - Anfänger-Themen 1
E Daten dem Super Aufruf übergeben Java Basics - Anfänger-Themen 3
Henri Aufruf von getX() und getY() aus der Super klasse Objekt() Java Basics - Anfänger-Themen 3
N Frage zu this, super und return Java Basics - Anfänger-Themen 13
E this() / super() Java Basics - Anfänger-Themen 7
T super Java Basics - Anfänger-Themen 3
G funktionen der super-klasse von der super-klasse Java Basics - Anfänger-Themen 6
O Vererbung this innerhalb von super Java Basics - Anfänger-Themen 7
X Frage zu Sub/Super Klassen Java Basics - Anfänger-Themen 7
V Vererbung (wie) kann man eine 'super'-Methode auf ein Objekt anwenden ? Java Basics - Anfänger-Themen 6
E Erste Schritte <? super Unterklasse> Return-Typ darf nicht vom Wildcard-Typ sein Java Basics - Anfänger-Themen 5
E Erste Schritte Lower Bounded Wildcards <? super Integer> Java Basics - Anfänger-Themen 1
K Vererbung (super) Java Basics - Anfänger-Themen 2
C Super und Unterklassen Java Basics - Anfänger-Themen 6
Avarion Getter von Super-Klasse funktioniert nicht Java Basics - Anfänger-Themen 10
I Verständnisfrage zu BridgePattern, Verwedung von super() Java Basics - Anfänger-Themen 4
llabusch Vererbung Super Konstruktor Java Basics - Anfänger-Themen 5
Z Super einfache Frage For-Schleife im Detail Java Basics - Anfänger-Themen 3
vandread Java Wildcards - Wann super wann extends? Java Basics - Anfänger-Themen 2
A Super Klasse Java Basics - Anfänger-Themen 3
O OOP super aufruf 2 objekte? Java Basics - Anfänger-Themen 3
S super() im Konstruktor Java Basics - Anfänger-Themen 12
L Erste Schritte Super Constructor mit Array - Liste? Java Basics - Anfänger-Themen 15
A Shallow copy .super.clone() Java Basics - Anfänger-Themen 2
P Vererbung super() ohne Parameter Java Basics - Anfänger-Themen 2
D Super und Sub-Klassen Java Basics - Anfänger-Themen 2
D super.tostring Java Basics - Anfänger-Themen 8
A Super-Anweisung in abstrakter Klasse Java Basics - Anfänger-Themen 12
K Überschreiben einer "super.super"-Methode Java Basics - Anfänger-Themen 6
Luk10 super() und this Java Basics - Anfänger-Themen 7
S super() aufruf ausgabe Java Basics - Anfänger-Themen 3
L Frage zu Generics: "super" Java Basics - Anfänger-Themen 16
S super.paint() Java Basics - Anfänger-Themen 4
G Vererbung, Konstruktoranweisungen VOR super() Java Basics - Anfänger-Themen 4
G Variablen initialisieren vor super() Java Basics - Anfänger-Themen 8
H Konstruktoren – super! Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben