Sunteți pe pagina 1din 13

Curs 4 - Programarea calculatoarelor i limbaje de programare

Ce este un pachet?
Pachetul este o colecie de clase i interfee
Scopul su:
Organizarea lucrului
Gsirea i utilizarea mai uoar a claselor
Evitarea conflictelor de nume
Controlul accesului
Pachetele standard
java.lang - clasele de baz ale limbajului Java
java.io - intrri/ieiri, lucrul cu fiiere
java.util - clase i interfee utile
java.applet - dezvoltarea de appleturi
java.awt - interfaa grafic cu utilizatorul
java.awt.event - tratare evenimente
java.beans - scrierea de componente reutilizabile
java.net - programare de reea
java.sql - lucrul cu baze de date
java.rmi - execuie la distan
java.security - mecanisme de securitate
java.math - operaii matematice cu numere mari
java.text - lucrul cu texte, date i numereindependent de limb
java.lang.reflect - introspecie
javax.swing - interfaa grafic cu utilizatorul, mult mbogit fa de AWT.
Folosirea membrilor unui pachet
specificarea numelui complet:
numePachet.NumeClasa.
Button - numele scurt al clasei
java.awt - pachetul din care face parte
java.awt.Button - numele complet al clasei
Importul unei clase sau interfee
Importul clasei respective
import numePachet.numeClasa;
//Pentru exemplul nostru:
import java.awt.Button;
import java.awt.TextField;
...
Button b1 = new Button("OK");
Button b2 = new Button("Cancel");
TextField tf1 = new TextField("Placut");
TextField tf2 = new TextField("Foarte placut");
//Problema:
import java.awt.Button;

import java.awt.TextField;
import java.awt.Rectangle;
import java.awt.Line;
import java.awt.Point;
import java.awt.Polygon;
importul ntregului pachet
import numePachet.*;
//Pentru exemplul nostru:
import java.awt.*;
...
Button b = new Button("OK");
Point p = new Point(0, 0);
import java.awt.C*; = eroare
Importate automat:
pachetul java.lang
pachetul curent
pachetul implicit (fr nume)
Crearea unui pachet
package numePachet;
//Fisierul Graf.java
package grafuri;
class Graf {...}
class GrafPerfect extends Graf {...}
//Fisierul Arbore.java
package grafuri;
class Arbore {...}
class ArboreBinar extends Arbore {...}

Clase abstracte
Sunt clasele pentru care programatorul nu intenioneaz s instanieze obiecte.
clase de baz in ierarhii
se mai numesc clase abstracte de baz
O clas devine abstract dac conine una sau mai multe declaraii de funcii abstracte
Dac o clas ce motenete o clas ce conine o funcie abstract nu implementeaz acea
funcie abstract motenit, devine ea nsi o clas abstract.
OBS: clasele pentru care se pot instania obiecte se numesc clase concrete.

Clasa String. Metode si exemple


Crearea unui ir
Constructorul implicit creaz un ir vid:
String s = new String();

String str = "abc";


este echivalent cu:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
OBS. Dac elementele din vectorul data sunt modificate dup crearea irului str, atunci
aceste modificri nu apar n acest ir.
Construirea unui ir pe baza altui ir:
String str2 = new String(str);
Operaii cu iruri
Metoda length() returneaz lungimea unui ir
Ex: System.out.println(Hello.length()); // afieaz 5
Operatorul + este utilizat pentru concatenarea a dou sau mai multe iruri
Ex: String myname = Harry;
String str = My name is + myname+ .;
Caracterele dintr-un ir pot fi accesate astfel:
public char charAt(int index);
Returneaz caracterul din poziia index. Domeniul de indexare este de la 0 la length() - 1.
Ex. char ch;
ch = abc.charAt(1); // ch = b
getChars() - Copiaz caracterele din irul surs n irul destinaie
public void getChars(int srcBegin, int srcEnd,char[] dst, int dstBegin)
srcBegin indexul primului caracter din surs
srcEnd indexul ultimului caracter din surs
dst vectorul destinaie
dstBegin poziia de la care ncepe copierea n vectorul destinaie
lequals() Compar dou iruri la egalitate
public boolean equals(String s2)
equalsIgnoreCase()- Compar dou iruri la egalitate fr s in cont de litere mici sau mari
public boolean equalsIgnoreCase(String s2)
startsWith() Testeaz dac irul ncepe cu prefixul specificat (la nceput sau dintr-o
anumit poziie)
public boolean startsWith(String prefix)
Ex.Figure.startsWith(Fig); // true
public boolean startsWith(String prefix, int toffset)
Ex.figure.startsWith(gure, 2); // true
endsWith() - Testeaz dac irul se termin cu sufixul specificat
public boolean endsWith(String suffix)
Ex. Figure.endsWith(re); // true
compareTo() Compar dou iruri din punct de vedere lexicografic
Rezultatul este:
Negativ, dac irul precede irul primit ca argument
Zero, dac irurile sunt egale
Pozitiv, dac irul urmeaz irului primit ca argument

public int compareTo(String anotherString)


public int compareToIgnoreCase(String str)
indexOf Caut prima apariie a unui caracter sau ir ntr-un alt ir. Returneaz -1 dac nu l
gsete.
public int indexOf(int ch)
public int indexOf(String str)
Ex. String str = How was your day today?;
str.indexOf(o); // 1
str.indexOf(was); //4
cutare ncepnd de la o poziie specificat:
public int indexOf(int ch, int fromIndex)
public int indexOf(String str, int fromIndex)
Ex. String str = How was your day today?;
str.indexOf(a, 6); //14
str.indexOf(was, 2); //4
lastIndexOf() - Caut ultima apariie a unui caracter sau ir ntr-un alt ir, similar lui indexOf.
concat() Concateneaz irul specificat la irul surs
public String concat(String str)
"to".concat("get").concat("her"); // returneaz "together"
replace()- Returneaz un nou ir n care toate apariiile caracterului oldChar sunt nlocuite cu
caracterul newChar.
public String replace(char oldChar, char newChar)
Ex. "mesquite in your cellar".replace('e', 'o');
returneaz "mosquito in your collar"
toLowerCase(): Convertete toate caracterele la litere mici
public String toLowerCase()
toUpperCase(): Convertete toate caracterele la litere mari
public String toUpperCase()
Ex: HELLO THERE.toLowerCase();
hello there.toUpperCase();

Clase. Constructori. Metode


1. Crearea obiectelor
Declararea:
NumeClasa numeObiect;
Instanierea: new
numeObiect = new NumeClasa();
Iniializarea
numeObiect = new NumeClasa([argumente]);

Rectangle r1, r2;


r1 = new Rectangle();
r2 = new Rectangle(0, 0, 100, 200);
Obiecte anonime
Rectangle patrat = new Rectangle(new Point(0,0), new Dimension(100, 100));
Memoria nu este pre-alocat !
Rectangle patrat;
patrat.x = 10; //Eroare
2. Folosirea obiectelor

obiect.variabila
Rectangle patrat = new Rectangle(0, 0, 10, 200);
System.out.println(patrat.width);
patrat.x = 10;
patrat.y = 20;
patrat.origin = new Point(10, 20);

obiect.metoda([parametri])
Rectangle patrat = new Rectangle(0, 0, 10, 200);
patrat.setLocation(10, 20);
patrat.setSize(200, 300);

Exemplu:
class Patrat {
private double latura=0;
public double getLatura()
{
return latura;
}
public double setLatura(double latura) {
this.latura = latura;
}
}
3. Distrugerea obiectelor
Obiectele care nu mai sunt referite vor fi distruse automat.
Referinele sunt distruse:
natural
explicit, prin atribuirea valorii null.

Exemplu:
class Test {
String a;
void init() {
a = new String("aa");
String b = new String("bb");
}
void stop() {
a = null;
}
}
Garbage Collector

Procesul responsabil cu eliberarea memoriei este System.gc


Sugereaz JVM s elibereze memoria

Finalizarea:
Metoda finalize este apelat automat nainte de eliminarea unui obiect din memorie.
finalize destructor

4. nc ceva despre constructorii unei clase


S considerm:
class NumeClasa {
[modificatori] NumeClasa([argumente]) {
// Constructor
}
}
this apeleaz explicit un constructor al clasei.
class Dreptunghi {
double x, y, w, h;
Dreptunghi(double x1, double y1, double w1, double h1) {
// Implementam doar constructorul cel mai general
x=x1; y=y1; w=w1; h=h1;
System.out.println("Instaniere dreptunghi");
}

Dreptunghi(double w1, double h1) {


this(0, 0, w1, h1);
// Apelm constructorul cu 4 argumente
}
Dreptunghi() {
this(0, 0); // Apelam constructorul cu 2 argumente
}
}
Apel explicit constructori
super apeleaz explicit un constructor al superclasei.
class Patrat extends Dreptunghi {
Patrat(double x, double y, double d) {
super(x, y, d, d);
}
}
Atenie!
Apelul explicit al unui constructor nu poate aprea dect ntr-un alt constructor i trebuie s
fie prima instruciune din constructorul respectiv.
S considerm dou exemple pentru this i super :
Sunt folosite n general pentru a rezolva conflicte de nume prin referirea explicit a unei
variabile sau metode membre.

Exemplu cu this
class A {
int x;
A() {
this(0);
}
A(int x) {
this.x = x;
}
void metoda() {
x ++;
}
}
Exemplu cu super
class B extends A {
B() {
this(0);

}
B(int x) {
super(x);
}
void metoda() {
super.metoda();
}
}
Constructorul implicit
class Dreptunghi {
double x, y, w, h;
// Nici un constructor
}
class Cerc {
double x, y, r;
// Constructor cu 3 argumente
Cerc(double x, double y, double r) { ... };
}
...
Dreptunghi d = new Dreptunghi();
// Corect (a fost generat constructorul implicit)
Cerc c;
c = new Cerc();
// Eroare la compilare !
c = new Cerc(0, 0, 100);
// Varianta corect

5. Declararea variabilelor
class NumeClasa {
// Declararea variabilelor
// Declararea metodelor
}
[modificatori] Tip numeVariabila [ = valoare];
unde un modificator poate fi :
public, protected, private
static, final, transient, volatile

class Exemplu {
double x;
protected static int n;
public String s = "abcd";
private Point p = new Point(10, 10);

final static long MAX = 100000L;


}
6. Modificatorii i declararea metodelor
[modificatori] TipReturnat numeMetoda ([argumente])
[throws TipExceptie1, TipExceptie2, ...]
{
// Corpul metodei
}
unde un modificator poate fi :
public, protected, private
static, abstract, final, native, synchronized
Exemplu:
class Student {
...
final float calcMedie(float note[]) {
...
}
}
class StudentInformatica extends Student {
float calcMedie(float note[]) {
return 10.00;
}
}// Eroare la compilare !
Tipul returnat de o metod
return [valoare]
Trebuie reinut c void nu este implicit:

public void afisareRezultat() {


System.out.println("rezultat");
}
private void deseneaza(Shape s) {
..
return;
}

return trebuie s apar n toate situaiile, atunci cnd am tip returnat:


Exemplu:
double radical(double x) {
if (x >= 0)
return Math.sqrt(x);
else {

System.out.println("Argument negativ !");


// Eroare la compilare
// Lipseste return pe aceast ramur
}
}
Argumentele metodelor
Numele argumentelor primite trebuie s difere ntre ele i nu trebuie s coincid cu numele
nici uneia din variabilele locale ale metodei.
Pot s coincid cu numele variabilelor membre ale clasei, caz n care diferenierea dintre ele
se va face prin intermediul variabile this.
Exemplu:
class Cerc {
int x, y, raza;
public Cerc(int x, int y, int raza) {
this.x = x;
this.y = y;
this.raza = raza;
}
}

7. Trimiterea parametrilor
TipReturnat metoda([Tip1 arg1, Tip2 arg2, ...])
Argumentele sunt trimise doar prin valoare (pass-by-value).
void metoda(StringBuffer sir, int numar) {
// StringBuffer este tip referin
// int este tip primitiv
sir.append("abc");
numar = 123;
}
...
StringBuffer s=new StringBuffer();
int n=0;
metoda(s, n);
System.out.println(s + ", " + n);
// s va fi "abc", dar n va fi 0

void metoda(String sir, int numar) {


// String este tip referinta

// int este tip primitiv


sir = "abc";
numar = 123;
}
...
String s=new String(); int n=0;
metoda(s, n);
System.out.println(s + ", " + n);
// s va fi "", n va fi 0
void schimba(int a, int b) {
int aux = a;
a = b;
b = aux;
}
...
int a=1, b=2;
schimba(a, b);
// a va ramane 1, iar b va ramane 2
class Pereche {
public int a, b;
}
...
void schimba(Pereche p) {
int aux = p.a;
p.a = p.b;
p.b = aux;
}
...
Pereche p = new Pereche();
p.a = 1, p.b = 2;
schimba(p);
//p.a va fi 2, p.b va fi 1
8. Variabile de instan i variabile de clas
class Exemplu {
int x ; //variabila de instanta
}
variabil de instan: la fiecare creare a unui obiect al clasei Exemplu sistemul aloc o zon
de memorie separat pentru memorarea valorii lui x.
class Exemplu {
static int sx ; //variabila de clas
}
Pentru variabilele de clas (statice) sistemul aloc o singur zon de memorie la care au acces
toate instanele clasei respective, ceea ce nseamn c dac un obiect modific valoarea unei
variabile statice ea se va modifica i pentru toate celelalte obiecte.

Deoarece nu depind de o anumit instan a unei clase, variabilele statice pot fi referite i sub
forma:
NumeClasa.numeVariabilaStatica
Iniializarea variabilelor de clas se face o singur dat, la ncrcarea n memorie a clasei
respective:
class Exemplu {
static final double PI = 3.14;
static long nrInstante = 0;
static Point p = new Point(0,0);
}
class Exemplu {
int x ; // Variabila de instanta
static long n; // Variabila de clasa
}
...
Exemplu o1 = new Exemplu();
Exemplu o2 = new Exemplu();
o1.x = 100;
o2.x = 200;
System.out.println(o1.x); // Afiseaza 100
System.out.println(o2.x); // Afiseaza 200
o1.n = 100;
System.out.println(o2.n); // Afiseaza 100
o2.n = 200;
System.out.println(o1.n); // Afiseaza 200
System.out.println(Exemplu.n); // Afiseaza 200
// o1.n, o2.n si Exemplu.n sunt referinte la aceeai valoare
9. Metode de instan i metode de clas
Metodele de instan opereaz att pe variabilele de instan ct i pe cele statice ale clasei.
Metodele de clas opereaz doar pe variabilele statice ale clasei.

class Exemplu {
int x ; // Variabil de instan
static long n; // Variabil de clas
void metodaDeInstanta() {
n ++; // Corect
x --; // Corect
}
static void metodaStatica() {
n ++; // Corect
x --; // Eroare la compilare !
}

}
ntocmai ca i la variabilele statice, ntruct metodele de clas nu depind de starea obiectelor
clasei respective, apelul lor se poate face i sub forma:
NumeClasa.numeMetodaStatica
Exemplu.metodaStatica(); // Corect
Exemplu obj = new Exemplu();
obj.metodaStatica(); // Corect
Metodele de instan nu pot fi apelate dect pentru un obiect al clasei respective:
Exemplu.metodaDeInstanta(); // Eroare
Exemplu obj = new Exemplu();
obj.metodaDeInstanta(); // Corect