Abstrakte Klassen

Diskutiere Abstrakte Klassen im Java Basics - Anfänger-Themen Bereich.
B

Bright4.5

Hallo Leute,

ich habe hier eine Aufgabe aus meinem Skript ohne Lösung und wollte hier mal kurz fragen, ob ich es soweit richtig verstehe,

Der Code ist wie folgt;

Java:
public abstract class Klasse1 {

int j;

}

public class Unterklasse extends Klasse1{

Unterklasse(int j ) {
super.j = j;

}

abstract void do(){
}

public static void main(String[] args) {

Klasse1 b = new Klasse1() ;
Unterklasse a = new Unterklasse();

b = a;
a= b;

}

So nun soll man die ganzen Fehler in dem Code finden. Dies wäre mal soweit mein Ansatz:

Fehler 1; Klasse1 b = new Klasse1() ; -----> hier liegt ein Fehler vor, da man von abstrakten Klassen nicht instanziieren kann.

Fehler 2: super.j = j; -------> Es wird hier versucht den Superklassenkonstruktur aufzurufen, was hier so nicht möglich ist.

Fehler 3: a= b; -------> Es wird versucht ein Subtyp als Deklarationstyp einem Supertyp zuzuweisen.

Kann man hier bitte jemand sogan, ob das soweit passt und welche weiteren Fehler sich noch in dem Code eingeschlichen haben??

Vielen Dank im Voraus.
 
Zuletzt bearbeitet von einem Moderator:
W

White_Fox

Bitte setz deinen Code in Codetags. Dann kann man das auch erträglich lesen.

Java:
public abstract class Klasse1 {
    int j;
}

public class Unterklasse extends Klasse1{
    Unterklasse(int j ) {
        super.j = j;
    }

    abstract void do(){
    }

    public static void main(String[] args) {
        Klasse1 b = new Klasse1() ;
        Unterklasse a = new Unterklasse();

        b = a;
        a= b;
    }
} // Diese Klammer scheint zu fehlen
 
W

White_Fox

Fehler 1; Klasse1 b = new Klasse1() ; -----> hier liegt ein Fehler vor, da man von abstrakten Klassen nicht instanziieren kann.
Korrekt, das geht so nicht.

Fehler 2: super.j = j; -------> Es wird hier versucht den Superklassenkonstruktur aufzurufen, was hier so nicht möglich ist.
Falsch, es wird kein Konstruktor aufgerufen. Sondern du überschreibst die Variable j der Superklasse. In diesem Fall geht das, da j package private ist.
Allerdings ist das grottenschlechter Stil.

Fehler 3: a= b; -------> Es wird versucht ein Subtyp als Deklarationstyp einem Supertyp zuzuweisen.
Richtig, a = b geht so nicht.

Einen Fehler hast du noch übersehen. Schau dir mal die Instanzierung von Unterklasse an.


Nachtrag:
Noch eine Anmerkung zu Fehler 2: Da ich dir die Lösung nicht einfach vor die Füße werfen will, solltest du an dieser Stelle nochmal genau nachsehen. Auch wenn das, was du sagtest, nicht richtig war, so befindet sich an dieser Stelle dennoch ein Fehler.
 
B

Bright4.5

hmm kann es sein, dass weil in der Unterklasse eine abstrakte Methode deklariert wird, diese auch als abstrakt anzusehen ist und deshalb von dieser auch nicht instanziiert werden darf?
 
W

White_Fox

Ja, stimmt, aber das meinte ich gar nicht.

Wenn du von einer Klasse erbst, dann wird im Konstruktor der erbenden Klasse IMMER erst der Konstruktor der Superklasse aufgerufen. Wenn du es nicht explizit hinschreibst tut die JVM das trotzdem, aber eigentlich ist es guter Stil, das auch hinzuschreiben, Netbeans macht das in der Codevervollständigung automatisch.
 
B

Bright4.5

Unterklasse a = new Unterklasse(); ---> wäre dies hier dann eigentlich auch falsch??


Wenn du von einer Klasse erbst, dann wird im Konstruktor der erbenden Klasse IMMER erst der Konstruktor der Superklasse aufgerufen. Wenn du es nicht explizit hinschreibst tut die JVM das trotzdem, aber eigentlich ist es guter Stil, das auch hinzuschreiben, Netbeans macht das in der Codevervollständigung automatisch. --------> aber wo ist dann hier der Fehler?? In der Unterklasse wird ein Konstruktor aufgerufen, bei dem man versucht, das Attribut aus der Superklasse zu initialisieren.
 
W

White_Fox

Unterklasse a = new Unterklasse(); ---> wäre dies hier dann eigentlich auch falsch??
Die Klasse Unterklasse hat ja eine abstrakte Methode. Daher muß die Klasse auch abstrakt sein (public class Unterklasse ist demnach schon falsch, es muß abstract public class Unterklasse heißen), das hast du ja schon erkannt.
Und damit hast du schon die Antwort auf deine Frage... :)
 
B

Bright4.5

Okay, vielen Dank schon mal.

super.j = j; ----> also das hier wäre soweit okay, oder?


Es waren also insgesamt 4 Fehler versteckt, oder?
 
W

White_Fox

Ja, es würde kompilieren. Aber so sollte man wirklich nicht pogrammieren.
 
mihe7

mihe7

Da sind wesentlich mehr Fehler enthalten, die auch noch unterschiedlich behandelt werden können. Das lässt sich leicht mit der IDE bzw. dem Compiler herausfinden:

1. Wie man bereits am Syntaxhighlighting hier im Forum erkennen kann, ist do ein Schlüsselwort, das nicht für einen Methodennamen verwendet werden darf.
2.1 Da es sich bei do um eine abstrakte Methode handelt, darf sie keine Implementierung haben. Die geschweiften Klammern müssen also auch weg.
2.1.1 Die es sich bei do um eine abstrakte Methode handelt, muss auch die Klasse abstrakt sein.
2.1.2 Wenn die Klasse abstrakt ist, kann sie in main aber auch nicht instantiiert werden.
2.2 Alternative zu 2.1: man entfernt das abstract bei der Methode do (bzw. der umbenannte Methode)
3. Unterklasse hat keinen Standardkonstruktor und kann daher nicht ohne Parameter instantiiert werden.
3.1 Man spendiert der Unterklasse einen Standardkonstruktor
3.2 Alternative zu 3.1: man verwendet den passenden Konstruktor bei der Objekterzeugung.
4. Klasse1 ist abstrakt und kann daher in main nicht instantiiert werden.
4.1 Man entfernt die Objekterzeugung von Klasse1 in main, dann bekommt man das Problem, dass a nicht deklariert ist.
4.2 Alternative: man entfernt das abstract von Klasse1.
5. Die Zuweisung eines Objekts der Superklasse zu einem Variablen, die ein Objekt der Unterklasse erwartet, ist so oder so unzulässig (a=b)

Nachtrag: zu super: das Schlüsselwort wird allgemein benötigt, um zwischen Deklarationen in der aktuellen und der Superklasse unterscheiden zu können. Da im konkreten Fall das j nicht nochmal in der Unterklasse deklariert wurde, spielt es technisch keine Rolle, ob man super.j oder this.j verwendet.
 
Thema: 

Abstrakte Klassen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben