Avatar billede Bennysørensen Praktikant
29. december 2004 - 13:00 Der er 4 kommentarer og
1 løsning

Up- og downcast

Jeg skal kaste rundt med instanser etc i denne opgave. Jeg forstår løsningen på de fleste af mine spørgsmål, men at

B x = new E();
D y = (D)x;
y.c;

udskriver "c() i E" forstår jeg ikke. Jeg ser det som "X bliver castet til en E, og derefter castes y til at være en D, derfor udskrives metoden i D".

Hvad er det lige jeg har misset undervejs?

public interface A{
    public void a();
}

public interface B{
    public static final double PI = 3.14;
}

public abstract class C implements A{
    public void a(){ System.out.println( "a() i C"); }
    public abstract void c();
}

public class D extends C{
    public void c(){ System.out.println( "c() i D"); }
}

public class E extends D implements B{
    public void a(){ System.out.println( "a() i E"); }
    public void c(){ System.out.println( "c() i E"); }
}

public class F implements B{
    public void a(){ System.out.println( "a() i F"); }
    public void f(){ System.out.println( "f() i F"); }
}

I eksemplet
C x = new D();
x.c(); udskrives "c() i D()"

Forstår jeg svaret som "x, der er en C, castes til at være en D. Da D implementerer C's abstrakte metode c() udskrives c() i D"

Jeg synes at kunne huske at jeg ikke skal opfatte "=" som en assigment-operator, da man caster fra højre mod venstre, altså at C x = new D(); er et upcast, da D er længere nede i hierakiet end C.

...er der nogen der lige kan korreksere mig?

Venligst
Avatar billede arne_v Ekspert
29. december 2004 - 13:13 #1
Alle metoder er virtuelle i Java d.v.s. at man kalder altid metoden i det
oprindeligt instantierede objekt.

Det er helt som det skal være !
Avatar billede arne_v Ekspert
29. december 2004 - 13:14 #2
En cast på objekter ændrer ikke på objektet - kun på hvad objektet
opfattes som.
Avatar billede arne_v Ekspert
29. december 2004 - 13:20 #3
Tænk på en virtuel metode (og alle metoder i Java er virtuelle) som et felt
der indeholder adressen på en metode. De 4 byte bliver sat ved instantiering
og ændre sikke ved cast (ligesom data felter heller ikke ændrer sig).
Avatar billede Bennysørensen Praktikant
29. december 2004 - 13:29 #4
Jeg synes at der er en konflikt af en art mellem
"En cast på objekter ændrer ikke på objektet - kun på hvad objektet
opfattes som." og min forklaring á la

"Jeg synes at kunne huske at jeg ikke skal opfatte "=" som en assigment-operator, da man caster fra højre mod venstre, altså at C x = new D(); er et upcast, da D er længere nede i hierakiet end C."
...dér regner jeg jo med at x rent faktisk bliver lavet om til en D(). Men dét er noget sludder i forhold til at det er et upcast...det er jo referencen x, der er en C(), der castes til en D(), og derved er det ikke et upcast længere...jeg er meget forvirret.
Avatar billede arne_v Ekspert
29. december 2004 - 13:35 #5
Objekter i Java er altid referancer (pointere for C/C++ programmører).

Det er tilladt at assigne fra en D til en C da en D har alle C'e
egenskaber.

Det modsatte er ikke altid tilladt.

Men assignment ændrer ikke på det instantierede objekt.

I C/C++ sprog så type caster man fra en type pointer til en ande type pointer.
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