Avatar billede Slettet bruger
17. januar 2010 - 20:56 Der er 9 kommentarer og
1 løsning

Constructor til superclass kaldes ved instansoprettelse af subclass

Halløj,

Jeg er lige stødt på det mest besynderlige... Det kan selvfølgelig ske, at det er ganske naturligt, og at jeg er blevet lidt for træt, men se lige på følgende kode engang:

public class Main {
    public static void main(String[] args) {
        MySubclass mySubclass = new MySubclass();
    }
}

public class MyClass {
    private void MyPrivate() {
        System.out.println("MyPrivate");
    }
}

public class MySubclass extends MyClass {
    public MySubclass() {
        System.out.println("MySubclass");
    }
}

Ved kørsel får jeg følgende i konsollen:

MyClass
MySubclass

Altså kaldes først constructor til Myclass og derefter MySubclass. Hvad pokker?
Avatar billede Slettet bruger
17. januar 2010 - 20:58 #1
Hov, jeg klippede vist instruktoren ud af MyClass og efterlod den ret så ligegyldige MyPrivate... Her:

public class Main {
    public static void main(String[] args) {
        MySubclass mySubclass = new MySubclass();
    }
}

public class MyClass {
    public MyClass() {
        System.out.println("MyClass");
    }
}

public class MySubclass extends MyClass {
    public MySubclass() {
        System.out.println("MySubclass");
    }
}
Avatar billede arne_v Ekspert
17. januar 2010 - 21:19 #2
Det er helt som det skal være.

Den venlige Java compiler fortolker:

    public MySubclass() {
        System.out.println("MySubclass");
    }

som:

    public MySubclass() {
        super(); // kald af super klasses constructor
        System.out.println("MySubclass");
    }
Avatar billede arne_v Ekspert
17. januar 2010 - 21:21 #3
I Java Language Specification formuleres det som:

If a constructor body does not begin with an explicit constructor invocation and the constructor being declared is not part of the primordial class Object, then the constructor body is implicitly assumed by the compiler to begin with a superclass constructor invocation "super();", an invocation of the constructor of its direct superclass that takes no arguments.
Avatar billede Slettet bruger
17. januar 2010 - 22:19 #4
Tak :) Så hvordan undgår jeg evt. at overklassens constructor kaldes?
Avatar billede arne_v Ekspert
17. januar 2010 - 22:29 #5
Det kan du ikke. Det er en helt fundamental egenskab at super klassens constructor skal kaldes. Ellers er objektet ikke i konsistent state.
Avatar billede Slettet bruger
17. januar 2010 - 23:11 #6
Godt så. Jeg kan kun undre mig over, hvorfor jeg mindes at have fået klart at vide, at overklassens constructor aktivt skal kaldes... Det må jeg lige tjekke. Smid et svar :)
Avatar billede Slettet bruger
17. januar 2010 - 23:15 #7
Invoking Superclass Constructors
• Use super keyword in subclass constructor:
public Manager(String aName) {
    super(aName);
    // calls superclass constructor
    bonus = 0;
}
• Call to super must be first statement in subclass
constructor
• If subclass constructor doesn't call super, superclass
must have constructor without parameters


Så super() bruges udelukkende, når overklassens constructor kræver parametre - i hvilket tilfælde det er et krav?
Avatar billede arne_v Ekspert
17. januar 2010 - 23:17 #8
Hvis super klassen har en constructor uden argumenter, så virker den default indsættelse.

Hvis super klassen kun har constructorer med argumenter, så er du nødt til at lave det eksplicitte kald.

Hvilket er det samme som det du citerer, bare vendt lidt om.
Avatar billede arne_v Ekspert
17. januar 2010 - 23:17 #9
og et svar
Avatar billede Slettet bruger
17. januar 2010 - 23:21 #10
Det var cirka det, jeg forsøgte at skrive. Men hjerne gik vist til ro for et par timers tid siden.
Takker!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester