sd_curs_2.pdf

14
SDTP - Cursul nr.2 Crearea si utilizarea unui pachet Java - package (continuare) Definirea unui pachet: cu ajutorul instructiunii package plasata la inceputul fisierului package ex_pachet; public class Punct { // . . . } Referirea la aceasta clasa se poate face utilizand instructiunea import import ex_pachet.*; // . . . Punct m = new Punct(); sau denumirea intreaga ex_pachet.Punct m = new ex_pachet.Punct(); java.util.Vector v = new java.util.Vector(); Exemplu. Fisierul citeste.java package citeste; import java.io.*; public class citeste { // // Argumentul text este un mesaj de avertizare // (poate fi si un sir nul "") // public static char car(String text) { char c; if(text!="") System.out.print(text); try { c=(char)System.in.read(); // se ignora Carriage Return if(c=='\r') c=(char)System.in.read(); } catch(IOException e) {return '\n';} return c; } public static String sir(String text) { char b; char[] a=new char[81]; int i=0; if(text!="") System.out.print(text); while((b=car("")) !='\n') a[i++]=b;

Transcript of sd_curs_2.pdf

  • SDTP - Cursul nr.2

    Crearea si utilizarea unui pachet Java - package (continuare)

    Definirea unui pachet: cu ajutorul instructiunii package plasata la inceputul fisierului

    package ex_pachet; public class Punct { // . . . }

    Referirea la aceasta clasa se poate face utilizand instructiunea import

    import ex_pachet.*; // . . . Punct m = new Punct();

    sau denumirea intreaga ex_pachet.Punct m = new ex_pachet.Punct();

    java.util.Vector v = new java.util.Vector();

    Exemplu. Fisierul citeste.java

    package citeste; import java.io.*; public class citeste { // // Argumentul text este un mesaj de avertizare // (poate fi si un sir nul "") // public static char car(String text) { char c; if(text!="") System.out.print(text); try { c=(char)System.in.read(); // se ignora Carriage Return if(c=='\r') c=(char)System.in.read(); } catch(IOException e) {return '\n';} return c; }

    public static String sir(String text) { char b; char[] a=new char[81]; int i=0; if(text!="") System.out.print(text); while((b=car("")) !='\n') a[i++]=b;

  • return new String(a,0,i); }

    // public static int intreg(String text) { int n=0; boolean repeta; do { try { repeta=false; n=Integer.parseInt(sir(text)); } catch(NumberFormatException e){ System.out.println(" - nr. intreg incorect -"); repeta=true; } } while(repeta); return n; }

    // public static double real(String text) { double x=0.; boolean repeta; do { try { repeta=false; x=Double.parseDouble(sir(text)); } catch(NumberFormatException e){ System.out.println(" - nr. real incorect -"); repeta=true; } } while(repeta); return x; } }

    Fisierul ex_pack_cit.java

    import citeste.*; public class ex_pack_cit { public static void main(String argv[]) { System.out.println("Ati introdus sirul :"+citeste.sir("Dati un sir:")); int n=citeste.intreg("\nIntroduceti un intreg\nn="); System.out.println("Ati introdus n="+ n); System.out.println("Ati introdus x="+citeste.real("Un real x=")); System.out.println("Un double fara mesaj de avertizare\n"); double y=citeste.real(""); System.out.print(y);

  • } }

    Observatie. Java considera ca facand parte din acelasi pachet implicit toate fisierele cu extensia java care nu incep cu package.

    Exemplu.

    Fie fisierul UnTest.java

    class UnTest { public void afis() { System.out.println("Clasa din alt pachet"); } }

    si fisierul ExecTest.java

    public class ExecTest { public static void main(String argv[]) { UnTest t = new UnTest(); t.afis(); } }

    Daca se compileaza ultimul fisier, vom observa ca este compilat in mod automat si primul.

    Clasa Object Este radacina ierarhiei tuturor obiectelor create intr-o aplicatie.

    Metode remarcabile equals() compara dou obiecte toString() realizeaza conversia obiect -> ir de caractere finalize() este metoda care este apelat automat de colectorul de gunoaie atunci

    cnd se elibereaz spaiul de memorie nefolosit destroy() n cazul unui applet metoda este apelat automat atunci cnd execuia s-a

    ncheiat sau a fost ntrerupt

    Punct a=new Punct(); System.out.println(a); // a.toString() a=null; // a va fi distrus jn viitor

  • Constructorul este o metod fr rezultat care are acelai nume ca i al clasei. Pot exista mai muli constructori, dar avnd lista de argumente diferit ca numr i-sau tip. Nu este necesar redefinirea metodelor finalize() i destroy(). Ele vor fi redefinite doar dac este necesar efectuarea unor aciuni specifice, cum ar fi salvarea datelor, la momentele respective. Nu exist destructor explicit

    Exemplu

    class Punct { int x,y;

    public Punct() { x=y=0; } public Punct(int xo, int yo) { x=xo; y=yo; } public boolean equals (Punct p) { return x==p.x && y==p.y; } public String toString() { return "(" + x + "," + y + ")"; } } class ex_Punct { public static void main(String args[]) { Punct a=new Punct(), b=new Punct(-1,1); System.out.println(a + " este " + (a.equals(b)?"egal":"diferit de ") + b); } }

    (0,0) este diferit de (-1,1)

    Ecuatia de gradul I Clasa este memorata intr-un fisier separat pentru a putea fi folosita ulterior.

    import citeste.*; class Ec_gr1 { double a,b,x;

  • String rez;

    public Ec_gr1(double a, double b) { this.a=a; this.b=b; if(a==0) if(b==0) rez="nedeterminata"; else rez = "incompatibila"; else { rez="compatibila"; x=-b/a; } } public boolean compatibila() { return rez=="compatibila"; } public double x() { return x; } public String stare() { return rez; } public String toString() { return "Ecuatia "+a+"*x"+(b

  • } }

    c:\pg\sd>java Ex_ecgr1 a=2 b=3 Ecuatia 2.0*x+3.0=0 Solutia este x=-1.5

    Instane predefinite

    null indic faptul c nu s-a atribuit nici o valoare; null indic un Object, el nu poate fi atribuit unei variabile de un tip de date primitiv. Instanta null mai poate fi folosita pentru a indica disponibilizarea unui obiect

    Exemplu: Thread fir=new Thread(this); // ... fir = null;

    Referine

    this o referire explicit la instana curent super - o referin la superclas

    Motenirea

    class tata { // ... } class fiu extends tata { // ... }

    Rezolvarea mai multor ecuatii. Extinderea clasei Ec_gr1

    class Ec_gr1c extends Ec_gr1 {

    public Ec_gr1c(double a, double b) { super(a,b); } public String toString() { String s= super.toString(); if(compatibila()) s += "\tx="+x();

  • else s+=" ecuatie "+rez; return s; } }

    class Ex_m_ecgr1 { private static double String_double(String s) { return new Double(s).doubleValue(); } public static void main (String args[]) { for(int i=0; ijava Ex_m_ecgr1 0 0 1 2 0 7 Ecuatia 0.0*x+0.0=0 ecuatie nedeterminata Ecuatia 1.0*x+2.0=0 x=-2.0 Ecuatia 0.0*x+7.0=0 ecuatie incompatibila

    Rederine i obiecte Orice declaratie de obiect, fara alocare cu new, creeaz numai o referin (initial ctre instanta predefinit null) .

    Punct a; // o referinta catre null Punct b = new Punct(1,2); // un obiect

    Atribuirea intre obiecte nu este decat o atribuire de referinte.

    a=b; // nu se creeaza un nou obiect (a) // ci doar se memoreaza in a o referinta //catre obiectul b creat mai sus.

    Nici comparatia intre obiecte nu este aceeasi ca intre tipurile primitive de date:

    Punct c=new Punct(1,2); if(c==b) ...

    verifica de fapt egalitatea referintelor a si b, nu egalitatea dintre obiecte. Pentru a verifica egalitatea obiectelor se suprascrie de fapt metoda equals (Object)

  • Transferul parametrilor funciilor

    Transferul parametrilor de tipuri primitive de date Prin valoare, la fel ca n C.

    public class TransferPrimitive { public static void f(int x) { x++; System.out.println ("In functia f() : "+x); }

    public static void main (String args[]) { int a = 1; System.out.println ("Inainte de f(a): "+a);

    f(a); // se transfera valoarea intregului a

    System.out.println ("Dupa f(a) : "+a); } }

    Inainte de f(a): 1 In functia f() : 2 Dupa f(a) : 1

    Transferul parametrilor de tip obiect Se transfer referina la obiect.

    class Obiect { int val; String nume;

    public Obiect (String nume, int val) { this.nume = new String(nume); this.val = val; } public void inc() { val++; } public String toString () { return nume+".Val="+val; } }

  • public class TransferObiect { public static void f(Obiect x) { x.inc (); System.out.println ("In functia f() : "+x); }

    public static void main (String args[]) { Obiect a = new Obiect ("a",1); System.out.println ("Inainte de f(a): "+a);

    f(a); // se transfera referinta obiectului a

    System.out.println ("Dupa f(a) : "+a); } }

    Inainte de f(a): a.Val=1 In functia f() : a.Val=2 Dupa f(a) : a.Val=2

    Tablouri

    m Java exist dou moduri de a declara tablourile

    double[] x; //stil Java double y[]; //stil C/C++

    Ambele sunt corecte.

    Tablourile sunt considerate obiecte n Java. De aceea simplele declaraii de tablouri, chiar daca sunt tablouri de tipuri primitive ca cele de mai sus, nu aloc i spaiu. Pentru alocarea de spaiu de memorie se va olosi operatorul new. Deoarece sunt considerate obiecte, toate tablourile au proprietatea length care este egala cu numarul de elemente ale tabloului.

    // ------------------------------------------------ // // Tablouri de tipuri primitive // // ------------------------------------------------

    public class TablouPrim1 {

    private static void afis(String t, double x[]) { System.out.println("\n"+t+".length = " + x.length );

  • for(int i = 0; i < x.length; i++) System.out.print(" "+t+"["+i+"]="+x[i]); }

    public static void main(String[] args) {

    double[] x; // tablou nealocat, x = null float[] y = new float[5]; // y si z sunt 2 tablouri alocate, float[] z = new float[4]; // si initializate automat cu 0

    // System.out.println("x.length=" + x.length); // eroare de compilare: "variable x not initialized":

    System.out.println("z.length = " + z.length); for(int i = 0; i < z.length; i++) System.out.println("z[" + i + "]=" + z[i]);

    // moduri de initializare for(int i = 0; i < y.length; i++) y[i] = 2*i+1;

    double[] w = { 0.1, 0.4, 0.5 }; //declarare + alocare + initializare x = new double[] { 1, 2 }; // alocare + initializare

    System.out.println("y.length = " + y.length); afis("w",w); afis("x",x);

    x = w; //tabloul {1,2} se pierde //x va referi tabloul w afis("x",x);

    } }

    Iesirea produsa de program este urmatoarea:

    z.length = 4 z[0]=0.0 z[1]=0.0 z[2]=0.0 z[3]=0.0 y.length = 5

    w.length = 3 w[0]=0.1 w[1]=0.4 w[2]=0.5 x.length = 2 x[0]=1.0 x[1]=2.0 x.length = 3 x[0]=0.1 x[1]=0.4 x[2]=0.5

  • Acelasi mod de tratare il au in Java si tablourile ale caror elemente sunt obiecte. Diferenta consta in faptul ca initializarea implicita a elementelor de tablouri de obiecte este null in loc de zero.

    // --------------------------------------- // // Tablouri de obiecte // // ---------------------------------------

    public class TablouObj1 {

    private static void afis(String t, Punct x[]) { System.out.println("\n"+t+".length = " + x.length ); for(int i = 0; i < x.length; i++) System.out.print(" "+t+"["+i+"]="+x[i]); }

    public static void main(String[] args) {

    Punct[] a; // tablou nealocat, a = null Punct[] b = new Punct[5]; // b si c sunt 2 tablouri alocate, Punct[] c = new Punct[4]; // si initializate automat cu 0

    // System.out.println("a.length=" + a.length); // eroare de compilare: "variable a not initialized": afis("c",c);

    // moduri de initializare for(int i = 0; i < b.length; i++) b[i] = new Punct(i,i);

    Punct[] d = { new Punct(1,2), new Punct(3,4), new Punct(5,6) }; // a = new Punct[] { new Punct(), new Punct() };

    afis("b",b); afis("d",d); afis("a",a);

  • a = d; //tabloul {(0,0) , (0,0)} se pierde //a va referi tabloul d afis("a",a);

    } }

    In urma executiei acestui program se obtine iesirea urmatoare

    c.length = 4 c[0]=null c[1]=null c[2]=null c[3]=null b.length = 5 b[0]=(0,0) b[1]=(1,1) b[2]=(2,2) b[3]=(3,3) b[4]=(4,4) d.length = 3 d[0]=(1,2) d[1]=(3,4) d[2]=(5,6) a.length = 2 a[0]=(0,0) a[1]=(0,0) a.length = 3 a[0]=(1,2) a[1]=(3,4) a[2]=(5,6)

    De o manier asemanatoare sunt tratate si tablourile cu 2 sau mai multe dimensiuni. In Java putem avea matrici in care numarul de elemente alocat pentru fiecare linie sa nu fie acelasi.

    // ------------------------ // // Matrici // // ------------------------

    public class TablouPrim2 {

    private static void afis(String t, int x[][]) { System.out.println("\n"+t+".length = " + x.length ); for(int i = 0; i < x.length; i++) { if(x[i]==null) continue; for(int j = 0; j < x[i].length; j++) System.out.print(" "+x[i][j]); System.out.print("\n"); } }

    public static void main(String[] args) {

  • int[][] x; // tablou nealocat, x= null int[][] y = new int[2][2]; // y tablou alocat, int[][] z = new int[4][]; // z incomplet

    // System.out.println("x.length=" + x.length); // eroare de compilare: "variable x might not have been initialized":

    for(int i = 0; i < y.length; i++) y[i][i] = i+1; afis("y",y);

    for(int i = 0; i < z.length; i++) z[i]=new int[i+1]; afis("z",z);

    // moduri de initializare

    x = new int[3][]; //alocare trei linii x[0]= new int[]{ 1, 2}; // x[1]= new int[]{3}; x[2]= new int[2];

    afis("x",x);

    int [][] w=new int[][]{ {10,20},{30}}; afis("w",w);

    x = w; //matricea initiala se pierde //x va referi tabloul y afis("x",x);

    } }

    In urma executiei programului se obtine urmatoarea iesire:

  • y.length = 2 1 0 0 2

    z.length = 4 0 0 0 0 0 0 0 0 0 0

    x.length = 3 1 2 3 0 0

    w.length = 2 10 20 30

    x.length = 2 10 20 30