29. december 2004 - 13:00Der 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.
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).
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.
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.
Synes godt om
Ny brugerNybegynder
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.