Laborator 5: Middle - C C - Sharp B - Flat
Laborator 5: Middle - C C - Sharp B - Flat
class Super {
public int field = 0;
public int getField() { return field; }
}
class Sub extends Super {
public int field = 1;
public int getField() { return field; }
public int getSuperField() { return super.field; }
}
public class FieldAccess {
public static void main(String[] args) {
Super sup = new Sub(); // Upcast - construim clasa Super cu constructorul clasei Sub
//sup.field = 0 - se afiseaza valoarea din clasa de baza
//sup.getField()=1 - se afiseaza valoarea din clasa derivata (suprascrierea atributelor nu e posibila)
System.out.println("sup.field = " + sup.field + ", sup.getField() = " + sup.getField());
Sub sub = new Sub();
System.out.println("sub.field = " + sub.field +
", sub.getField() = " + sub.getField() +
", sub.getSuperField() = " + sub.getSuperField());
}}
3. In constructor nu se realizeaz legare dinamic daca apelam o metoda legata dinamic
(suprascrisa in clasa derivata) in interiorul constructorului se va apela metoda suprascrisa
(pot aparea probleme)
class Glyph {
void draw() { System.out.println("Glyph.draw()"); }
Glyph() {
System.out.println("Glyph() before draw()");
draw(); // atentie: care draw va fi apelat?
//se va apela draw() din clasa derivata
//dar valoarea lui radius nu va fi 1
System.out.println("Glyph() after draw()");
}
}
class RoundGlyph extends Glyph {
private int radius = 1;
RoundGlyph(int r) {
//se face apel automat la constructorul fara
//argumenente din clasa de baza
radius = r;
System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius);
}
void draw() {
System.out.println("RoundGlyph.draw(), radius = " + radius);
}
}
public class PolyConstructors {
public static void main(String[] args) {
new RoundGlyph(5);
//Glyph - are constructor fara argumente
//constructorul RoundGlyph asigura apelul automat
//al cosntructorului fara argumente din clasa de baza
}
}
5. Downcast si RRTI la conversie invers upcast, in caz de esec se arunca exceptie de tipul
ClassCastException
class Useful {
public void f() {}
public void g() {}
}
class MoreUseful extends Useful {
public void f() {}
public void g() {}
public void u() {}
public void v() {}
public void w() {}
}
public class RTTI {
public static void main(String[] args) {
Useful[] x = {
new Useful(),
new MoreUseful()
};
x[0].f();
x[1].g();
// Compile time: method not found in Useful:
//! x[1].u();
((MoreUseful)x[1]).u(); // Downcast/RTTI
//se face conversie dinspre tipul de baza
//spre tipul derivat x[1]-de tip MoreUseful
//x[0] - de tip Useful nu are metoda u()
//desi se face conversie catre tipul MoreUseful
((MoreUseful)x[0]).u(); // Exception thrown
}
}