Clase publice

Clasele publice sunt clase care pot fi utilizate și în alte pachete, decât cel din care fac parte.

Fiecare clasă publică se declară într-un fișier separat, care are obligatoriu același nume cu cel al clasei și extensia java. În declarația de clasă, în fața numelui clasei se pune modificatorul public. Dăm în continuare ca exemplu clasa Complex.
 
 

Declararea clasei Complex

Clasa Complex este un exemplu de clasă prin care se modelează conceptul matematic de număr complex. După cum este cunoscut, numărul complex a+b.ieste compus din două numere reale a și b, numite respectiv partea reală și partea imaginară. Simbolul i este numit unitatea imaginară și are proprietatea i2= -1. În fișierul Complex.java este dat un exemplu de declarație a clasei Complex. Iată această declarație:
 
/* Clasa numerelor complexe */

public class Complex {
  private double re; // partea reala
  private double im; // partea imaginara

  /* Constructori */

  public Complex() {
    re=0; im=0;
  }

  public Complex(double parteaReala) {
    re=parteaReala; im=0;
  }

  public Complex(double parteaReala, double parteaImaginara) {
    re=parteaReala;
    im=parteaImaginara;
  }

  public Complex(Complex z) {
    re=z.re; im=z.im;
  }

  /* Metode */

  public double real() { // intoarce partea reala
    return re;
  }

  public double imag() { // intoarce partea imaginara
    return im;
  }

  public double modul() {  // intoarce modulul numarului complex
    return Math.sqrt(re*re+im*im);
  }

  public double arg() { // intoarce argumentul numarului complex
    return Math.atan2(im,re);
  }

  public static Complex complex(double modul, double argument)
      throws Exception {
    if(modul<0) throw new Exception("Complex: modul negativ: "+modul);
    Complex z=new Complex();
    z.re=modul*Math.cos(argument);
    z.im=modul*Math.sin(argument);
    return z;
  }

  public Complex plus(Complex a) {
    Complex z=new Complex();
    z.re=re+a.re;
    z.im=im+a.im;
    return z;
  }

  public Complex plus(double d) {
    return new Complex(re+d, im);
  }

  public static Complex plus(double d, Complex z) {
    return new Complex(d+z.re, z.im);
  }

  public Complex minus(Complex a) {
    Complex z=new Complex();
    z.re=re-a.re;
    z.im=im-a.im;
    return z;
  }

  public Complex minus(double d) {
    return new Complex(re-d, im);
  }

  public static Complex minus(double d, Complex z) {
    return new Complex(d-z.re, -z.im);
  }
 
 

  public Complex inmultitCu(Complex a) {
    Complex z=new Complex();
    z.re=re*a.re-im*a.im;
    z.im=re*a.im+im*a.re;
    return z;
  }

  public Complex inmultitCu(double d) {
    return new Complex(re*d, im*d);
  }

  public static Complex inmultitCu(double d, Complex z) {
    return new Complex(d*z.re, d*z.im);
  }

  public Complex impartitLa(Complex a) throws Exception {
    Complex z=new Complex();
    double w=a.re*a.re+a.im*a.im; // patratul modulului numitorului
    if(w==0) 
      throw new Exception("Complex impartitLa: impartire la zero");
    z.re=(re*a.re+im*a.im)/w;
    z.im=(im*a.re-re*a.im)/w;
    return z;
  }

  public Complex impartitLa(double d) throws Exception {
    if(d==0) 
      throw new Exception("Complex impartitLa: impartire la zero");
    return new Complex(re/d, im/d);
  }

  public static Complex impartitLa(double d, Complex z) 
      throws Exception {
    double w=z.re*z.re+z.im*z.im;
    if(w==0) 
      throw new Exception("Complex impartitLa: impartire la zero");
    return new Complex(d*z.re/w, -d*z.im/w);
  }

  public String toString() {
    StringBuffer b=new StringBuffer("("+re);
    if(im>=0) b.append('+');
    b.append(im+"*i)");
    return b.toString();
  }

  public boolean equals(Object obj) {
    if(this==obj) return true;
    if(getClass()!=obj.getClass()) return false;
    if(re==(((Complex)obj).re)&&(im==(((Complex)obj).im)))
       return true;
    return false;
  }

  public int hashCode() {
    return (int)(100000*modul()+100*arg());
  }
}

Declarația clasei incepe prin public class Complex, deci este o clasa publică. Clasa conține două câmpuri de tip double, reprezentând respectiv partea reală și partea imaginară a numărului complex. S-au prevăzut mai mulți constructori. Primul dintre aceștia nu are argumente și creează un număr complex la care, atât partea reală, cât și cea imaginară sunt nule.

Având în vedere că s-a declarat un constructor cu două argumente de tip double, reprezentând partea reală și cea imaginară a numărului complex nou creat, nu a mai fost posibil să se creeze încă un constructor, care să aibă ca argumente modulul și argumentul noului număr complex (acestea fiind tot numere reale). Din această cauză, el a fost înlocuit prin metoda statică
    public static Complex complex(double modul double argument)
al cărei nume începe cu literă mică.

Au fost redefinite metodele toString, equals și hashCode ale superclasei Object, pentru a ține seama de specificul clasei Complex. Au fost declarate, de asemenea, metode pentru efectuarea de calcule între două numere complexe, între un număr complex și unul real și intre unul real și unul complex. Ultimele au fost declarate ca metode statice, deoarece operandul din stânga nu aparține clasei complex.

În toate metodele, în care pot să apară situații anormale, s-a prevazut generarea de excepții.

Utilizarea clasei complex

Testarea diferitelor situații de utilizare a clasei complex este exemplificată în fișierul TestComplex.java.



© Copyright 2000 - Severin BUMBARU, Universitatea "Dunărea de Jos" din Galați