luni, 12 iulie 2010

Din capcanele polimorfismului (3)

Când vorbim despre polimorfism in Java, de obicei ne referim la metode. Oare lucrurile se petrec la fel și in cazul variabilelor ? Putem vorbi de overriding, sau de dynamic binding ? (overloading-ul variabilelor nu poate exista, puteți verifica simplu de tot).

/**
 * Analizati codul din Clasa1 si Clasa2. Ce observati la
 * variabilele i3 si i5 ?
 * Rulati metoda Polimorfism3.main(). Retineti si interpretati
 * afisajul din consola.
 * Incercati sa decomentati ultimele linii din main(). Ce eroare
 * ar aparea ? De ce ?
 * Decomentati metodele din Clasa2 (exceptand getI5() care
 * genereaza eroare de  compilare) si rulati din nou main().
 * Comparati rezultatele cu rularea anterioara.
 * Concluzie: exista overriding si dynamic binding in cazul
 * variabilelor statice si nestatice ?
*/
package test;
import work.Clasa1;
import work.Clasa2;
public class Polimorfism3 {
    public static void main (String [] args){
        Clasa1 a = new Clasa2();//referinta Clasa1, obiect Clasa2
        System.out.println(a.getI1()+" "+a.getI2()+" "+ a.getI3()
                           +" "+a.i3+" "+a.getI4()+" "+a.i4);
        test1(a); test2(a);      
        Clasa2 b = new Clasa2();//referinta Clasa2, obiect Clasa2
        test1(b); test2(b);
//      System.out.println(b.getI1()+" "+b.getI2()+" "+ b.getI3()
//                         +" "+b.i3+" "+b.getI4()+" "+b.i4);
    }
   
    public static void test1(Clasa1 obj){
        System.out.println(obj.i5);
    }
    public static void test2(Clasa1 obj){
        System.out.println(obj.getI5());
    }
}

package work;
public class Clasa1 {
    private static int i1 = 1;
    private int i2 = 2;
    public static int i3 = 3;    //vizibilitate maxima ("public")
    public int i4 = 4;
    public int i5 = 5;           //tip: int
   
    public int getI1(){
        return i1;
    }
    public int getI2(){
        return i2;
    }
    public int getI3(){
        return i3;
    }
    public int getI4(){
        return i4;
    }
    public int getI5(){
        return i5;
    }
}

package work;
public class Clasa2 extends Clasa1 {
  //definim variabile cu acelasi nume ca cele din Clasa1:
    private static int i1 = 6;
    private int i2 = 7;
    int i3 = 8; //nu mai este nici public nici static !
    public int i4 = 9;
    public String i5 = "string: 10"; //schimbare de tip !

//  public int getI1(){
//      return i1;
//  }
//  public int getI2(){
//      return i2;
//  }
//  public int getI3(){
//      return i3;
//  }
//  public int getI4(){
//      return i4;
//  }
//  public String getI5(){
//      return i5;
//  }
}

Niciun comentariu:

Trimiteți un comentariu