Avatar billede dresen Nybegynder
10. september 2005 - 20:54 Der er 10 kommentarer

Initialisering af felter og variable

Hej eksperter

Jeg roder med initialisering af fields og variable, og er nået til et punkt, hvor jeres hjælp er nødvendig

Jeg arbejder med følgende klasser:

// class AAA
public class AAA {

    private String a = "Hello";
    private String b;
    private int x = 17;
   
    public AAA(String s){
        b = s;
    }
   
    public AAA(){
        b ="Goodbye";
    }

}

// class BBB
public class BBB extends AAA{

    private String c = "Go'dag";
   
    public BBB(){
        super(null);
                   
        c = "Davs";
    }
   
}
// class InitializeOrder
public class InitializeOrder {

    public static void main(String[] args){
        AAA a = new BBB();
       
    }
       
}


I BBB's konstruktør er det muligt at foretage kaldet til parent-klassens konstruktør med argumentet super(null);

Mit spørgsmål går på, hvorfor det ikke er muligt at udskifte parameteren så den kommer til at se ud som følger:

super(c); . Forud for kald til parent-klassens konstruktør, er c blevet initialiseret til standarværdien null.

Hvorfor kan kaldet så ikke lade sig gøre?
Avatar billede _carsten Nybegynder
10. september 2005 - 21:09 #1
Der er simpelthen en regel som siger:
  Kald af constructor i superklasse SKAL være første linie i subklasses constructor - derfor
Avatar billede erikjacobsen Ekspert
10. september 2005 - 21:13 #2
Det er nu mere fordi:
  cannot reference c before supertype constructor has been called
Altså det objekt man er i oprettes ikke før super-klassen er blevet oprettet, og derfor "eksisterer" slet ikke på det tidspunkt.
Avatar billede erikjacobsen Ekspert
10. september 2005 - 21:14 #3
...derfor "eksisterer" c slet ikke på det tidspunkt.
Avatar billede _carsten Nybegynder
10. september 2005 - 21:15 #4
Og så er det egentlig forkert af mig og skrive "første linie", det rigtige svar er "første statement"
Avatar billede _carsten Nybegynder
10. september 2005 - 21:16 #5
Men det mest rigtige er erikjacobsen's kommentar !!!
Avatar billede erikjacobsen Ekspert
10. september 2005 - 21:19 #6
Det kan måske bedst illustreres ved at sige at dette er lovligt - bemærk brug af static:

class BBB extends AAA{

    private static String c = "Go'dag";
 
    public BBB(){
        super(c);
                 
        c = "Davs";
    }
 
}
Avatar billede dresen Nybegynder
10. september 2005 - 23:24 #7
Hej begge to

Tak for jeres svar.

eric, vil det sige, at det først er når subklassens konstruktør er eksekveret, at subobjektet oprettes og der afsættes memory til dette?

Læg gerne et svar

mvh/ dresen
Avatar billede erikjacobsen Ekspert
10. september 2005 - 23:29 #8
Ingen point til mig, tak.

Jeg tror ikke vi behøver at tænke på hvordan det rent fysisk sker i maskinen. Derfor skriver jeg også: "eksisterer". Størrelsen af objektet kendes når du siger new, men rækkefølgen af constructors skal være top-down.
Avatar billede dresen Nybegynder
10. september 2005 - 23:56 #9
hej erik

hvis du ikke vil have point, så er det ihf. på plads at sige MANGE TAK!!!

Hvis du skulle fortryde lader jeg spørgsmålet stå åbent noget tid endnu. I denne periode er carsten velkommen til at byde ind.

I må have en god weekend!
Avatar billede dresen Nybegynder
11. september 2005 - 00:03 #10
på plads = på sin plads :)
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