Sunteți pe pagina 1din 109

PREFA

Programarea orientat pe obiect (POO) este unul din cei mai


importani pai fcui n evoluia limbajelor de programare spre o
mai puternic abstractizare n implementarea programelor. A
aprut POO din necesitatea exprimrii problemei ntr-un mod mai
natural fiinei umane. Astfel unitile care alctuiesc un program se
apropie mai mult de modul de a gndi dect modul de funcionare
al calculatorului. Pn la apariia POO programele erau
implementate n limbaje de programare procedurale sau n limbaje
care nici mcar nu ofereau o modalitate de grupare a
instruciunilor n uniti logice aa ca funcii, proceduri. Altfel spus
o problem preluat din natur trebuia fragmentat n repetate
rnduri astfel nct s se identifice elementele distincte,
implimentabile ntr-un limbaj de programare. O mare problem a
programrii procedurale este separarea datelor de unitile care
prelucrat aceste date, ceea ce fcea foarte dificil extinderea i
ntreinerea unui program. Astfel s-a pus problema ca aceste dou
entiti (date i subrutine) s fie grupate ntr-un anumit mod, astfel
nct subrutinele s cunoasc n permanen ce date prelucreaz i,
mai mult dect att, ele s formeze un modul, adic o unitate care
separ implementarea de interfa, ceea ce implic posibilitatea
refolosirii codului. A aprut astfel conceptul de obiect. Obiectul
grupeaz datele i unitile de prelucrare a acestora ntr-un modul,
unindu-le astfel ntr-o entitate mult mai natural. Dei tehnica se
numete programare orientat obiectual, conceptul de baz al ei
este clasa. Clasa are proprietatea de generalitate, desemnnd o
mulime de obiecte care mpart o serie de proprieti.
Ideea de baza de la care pleac POO este de a grupa
structurile de date cu operaiile care prelucreaz respectivele
datele. Limbajele de programare care utilizeaz obiecte se numesc
limbaje de programare orientate pe obiecte.
Lucrarea de fa conine materialul referitor la mijloacele
necesare pentru limbajele de programare orientate pe obiect. n
capitolul 1 sunt prezentate noiunile i principiile de baz ale

obiectelor, sunt analizate tipurile de obiecte aa ca clasa,


constructori. Capitolul 2 este destinat analizei principiilor de
selectare a metodelor cu nume identice. n capitolul 3 este expus
prezentarea teoretic i sunt descrise aspectele motenirii. . n
capitolul 4 sunt abordate unele aspecte i forme din teoria
polimorfizmului. Capitolul 5 este destinat analizei principiilor de
creare i utilizare a excepiilor. n capitolul 6 sunt abordate unele
metode de creare a aplicaiilor, applet-ul. n capitolul 7 sunt
prezentate noiunile i principiile de baz ale coleciilor, utilizarea
lor ca o nou form de pstrare a datelor. Materialul teoretic
prezentat este necesar pentru ndeplinirea celor apte lucrri de
laborator, descrise n aceste capitole.
Toate lucrrile de laborator vor fi ndeplinite utiliznd
limbajul de programare orientat pe obiect Java.
Pentru a fi admis la ndeplinirea lucrrii de laborator fiecare
student trebuie s ndeplineasc urmtoarele condiii:
ndeplinirea sarcinii individuale pentru lucrarea de
laborator conform variantei;
cunoaterea materialului teoretic necesar pentru
ndeplinirea lucrrii, demonstrat prin rspunsurile la ntrebrile
puse de ctre profesor.
Lucrarea de laborator se consider ndeplinit doar dup ce
studenii demonstreaz profesorului corectitudinea circuitelor i a
testelor elaborate.
Pentru fiecare lucrare de laborator studentul pregtete o dare de
seam, pe care o susine n faa profesorului. Darea de seam
include: foaia de titlu, tema, scopul lucrrii, lucrul ndeplinit acas,
listingul programului, rezultatul realizrii programukui, concluzii
i interpretarea rezultatului.
PARTEA 1
1.1. Clase, obiecte, constructori.

1.1.1. Clase
Clasele definesc structura i comportamentul unui set de
elemente din domeniul pentru care este dezvoltat software-ul
modelului. ntr-un obiect-orientat sunt patru tipuri de relatii:
dependen, generalizare, asociere, i realizarea. Dependena este
raportul de utilizare, indicnd faptul c schimbarea
starii
obiectului al unei clase poate afecta obiectul altei clase pe care o
utilizeaz. Generalizarea nseamn c obiectele clasei derivate pot
fi folosite ori de cte ori exist obiecte a clasei de baz dar nu
invers. Realizarea
este raportul dintre clasificatori (clase,
interfee), n care unul dintre ei descrie un alt clasificator. Asociaia
arat c obiectele dintr-o clas se refer la obiecte din alt clas, i
s reflect ntre ele. Tipul "clasa" n Java poate conine cmpuri de
date, constructori, metode, clase interioare i interfee.
1.1.2. Constructori
Constructorul este o metod care se activeaz n mod
automat atunci cnd se creaz o clas i poate efectua aciuni
asupra obiectului pe care l iniializeaz. Constructorul are numele
clasei. Constructorul nu returneaz valori, dar poate avea i
parametri pentru a fi suprancrcat.
/*Exemplu 1 de rencrcare a constructorului: */
class NewBook {
private String title, publisher;
private float price;
public NewBook() {
title = NoTitle;
}
public NewBook(String t,String pub,float p)
{
title = new String(t);
publisher = pub;
price = p;
}

public static void main(String[] args) {


NewBook tips1;
tips1 = new NewBook();
// initializarea
NewBook tips2 =
new NewBook("Java2", "", 9.f);
}}
n cazul n care constructorul nu este definit n clasa, Java
ofer un constructor implicit care iniializeaz obiectul cu valori
implicite.
1.1.3. Clase-Interfee
Pentru a nu pune n aplicare toate metodele din interfeele
corespunztoare, atunci cnd se creeaz clasa - blocuri pentru
evenimente, sunt folosite clasele Interfee. Aceste clase conin
metode interfee, evenimente realizate pe care le extinde. n acest
caz, se definete o nou clas care acioneaz ca un bloc de
evenimente realizate i realizeaz doar evenimentele care necesit
prelucrarea. De exemplu, clasa MouseMotionAdapter are dou
metode: mouseDragged() i mouseMoved(). Esena acestor
metode sunt aceleai ca i n interfaa MouseMotionListener.
Dac exist necesitatea doar n evenimentele de clic a mouse-ului,
se extinde adaptorul realiznd override cu metoda
mouseDragged() din aceast clasa. Evenimentul de clic a mouseului se realizeaz prin aplicarea metodei mouseMove(). Pentru a
crea o interfa grafic trebui s fie indicat un loc (fereastr), n
care acesta va fi afiat. Fereastra este un container care craz o
interfa cu utilizatorul. Contextul grafic este ncapsulat n clas i
este disponibil n dou moduri:
prin activarea metodelor paint(), update();
prin valoarea returnat a metodei getGraphics() din clasa
Component.
Evenimentele FocusEvent indic c componentele au fost
nregistrate sau nu. Clasa InputEvent este clasa de baz pentru

clasele KeyEvent i MouseEvent. Evenimentul WindowEvent


indic un program in care a fost activat una din sistemele de
control a ferestrei. Urmtorul exemplu creeaz obiectul
MyMouseWithFrame i permite controlul su direct in metoda
main().
/ / Exemplu # 2 : utilizarea interfeii:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class MyMouseWithFrame extends
Frame implements ActionListener{
Button button = new Button("Button");
public String msg = "none";
public MyMouseWithFrame() {
addMouseListener(new MyMouseAdapter(this));
setLayout(null);
setBackground(new Color(255, 255, 255));
setForeground(new Color(0, 0, 255));
button.setBounds(100, 100, 50, 20);
button.addActionListener(this);
add(button); }
public static void main(String[] args) {
MyMouseWithFrame myf=new MyMouseWithFrame();
myf.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
};});
myf.setSize(new Dimension(250, 200));
myf.setTitle("Frame - window");
myf.setVisible(true);
}
public void paint(Graphics g) {
g.drawString(msg, 80, 50);
}
public void actionPerformed(ActionEvent e) {
msg = "Button is pressed";

repaint();
}}
class MyMouseAdapter extends MouseAdapter {
public MyMouseWithFrame mym;
public MyMouseAdapter(MyMouseWithFrame mym)
{
this.mym = mym;
}
public void mousePressed(MouseEvent me) {
mym.msg = "Mouse button is pressed";
mym.repaint();
}
public void mouseReleased(MouseEvent me){
mym.msg = "Mouse button is released";
mym.repaint();}}
Rezultatul realizrii programului:

Constructorul clasei
folosete MyMouseWithFrame
addMouseListener (new MyMouseAdapter (this)) pentru a
nregistra evenimentele mouse. La crearea unui obiect de tip
MyMouseWithFrame, metoda dat indic ca obiectul este
interesat n prelucrarea anumitor evenimente. Clasa abstracta
MouseAdapter este utilizata pentru a trata evenimente asociate cu
mouse prin crearea blocului care conine metodele
mousePressed(MouseEvent e), mouseReleased(MouseEvent e).

Cnd un obiect genereaz evenimentul WindowEvent, obiectul


MyMouseWithFrame analizeaz dac este un eveniment
WindowClosing. Dac nu, obiectul MyMouseWithFrame l
ignor. Dac este evenimentul ateptat, programul ncepe procesul
de realizare a activitii sale. Clasa abstract WindowAdapter este
utilizat pentru primirea i prelucrarea evenimentului. Clasa
conine metodele rencrcare windowActivated (WindowEvent
e), apelat la activarea ferestrei i windowSlosing (WindowEvent
e) apelat la nchiderea ferestrei.
1.2. iruri de caractere
Java Library System conine clase String i StringBuffer,
care lucreaz cu iruri de caractere, definite n pachetul din java.
lan. Aceste clase sunt declarate ca final.
1.2.1. Clasa String
Clasa String conine constructorii String (), String (String
str.), String (char [] c), String (asciichar byte []). Aceti
constructori sunt folosii pentru a iniializa obiectele din clas.
Clasa String conine metode pentru a lucra cu iruri de
caractere:
concat(String s) sau + concateneaz iruri;
equals(Object ob), equalsIgnoreCase(String s) compar
dou iruri cu i fr nregistrare;
compareTo(String s), compareToIgnoreCase (String s)
compar dou iruri cu i fr nregistrare;
contentEquals(StringBuffer ob) compararea irului i a
coninutului unui obiect de tip StringBuffer;
charAt(int n) extraje dintr-un ir de caractere un caracter
cu indicele specificat;
substring(int n, int m)- extrage dintr-un ir de caractere un
subir cu lungimea m-n, ncepnd de la poziia n;
length() determina lungimea irului;

valueOf(obiect) transformarea unui obiect n ir de


caractere;
toUpperCase()/ toLowerCase() convertiaz toate
caracterele din ir n litere majuscule / litere mici;
replace(char 1, char 2) nlocuete toate apariiile n ir a
primului caracter cu al doilea simbol ;
getBytes(obiect), getChars(obiect) irul de caractere e
transformat n tablou de octei sau caractere ;
n urmtorul exemplu este descris o serie de numere ntregi
care sunt convertite n obiecte String, folosind metodele din
aceast clas.
/ / Exemplu # 3: utilizarea clasei:
public class DemoString {
public static void main(String[] args) {
char s[] = { 'J', 'a', 'v', 'a' };
int i = 2;
String str = new String(s); //str="Java"
i = str.length(); //i=4
String num = String.valueOf(2); //num="2"
str = str.toUpperCase(); //str="JAVA"
num = str.concat(num); //num="JAVA2"
str = str + "C";//str="JAVAC";
char ch = str.charAt(2); //ch='V'
i = str.lastIndexOf('A');
//i=3 (-1 daca lipsete)
num = num.replace('2', 'H'); //num="JAVAH"
i = num.compareTo(str);
//i=5(mpreuna cu simbolurile 'H' si '')
str.substring(0, 3).toLowerCase(); //JAVA
}
Deoarece obiectul a fost transmis de referin, orice schimbare a
obiectului n metod ar trebui s fie transmis obiectului original,
deoarece ambele referine sunt egale. Acest lucru nu se ntmpl
deoarece apelnd metoda concat(), se creaz un nou obiect prin

care se face referire. Acest obiect este returnat de ctre operatorul


return, dar valoarea returnat nu este atribuit, deci toate
modificrile sunt pierdute. Dac codul va fi modificat aa cum se
arat n comentarii, toate modificrile obiectului realizate n
metoda changeStr() vor fi salvate n obiectul declarat n main().
n urmtorul exemplu, se examineaz modaliti de stocare i
identificare a obiectelor utiliznd metoda equals(), se compar
String-ul cu obiectului specificat a metodei hashCode(), care
apreciaz codul de distribuire a obiectului.
/*Exemplu # 4: Utilizai equals(),
hashCode():*/
EqualStrings.java */
public class EqualStrings {
public static void main(String[] args) {
String s1 = "Java";
String s2 = "Java";
String s3 = new String(s1);
System.out.println(s1 + "==" + s2 + " : " +
(s1==s2));//true
System.out.println(s1 + "==" + s3 + " : " +
(s1==s3));//false
System.out.println(s1 + " equals " + s2 +
" : " + s1.equals(s2));//true
System.out.println(s1 + " equals " + s3 +
" : " + s1.equals(s3));//true
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
System.out.println(s3.hashCode());
//toate valorile sunt egale!!!
}}
Metoda HashCode() este metoda care returneaz codul de
distribuire a obiectului, care este apreciat n conformitate cu
principiul - diferite obiecte cu coninut de acelai tip au diferite

hash-coduri. Este posibil de a redefini referina de la obiect la


literal, prin apelul metodei intern().
//Exemplu
#
5 :
utilizarea
metodei
intern ()
public class DemoIntern {
public static void main(String[] args) {
String s1 = "Java";
String s2 = new String("Java");
System.out.println(s1 == s2); //false
s2 = s2.intern();
System.out.println(s1 == s2); //true
}}
n urmtorul exemplu are loc sortarea irurilor de caractere.
/ * Exemplu # 6: Sortare: */
public class SortArray {
public static void main(String[] args)
{
String a[] = {" Vika", "Natasha ", "
Alina", "
Dima ", "Denis "};
for(int j = 0; j < a.length; j++)
a[j].trim();
for(int j = 0; j < a.length; j++)
for(int i = j + 1; i < a.length; i++)
if(a[i].compareTo(a[j]) < 0)
{
String t = a[j];
a[j] = a[i];
a[i] = t;
}
for(int i = 0; i < a.length; i++)
System.out.print(a[i] + "
");
}}
Metoda trim() asigur eliminarea tuturor lcunilor de la
nceputul i sfrsitul irului. Metoda CompareTo()-efectuaz o
comparaie a irurilor dup principiul Unicode.
1.2.2. Clasa StringBuffer

Clasa StringBuffer este asemntoare cu clasa String, dar,


spre deosebire, coninutul i mrimea obiectelor din clasa
StringBuffer pot fi schimbate. Constructorul poate primi ca
parametru un obiect String sau mrimea obiectului. Obiectele
acestei clase pot fi transformate n clasa String prin metoda
toString() sau folosind constructorul clasei String. Setarea
lungimii buferului este efectuat de metoda setLength(int n).
Pentru a aduga simboluri, valori de tipuri standarde, tablouri,
iruri de caractere, folosim metoda append(parametri). Inserarea
unui simbol, unui obiect sau a unui ir n poziia indicat se
realizeaz cu metoda insert(opiuni).
/*Exemplu # 7: Crearea unui obiect
StringBuffer i a proprietilor sale: */
public class DemoStringBuffer {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
System.out.println("lungimea-"+sb.length());
System.out.println("mrimea"+sb.capacity());
//sb = "Java"
//error, numai pentru clasa String
sb.append("Java");
System.out.println("irul ->" + sb);
System.out.println("lungimea-"+sb.length());
System.out.println("mrimea"+sb.capacity());
System.out.println("revers-"+sb.reverse());
}}
Rezultatul codul de mai sus este:
Lungimea ->0
Size ->16
String ->JAVA
Lungime ->4
Size ->16
Revers ->avaJ
Folosind metoda reverse() se poate schimba rapid ordinea
caracterelor in obiect. n cazul n care metoda activat pentru un

obiect StringBuffer, produce modificri n coninutul obiectului,


nu se creeaz un obiect nou, ca n cazul cu obiecte din clasa
String, dar modific obiectul curent StringBuffer.
/*Exemplu # 8: Modificarea obiectului
StringBuffer: * /
public class RefStringBuffer {
static void changeStr(StringBuffer s) {
s.append(" Microsystems");
}
public static void main(String[] args) {
StringBuffer str = new StringBuffer("Sun");
changeStr(str);
System.out.println(str);
}}
Rezultatul realizrii:
Sun Microsystems
Pentru clasa StringBuffer nu poate fi realizat suprascrierea
a metodelor equal() i hashCode(), adic compararea coninutului
a dou obiecte nu este posibil, chiar i codurile hash a tuturor
obiectelor se apreciaz exact ca i n clasa Object.
/*Exemplu # 9: compararea obiectelor
StringBuffer i codurile hash * /
public class EqualsStringBuffer {
public static void main(String[] args) {
StringBuffer sb1 = new StringBuffer("Sun");
StringBuffer sb2 = new StringBuffer("Sun");
System.out.println(sb1.equals(sb2));
System.out.println(sb1.hashCode()
==sb2.hashCode());
}}
Rezultatul acestui program va fi :
false
false
Lucrare de laborator nr. 1

1. Tema lucrrii:
Clase, obiecte, constructori.
2. Scopul lucrrii:
nsuirea modalitilor de creare a claselor, obiectelor n
Java;
nsuirea modalitilor de prelucrare a irurilor de caractere
utiliznd clasele de baz;
3.
1)
2)
3)

Etapele de realizare:
Crearea unor clase noi;
Crearea i iniializarea obiectelor
Utilizarea metodelor claselor Sting i StringBuffer pentru
modificarea irurilor;
4) Crearea interfeii programului;
5) Prezentarea lucrrii.
4. Exemplu de realizare:
import
import
import
import
import

java.io.BufferedInputStream;
java.io.BufferedReader;
java.io.IOException;
java.io.InputStream;
java.io.InputStreamReader;

public class Main


{
public static void main(String[] args){
String sentence = "";
int wordLenght = 0;
String myWord = "";
InputStreamReader is =
new InputStreamReader(System.in);
BufferedReader bis =
new BufferedReader(is);
try

{
System.out.println("Itrodu propoziia: ");
sentence = bis.readLine();
System.out.println("Introdu lungimia
cuvntului nlocuit");
wordLenght =
Integer.parseInt(bis.readLine());
System.out.println("Introdu cuvntul care
trebue nlocuit");
myWord = bis.readLine();
}
catch (IOException e)
{
e.printStackTrace();
}
Text myText = new Text(myWord,
sentence, wordLenght);
myText.changeSentence();
System.out.println("Propoziia nou" +
myText.getSentence());
}}
class Text
{
private String mySentence;
private int charNumber;
private String wordToChange;
private String newSentence = "1.";
public Text(String wordToChange,
String mySentece, int charNumber) {
this.mySentence = mySentece;
this.wordToChange = wordToChange;
this.charNumber = charNumber;
}
public String getSentence()
{

return newSentence;
}
public void changeSentence()
{
int firstPos = 0;
int i;
for (i = 0; i < mySentence.length(); i++)
{
if (mySentence.charAt(i) == ' ')
{
if (i - firstPos == charNumber)
{
newSentence =
newSentence.concat(wordToChange+" ");
firstPos = i+1;
}
else
{
newSentence = newSentence.concat
(mySentence.substring(firstPos, i+1));
firstPos=i+1;
}}
else if(i == mySentence.length()-1)
{
if (i - firstPos == charNumber)
{
newSentence =
newSentence.concat(wordToChange+" ");
firstPos = i+1;
}
else
{
newSentence = newSentence.concat
(mySentence.substring(firstPos, i+1));
firstPos=i+1;
}}}}}

Rezultatul realizrii:
trodu propoziia:
Flori de tei apar n mai.
Introdu lungimea cuvntului nlocuit :
3
Introdu cuvntul spre nlocuire :
mr
Propoziia noua este : 1. Flori de mr apar n mr.
5. Probleme propuse:
Pentru toate sarcinile sa se creeze un Fremes sau o fereastr pentru
lucrul cu obiectele.
1. n fiecare cuvnt din textul dat simbolul de pe poziia indicat a
cuvntului de nlocuit cu un simbol dat. Dac poziia indicat este
mai mare ca lungimea cuvntului, corecia nu se face.
2. Fiecare litera din textul dat, sa fie nlocuit cu poziia numeric
din alfabet. Textul sa se scrie ntr-o singur linie cu doua spatii
intre litere. In linia urmtoarea sub fiecare liter sa se indice
poziia.
3. n textul dat, cuvintele cu lungimea indicat, sa se nlocuiasc
cu un subir specificat, lungimea cruia poate s nu coincid cu
lungimea cuvntului.
4. n textul dat dup fiecare caracter indicat, s se introduc un
subir specificat.
5. Dup fiecare cuvnt din textul dat, care se termina cu un subir
specificat, sa se adauge cuvntul indicat.
6. n dependen de valoarea introdus (0 sau 1), n textul dat de
extras caracterul indicat, ori de cte ori apare, sau sa fie introdus
dup simbolul cu indicele specificat.
7. Extragei din textul dat toate cuvintele cu lungimea specificat,
care ncep cu o consoan.
8. Afiai de cte ori sunt repetate cuvintele care apar n textul dat.

9. Afiai, care litere, vocalele sau consoanele, sunt mai multe in


fiecare propoziie din textul dat.
10. Din textul dat gsii i extragei numrul de cuvinte care ncep
i se finalizeaz cu vocale.
11. De afiat fr repetare cuvntul din textul dat, care ncep si se
termina cu aceea liter.
12. De extras din textul dat primul subir cu lungime maxim, care
nu conine litere.

PARTEA 2
2.1. Suprancrcarea metodelor
Capacitatea limbajului Java de a selecta metoda necesar
rezumnd din tipul run-time se numete polimorfism dinamic.
Cutarea metodei are loc nti in clasa curent, apoi n superclas,
pn cnd metoda nu va fi gsit sau nu va ajunge la Object superclas pentru toate clasele.
Metodele statice pot fi rencrcate ntr-o subclas, dar nu pot fi
polimorfice, deoarece apelul lor nu afecteaz obiecte.
Dac dou metode cu nume identice sunt n aceeai clas,
listele de parametri trebuie sa fie diferit. Aceste metode sunt
suprancrcate (overload). Daca metoda din subclasa coincide cu
metoda din superclas, atunci metoda subclasei este suprascris
(override) metoda din superclas. Toate metodele din Java sunt
virtuale (cuvntul cheie virtual ca n C + + nu este folosit).
In urmtorul exemplu are loc aplicarea polimorfismului bazat
pe dinamica nlnuit. Deoarece superclasa conine metode care
sunt suprascrise n subclase, atunci obiectul superclasei va apela
metodele diferitor subclase, n dependen de faptul la care obiect
a subclasei are referina.
/*Exemplu#1:legaturile dinamice a metodelor
*/
class A {

int i, j;
public A(int a, int b) {
i = a;
j = b;
}
void show() {
System.out.println("i i j:"+ i +" " + j);}}
class B extends A {
int k;
public B(int a, int b, int c) {
super(a, b);
k = c;
}
void show() {
/*metoda suprascris show() din A */
super.show(); //extragerea valorilor din A
System.out.println("k: " + k);
}}
class C extends B {
int m;
public C(int a, int b, int c, int d) {
super(a, b, c);
m = d;
}
void show() {
/* metoda suprascris show() din B */
super.show(); //extragerea valorilor din B
// show();
/*imposibil!! Metoda se va apela pe sine, ce
va aduce la error n timpul realizrii */
System.out.println("m: " + m);
}}
public class DynDispatch {
public static void main(String[] args) {
A Aob;
B Bob = new B(1, 2, 3);

C Cob = new C(5, 6, 7, 8);


Aob = Bob; // instalarea referinei la Bob
Aob.show(); // apelul show() din B
System.out.println();
Aob = Cob; // instalarea referinei la Cob
Aob.show(); // apelul show() din C
}}
Rezultatul realizrii:
i i j: 1 2
k: 3
i i j : 5 6
k:7
m: 8
La apelarea show () tratarea super ntotdeauna merge la cea
mai apropiat superclas.
2.2. Suprancrcarea Metodelor
Metoda se numete suprancrcat n cazul n care exist mai
multe versiuni cu acelai nume, dar cu un set diferit de parametri.
Suprancrcarea poate fi limitat la o clas sau mai multe clase, dar
n mod necesar situat n acelai lan de motenire. Metodele
statice pot fi suprancrcate cu nonstatice i invers.
La apelarea metodelor de suprancrcare ar trebui s evite
situaiile n care compilatorul nu va putea s aleag o metod sau
alta, cum ar fi n cazul:
/* exemplu # 2 : apelarea metodei
suprancrcate: */
class ClassC {}
class ClassD extends ClassC{}
public class DemoCD {
static void show(ClassC obj1, ClassD obj2){
System.out.println("prima metod
show(ClassC, ClassD)");
}
static void show(ClassD obj1, ClassC obj2){

System.out.println("a 2 metod show(ClassD,


ClassC)");
}
static void show(Object obj1, Object obj2){
System.out.println("a 3 metod show(Object,
Object)");
}
public static void main(String[] args) {
ClassC c = new ClassC();
ClassD d = new ClassD();
Object ob= new Object();
show(c,d);//1- prima metod
show(d,c);//2-a doua metod
show(c,c);//3-a treia metod
//show(d,d);//4_ errore
show(ob, ob);//5_a treia metod
show(c,ob);//6_a treia metod
show(ob,d);//7_a treia metod
}}
n primul caz, al 2-a i al 5-a, parametrii in metoda show()
complect coincid cu parametrii din declaraia metodei. n al 3-a
caz, prima i a doua metod nu pot fi utilizare, deoarece unul
dintre parametrii acestei metode este un obiect al clasei ClassD,
ns definirea metodei apelate merge in vrful lanului de
motenire pentru parametrii, deci n acest caz, va fi apelat metoda
cu parametrii de tipul Object. O situaie similar apare n cazurile
6-a i 7-a. n al 4-a caz primele doua metode show (), sunt la fel
de potrivite pentru apel (analogic i al 3-a), din acest motiv apare
o eroare de compilare. Pentru a evita incertitudinea, trebuie de
utilizat conversia de tip, cum ar fi:
show(d,(ClassC)d); show(d,(Object)d);
Fiecare dintre opiuni in cele din urma vor apela metoda
corespunztoare show().

In urmtorul exemplu cream un exemplar a unei subclase cu


ajutorul new, link-ul ei este transmis unui obiect a superclasei. La
apelarea din superclas, respectiv, se apeleaz metoda subclasei.
/* exemplu # 3 : legturile dinamice a
metodelor: */
class A {
void myMethod() {/* private nu se
poate de folosit, pentru ca metoda la
motenire nu mai este disponibil */
System.out.println("metoda clasei A");
}
void myMethod(int i) { System.out.println
("metoda clasei A cu argument");
}}
class B extends A {
void myMethod(int i) { System.out.println
("metoda clasei B cu argument ");
}}
public class C extends B {
{
System.out.println("clasa C");
}
void myMethod() {
System.out.println("metoda clasei C ");
}}
public class Dispatch {
public static void main(String[] args) {
A obj1 = new B();
obj1.myMethod();
A obj2 = new C();
obj2.myMethod();
obj2.myMethod(10);
}}
La realizare are loc:
metoda clasei A
clasa C

metoda clasei C
metoda clasei B cu argument
In primul rnd se apeleaz metoda myMethod() din clasa A,
ca motenit. n al doilea rnd se apeleaz metoda myMethod() din
clasa C, ca redefinit. La urm se apeleaz metoda myMethod(int
i) din clasa B, astfel nct nu poate fi apelat metoda fr
argument i se ndeplinete cutarea metodei necesare pe nivele de
motenire.
Lucrare de laborator nr. 2
1. Tema lucrrii:
Suprancrcarea metodelor.
2. Scopul lucrrii:
nsuirea principiilor de suprancrcare a metodelor i
realizarea lor;
nsuirea principiilor de suprascriere a metodelor i
realizarea lor;

3. Etapele de realizare:
6) Crearea metodelor suprancrcate;
7) Crearea metodelor suprascrise;
8) Utilizarea metodelor suprancrcate n superclase i subclase;
9) Utilizarea metodelor suprascrise;
10) Crearea interfeii programului;
11) Prezentarea lucrrii.
4. Exemplu de realizare:
import java.util.*;
public class Prog2 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Al doilea program");
int n;
System.out.println("Nr de propoziii");
n = in.nextInt();

Parag par = new Parag(n);


System.out.println(par);
}}
class Propoz {
public Propoz() {
prop = null;
}
public Propoz(String prop) {
this.prop = prop;
}
public Propoz(String prop, int n) {
this.prop = prop.substring(0,n-1);
}
public void setProp() {
prop = null;
}
public void setProp(String prop) {
this.prop = prop;
}
public void setProp(String prop, int n)
{
this.prop = prop.substring(0,n);
}
public String getProp() {
return prop;
}
public String toString() {
String output = super.toString();
output += "(prop=\""+prop+"\")";
return output;
}
private String prop;
}
class Parag {
public Parag() {

par = null;
numProp = 0;
prop = null;
}
public Parag(int numProp) {
Scanner in = new Scanner(System.in);
this.numProp = numProp;
prop = new Propoz[this.numProp];
par = "";
for (int i=0;i<this.numProp;i++)
{
System.out.println("Dai propoziia "+
(i+1)+":");
String s = in.nextLine();
par += s+" ";
System.out.println("Numrul de caractere");
int n = in.nextInt();
in.nextLine();
if (s.length()==0)
{
prop[i] = new Propoz();
}
else
{
if (n==0){
prop[i] = new Propoz(s);
}
else
{
prop[i] = new Propoz(s,n);
}}}}
public String toString() {
String output = super.toString();
output += "(";

for(Propoz t:prop)
{
output += t + ",";
}
output += par;
output += ")";
return output;
}
private Propoz[] prop;
private String par;
private int numProp;
}
Rezultatul realizrii
Nr. de propoziii
3
Dai propoziia 1:
Texte texte
Numarul de caractere
4
Dai propoziia 2:
Numrul de caractere
0
Dai propoziia 3:
Parametri noi
Numrul de caractere
9
5. Probleme propuse:

S se realizeze suprancrcarea i override a trei metode


(utilizarea unei clase cu posibilitile altei clase).
1. Sa se creeze obiectul clasa Linie, folosind clasa
Cuvint.
2. Sa se creeze obiectul clasa Paragraf, folosind clasa
Linie.

3. Sa se creeze obiectul clasa Pagina, folosind clasa


Paragraf.
4. Sa se creeze obiectul clasa Text, folosind clasa
Pagina.
5. Sa se creeze obiectul clasa Paragraf, folosind clasa
Cuvint.
6. Sa se creeze obiectul clasa Pagina, folosind clasa
Cuvint.
7. Sa se creeze obiectul clasa Pagina, folosind clasa
Linie.
8. Sa se creeze obiectul clasa Text, folosind clasa
Paragraf.
9. Sa se creeze obiectul clasa Carte, folosind clasa
Text.
10. Sa se creeze obiectul clasa Biblioteca, folosind
clasa Carte.
11. Sa se creeze obiectul clasa Cuvint, folosind clasa
Litere.
12. Sa se creeze obiectul clasa Litere, folosind clasa
Simboluri.
PARTEA 3
3.1. Motenirea
O clas poate moteni variabilele i metode de la alt clas,
folosind cuvntul cheie extends. Subclasa are acces la toate
variabilele publice i a metodelor din clasa printe. n acelai timp,
o subclas poate avea metode cu acelai nume i parametri ca
metodele de superclasa. n acest caz, subclasa suprascrie metodele
clasei printe. Urmtorul exemplu suprascrie metoda show(), care
este prezent n dou clase Bird i Eagle. n conformitate cu

principiul polimorfismului se apeleaz metoda, care este cea mai


apropiata de obiectul curent.
/* exemplu # 1 : motenirea clasei i
suprascrierea metodei : */
class Bird {
private float price;
private String name;
public Bird(float p, String str)
{ //constructorul
price = p;
name = str;
}
public float getPrice(){
return price;
}
public String getName(){
return name;
}
void show(){
System.out.println("denumirea:" + name +
"
, preul: "+ price);
}}
class Eagle extends Bird {
private boolean fly;
public Eagle(float p,String str,boolean f) {
super(p, str);
//apelul constructorului superclasei
fly = f;
}
void show(){
System.out.println("denumire:" + getName() +
", pre: " + getPrice() + ", zbor:" + fly);
}}
public class BirdSample {
public static void main(String[] args) {
Bird b1 = new Bird(0.85F, "Gsc");

Bird b2 = new Eagle(10.55F, "Vultur", true);


b1.show(); // apelul show() a clasei Bird
b2.show(); // apelul show()a clasei Eagle
}}
Obiectul b1 este creat prin apelarea constructorului clasei
Bird, i, desigur, prin metoda show(), se apeleaz versiunea
metodei din clasa Bird. La crearea obiectului b2 link-ul de tipul
Bird este iniializat de tipul Eagle. Pentru aa metod de
iniializare a link-ul superclasa primete acces la metodele,
suprascrise n subclas.
La declararea cmpurilor care coincid dup nume n
superclasa i subclasa, valorile lor nu se redefinesc i nu se
intersecteaz, adic exista obiecte cu acela nume care nu depind
unul de altul. n acest caz, problema de a extrage valoarea cerut
de anumite domenii, care aparin clasei n lanul de motenire,
depinde de programator.
/* exemplu # 2 : accesul la cmpuri cu
acela nume la motenire: */
class A {
int x = 1, y = 2;
public A() {
y = getX();
System.out.println("n clasa A dup
apelarea metodei getX() x="+x+" y="+y);
}
public int getX(){
System.out.println("n clasa A");
return x;
} }
class B extends A {
int x = 3, y = 4;
public B() {System.out.println
("n clasa B x=" + x + " y=" + y);
}
public int getX(){
System.out.println("n clasa B");

return x;
} }
public class DemoAB {
public static void main (String[] args) {
A objA = new B();
B objB = new B();
System.out.println(objA.x);
System.out.println(objB.x);
}}
La realizare va fi:
n clasa B
n clasa A dup apelul metodei getX() x=1 y=0
n clasa B x=3 y=4
n clasa B
n clasa A dup apelul metodei getX() x=1 y=0
n clasa B x=3 y=4
x=1
x=3
In cazul crerii obiectului objA iniializnd link-ul clasei A
cu obiectului clasei B, a fost primit accesul la cmpul x a clasei A.
n al doilea caz, la crearea unui obiect objB a clasei B a fost primit
accesul la cmpul x a Clasei B. Cu toate acestea, folosind un tip de
conversie de forma: ((A) objB).x sau ((B) objA).x poate fi accesat
cu uurin cmpul x din clasa corespunztoare.
O parte din tehnicile polimorfismului ilustreaz constructorul
din clasa A n forma:
public A() {
y = getX();
}
Metoda getX() este n clasa A, cit i n clasa B. La crearea
unui obiect a clasei B cu una din metodele :
A objA = new B();
B objB = new B();
n orice caz, primul se apeleaz constructorul din clasa A,
dar aa cum se creeaz un obiect a clasa B, i metoda getX()

respectiv se apeleaz din clasa B, care la rndul su, opereaz cu


cmpul x care nu este nc iniializat pentru clasa B. Ca rezultat y
va primi valoarea x n mod implicit, care este zero.
Nu se poate crea o subclas pentru clasa, declarat cu
calificativul final:
// clasa First nu poate fi superclas
final class First {
/*codul programului */}
// urmtoarea clas nu este posibil
class Second extends First{
/*codul programului */}
Folosirea super i this
Cuvntul cheie super este folosit pentru a activa
constructorul superclasei i pentru accesul la membrii din
superclasa. De exemplu:
super(lista parametrilor);
/*
activarea
constructorului
din
superclas cu transmiterea parametrilor */
super.i = n;
//atribuirea valorii obiectului superclasei
super.method();
// activarea metodei din superclas
A doua form super este ca un link this la exemplarul clasei.
A treia form este specific pentru Java i ofer un apel la metoda
suprascrisei iar n cazul n care in aceast superclas metoda nu
este definit, atunci se va cuta n lanul de motenire atta timp
pn cnd metoda nu va fi gsit. Fiecare exemplu de clas are
implicit link-ul this la sine, care se transmite i la metode. Putem
scrie this.price dar nu este neaprat.
Urmtorul cod arata, cum, se folosete this, pentru a
construi constructori bazai pe ali constructori.
// exemplu # 3 : this n constructori :
class Locate3D {
private int x, y, z;

public Locate3D(int x, int y, int z) {


this.x = x;
this.y = y;
this.z = z;
}
public Locate3D() {
this(-1, -1, -1);
}}
n aceast clas, al doilea constructor este pentru a finaliza
iniializarea unui obiect ce se refer la primul constructor. Aceast
construcie este utilizat in cazul n care o clasa are mai muli
constructori i apare necesitatea de a aduga un constructor
implicit.
Link-ul this este utilizat n metod pentru a concretiza
despre care variabile x i y merge vorba de fiecare dat, i n
special pentru a accesa variabila clasei, daca in metoda este o
variabil cu acelai nume. Instruciunea this ar trebui s fie unica
in constructorul apelat i sa fie prima operaie efectuata.

Lucrare de laborator nr. 3


1. Tema lucrrii:
Motenirea
.
2. Scopul lucrrii:
nsuirea principiilor de motenire a claselor;
3. Etapele de realizare:
12) Crearea subclacelor;
13) Utilizarea metodelor superclasei n subclase;
14) Utilizarea obiectelor la motenire;
15) Crearea interfeii programului;
16) Prezentarea lucrrii.
4. Exemplu de realizare:
import java.awt.*;
import java.awt.event.*;

import java.lang.annotation.*;
import java.util.*;
import javax.annotation.*;
import javax.swing.*;
public class Lb3 {
public static void main(String[] arg){
MyFrame ff = new MyFrame();
ff.setVisible(true);
}}
class MyAnnotation implements Generated {
public MyAnnotation(){
this.setAnnotation();
}
public MyAnnotation(String cCom,
String uUser){
this.setAnnotation(cCom, uUser);
}
public void setAnnotation(){
com = "Nu ai menionat comentariul!";
user = "Nu ai indicat autorul!";
dat = new Date();
}
public void setAnnotation(String
cCom,String uUser){
com = cCom;
user = uUser;
dat = new Date();
}
public String date() {
return dat.toString();
}
public String comments() {
return com;
}
public String users(){
return user;

}
public String getAnnotation(){
String output;
output = "Autor: " + user + "\n";
output += "Text: " + com + "\n";
output += "Data: " + date() + "\n";
output += "==========================\n";
return output;
}
private String com;
private Date dat;
private String user;
public Class <?> extends Annotation
{ annotationType() {
throw new
UnsupportedOperationException("Not supported
yet.");
}
public String[] value() {
throw new
UnsupportedOperationException("Not supported
yet.");
}}
class MyFrame extends JFrame {
public MyFrame(){
this.setTitle("LBJ2");
this.setSize(600, 500);
this.setLocation(300, 300);
this.setDefaultCloseOperation
(JFrame.EXIT_ON_CLOSE);
MyAnnotation ts = new MyAnnotation();
JTextField JTextField user = new
JTextField(ts.users(),10);
JPanel left = new JPanel();
Box b1 = Box.createVerticalBox();
JButton but = new JButton("Submit");

JTextArea com = new


JTextArea(ts.comments(),20,20);
JLabel dat = new JLabel("Data: "+ts.date());
JTextArea history = new
JTextArea(ts.getAnnotation(),20,20);
but.addActionListener(new
ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("aa");
ts.setAnnotation(com.getText(),
user.getText());
dat.setText("Data: "+ts.date());
history.setText(history.getText()
+ts.getAnnotation());} });
JTextField user = new
JTextField(ts.users(),5);
b1.add(new JLabel("Autor:"));
b1.add(user);
b1.add(dat);
b1.add(but);
left.add(b1);
this.add(left,BorderLayout.WEST);
JPanel center = new JPanel();
center.add(com);
center.setBackground(Color.red);
this.add(center,BorderLayout.CENTER);
right = new JPanel();
right.add(history);
this.add(right,BorderLayout.EAST);
}
private JTextArea history;
private JPanel left, center, right;
private JTextField user;
private JTextArea com;
private JLabel dat;
private MyAnnotation ts;}

Rezultatul realizrii programului:

5. Probleme propuse:
Pentru toate variantele extindei capacitile clasei de baz dat folosind
motenirea:
1.Time, astfel nct s se poat deduce timpul zilei: diminea, sear e.t.c
2.Time, astfel nct s se poat deduce in secunde, minute timpul curent.
3.Time, astfel nct s se poat deduce timpul trecut de la o aciune
specificata.
4.Date, astfel nct s se poat deduce anotimpurile anului: iarna ,vara
e.t.c.
5.Annotation, astfel nct s se poat deduce timpul in secunde de la
ultima modificare a annotaiei.
6.Dictionary, astfel nct s se poat deduce data n zile a ultimei
modificri a dicionarului.
7.File, astfel nct s se poat deduce timpul si data crerii obiectului.
8.File, astfel nct s se poat deduce mrimea obiectului dup
modificare.
9.Stack, astfel nct s se poat deduce timpul in minute a ultimei sesiuni
a lucrului cu stiva.
10.Stack, astfel nct s se poat deduce data n zile a ultimei sesiuni a
lucrului cu stiva.

11.Annotation, astfel nct s se poat deduce data in zilele de la ultima


modificare a annotaiei.
12.Annotation, astfel nct s se poat deduce timpul i data modificrii
annotaiei.

Partea 4
4.1. Polimorfizmul
4.1.1. Metodele statice i polimorfismul
Pentru metodele statice nu se aplic principiile
polimorfismului. La utilizarea referinei pentru accesul la membrul
static, compilatorul, la alegerea metodei sau obiectului, ine cont
de tipul referinei, dar nu tipul obiectului, la care se refer.
/* exemplu # 1: comportarea metodelor
statice: */
class StaticA {
public static void show(){
System.out.println("metoda show() din
StaticA");
}}
class StaticB extends StaticA {}
class StaticC extends StaticB {
public static void show(){
System.out.println("metoda show() din
StaticC");
}}
public class StaticDemo {
public static void main(String[] args) {
StaticA s1 = new StaticC();
StaticB s2 = new StaticC();
StaticC s3 = new StaticC();
s1.show();
s2.show();
s3.show();

}}
Rezultatul realizrii programului:
metodashow()dinStaticA
metodashow()dinStaticA
metodashow()dinStaticC
La iniializarea obiectelor s1 i s2, metoda show(), este
apelata de clasele de baz StaticA i StaticB. Polimorfismul se
observ numai la motenirea metodei. Pentru obiectul s3 va fi
apelata metoda proprie show(), care rezult din modul de
declarare. Dac specificatorul static de extras din declaraia
metodei, atunci apelarea metodelor vor fi efectuate n conformitate
cu principiile polimorfismului.
2.2. Clasa Obeject
La baza ierarhiei claselor st clasa Object. Obiectul
de tip object se poate referi la orice obiect din alt clas, n
plus, o variabil de tip object se poate referi la orice tablou,
deoarece tablourile sunt realizate ca clase. n clasa Object
se definete un set de metode, care sunt motenite de toate
clasele. Metoda equals(), la compararea a dou obiecte
ntoarce true, daca obiectele sunt echivalente, i false - in
caz contrar. Dac este nevoie de comparat obiectele clasei
create, aceast metod necesit s fie suprascris in clasa
dat. Metoda toString() returneaz un ir cu descrierea
obiectului in forma:
getClass().getName() + '@' +
Integer.toHexString(hashCode())
Metoda se apeleaz n mod automat, atunci cnd un
obiect este afiat prin metodele println(), print(), i altele.
Atunci cnd se creeaz o clas este recomandat s
suprascrie metoda toString(), pentru a aduce la tipul de
obiect nou creat.
/* Exemplul # 2: suprascrierea metodelor
equals() i toString() : */
class Point {

protected byte b;
protected String str;
public Point(byte n, String s) {
b = n;
str = s;}
public Point() {
this((byte)0, "NoName");}
public boolean equals(Object obj) {
if (obj instanceof Point)
return (this.b == ((Point) obj).b) &&
(str.equals(((Point) obj).str));
return false;}
public String toString() {
return getClass().getName() + "@"+
" name=" + str + " b=" + b;
}}
class PointZ extends Point{
short s = 100;
}
Metoda equals () se suprascrie pentru clasa Point, n aa fel
nct s se asigure c obiectul primit este un obiect de tip Point sau
unul din motenitorii si, precum i pentru a compara coninutul
obiectelor b i str, respectiv, obiectului apelat i obiectului
transmis. Metoda toString() se suprascrie n aa fel ca, pe lng
informaia despre pachetul standard in care se conine clasa Point
i implicit numele clasei, s afieze valorile cmpului obiectului
care apeleaz aceast metod, n loc de codul de distribuire, cum
se face n clasa Object.
Are loc apelul unui constructor dintr-un alt constructor, cu
transmiterea parametrilor, precum i conversia de tip int la tipul
byte, aceasta conversie nu este efectuat implicit, deoarece este
posibila pierderea informaiei.
/* exemplul # 3 : utilizarea metodelor
equals() i toString(: */
package com.mypack;
public class PointDemo {

public static void main(String[] args) {


Point p1 = new Point((byte) 1, "Salut");
Point p2 = new Point((byte) 1, "Salut");
PointZ p3 = new PointZ();
Point p4 = new Point();
System.out.println(p1.equals(p2));
System.out.println(p1.equals(p3));
System.out.println(p4.equals(p3));
System.out.println(p3.equals(p4));
System.out.println(p1.toString());
}}
Rezultatul realizrii programului:
true
false
true
true
com.mypack.Point@ name=Salut b=1
Suprascrierea n acest mod a metodei equals() permite s
compare obiectele clasei de baz cu obiectele claselor derivate, dar
numai pentru acele cmpuri care sunt comune.
4.3. Distrugerea obiectelor
Deoarece obiectele sunt create dinamic cu ajutorul
operatorului new, este de dorit de a cunoate mecanismul de
distrugere a obiectelor i o modalitate de eliberare a memoriei
pentru redistribuirea de mai trziu. Java automat face eliberarea
memoriei, ocupat de obiect, prin intermediul mecanismului
special. Atunci cnd nici un link la obiect nu exist, adic link-ul la
el a ieit din domeniul de aplicare a programului, se presupune c
obiectul nu mai este necesar, i memoria ocupat de obiect poate fi
eliberat. Distrugerea obiectelor are loc n mod neregulat n timpul
execuiei programului.
Uneori, un obiect are nevoie pentru a efectua o aciune
nainte de a elibera memorie. De exemplu, pentru a elibera resurse
externe. Pentru a gestiona astfel de situaii, se folosete

mecanismul finalization. Pentru a utiliza finalization, trebuie de


definit metoda finalize(). Main virtual activeaz aceast metod
atunci cnd necesit distrugerea obiectului clasei. n interiorul
metodei finalize() trebuie de determinat aciunile, care trebuie
ndeplinite pn la distrugerea obiectului. nainte de eliberarea
memoriei pentru obiectul dat se apeleaz metoda finalize().
Metoda finalize() are forma:
protected void finalize(){
// codul de finalizare}
Nivelul de acces protected interzice accesul la metoda
finalize() codurilor, definite n afara clasei date. Metoda finalize()
este apelata chiar nainte de eliberarea memoriei, i nu atunci cnd
obiectul dispare din cmpurile de identificare deoarece este
imposibil s se determine, cnd finalize() este executat. Aceast
metod poate s nu fie, n general, executata.
/*exemplul # 4: distrugerea obiectului*/
class Demo {
private int a;
public Demo(int a) {
this.a = a;}
protected void finalize() {
System.out.println("obiectul este distrus,
a=" + a);}}
public class FinalizeDemo {
public static void main(String[] args)
{
Demo d1 = new Demo(1);
d1 = null;
Demo d2 = new Demo(2);
Object d3 = d2;
//1
//Object d3 = new Demo(3); //2
d2 = d1;
System.gc();
// metod pentru distrugerea obiectului
}}

Ca urmare a executrii acestui cod nainte de apelarea


metodei gc(), fr referin rmne doar un obiect.
obiectul este distrus, a=1
Dac de comentat linia 1 i de decomentat linia 2, nainte de
executarea metodei gc() referinele au pierdut dou obiecte.
obiectul este distrus, a=1
obiectul este distrus, a=2
Lucrare de laborator nr. 4
1. Tema lucrrii:
Polimorfizmul.
2. Scopul lucrrii:
nsuirea modalitilor de realizare a polimorfizmului n
Java;
3. Etapele de realizare:
1. Crearea clase noi;
2. Crearea metodelor necesare;
3. Realizarea formelor de polimorfizm;
4. Crearea interfeii programului;
5. Prezentarea lucrrii.
4. Exemplu de realizare:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Prob4 {
public static void main(String[] args) {
Complex tt = new Complex(1,6);
Complex tttt= (Complex) tt.def
(new Complex(2,-1));
System.out.println(tttt);
ComplexPolynom pol = new
ComplexPolynom(5);

for (int i= 0;i<pol.length;i++)


{ pol.setComplexPolynom(i,(int)
(Math.random()*10), (int)(Math.random()*10),
(int)(Math.random()*10));
}
ComplexPolynom pol2 = new
ComplexPolynom(3);
for (int i= 0;i<pol2.length;i++)
{ pol2.setComplexPolynom(i, (int)
(Math.random()*10), (int)(Math.random()*10),
(int)(Math.random()*10));
}
ComplexPolynom pol1 =
(ComplexPolynom)pol.def(pol2);
System.out.println(pol.toStringAll());
System.out.println(pol2.toStringAll());
System.out.println(pol1.toStringAll());
ComPolFram fram = new ComPolFram();
fram.setVisible(true);
}}
class ComPolFram extends JFrame{
public ComPolFram(){
this.setTitle("Complex Poligon");
this.setDefaultCloseOperation
(JFrame.EXIT_ON_CLOSE);
this.setSize(600, 500);
this.setLocation(300, 200);
Box Hbox1 = Box.createHorizontalBox();
Hbox1.add(new JLabel("n="));
nn = new JTextField(10);
nn.setMaximumSize(nn.getPreferredSize());
Hbox1.add(nn);
butmac("add",Hbox1);
butmac("+",Hbox1);
butmac("-",Hbox1);
Hbox2 = Box.createHorizontalBox();

Hbox3 = Box.createHorizontalBox();
Hbox4 = Box.createHorizontalBox();
Hbox5 = Box.createHorizontalBox();
Hbox6 = Box.createHorizontalBox();
Box Vbox = Box.createVerticalBox();
Vbox.add(Hbox1);
Vbox.add(Hbox2);
Vbox.add(Hbox3);
Vbox.add(Hbox4);
Vbox.add(Hbox5);
Vbox.add(Hbox6);
add(Vbox,BorderLayout.CENTER);
//this.pack();
}
private JTextField nn;
private JTextField[] n1,n2,n3;
private JTextField[] m1,m2,m3;
private Box Hbox2,Hbox3,Hbox4,Hbox5,Hbox6;
private void butmac(String s,Box b){
JButton but = new JButton(s);
but.addActionListener
(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println(e.getActionCommand());
//Hbox2 = Box.createHorizontalBox();
int n = Integer.parseInt(nn.getText());
if (e.getActionCommand()=="add"){
Hbox2.removeAll();
Hbox3.removeAll();
n1 = new JTextField[n];
n2 = new JTextField[n];
n3 = new JTextField[n];
m1 = new JTextField[n];
m2 = new JTextField[n];
m3 = new JTextField[n];
for(int i=0;i<n;i++){

n1[i] = new JTextField(3);


n1[i].setMaximumSize(nn.getPreferredSize());
n2[i] = new JTextField(3);
n2[i].setMaximumSize(nn.getPreferredSize());
n3[i] = new JTextField(3);
n3[i].setMaximumSize(nn.getPreferredSize());
m1[i] = new JTextField(3);
m1[i].setMaximumSize(nn.getPreferredSize());
m2[i] = new JTextField(3);
m2[i].setMaximumSize(nn.getPreferredSize());
m3[i] = new JTextField(3);
m3[i].setMaximumSize(nn.getPreferredSize());
Hbox2.add(new JLabel("(r="));
Hbox2.add(n1[i]);
Hbox2.add(new JLabel("i="));
Hbox2.add(n2[i]);
Hbox2.add(new JLabel("b="));
Hbox2.add(n3[i]);
Hbox2.add(new JLabel(") "));
Hbox3.add(new JLabel("(r="));
Hbox3.add(m1[i]);
Hbox3.add(new JLabel("i="));
Hbox3.add(m2[i]);
Hbox3.add(new JLabel("b="));
Hbox3.add(m3[i]);
Hbox3.add(new JLabel(") "));
}
pack(); }
else if(e.getActionCommand()=="+" ||
e.getActionCommand()=="-")
{
Hbox4.removeAll();
Hbox5.removeAll();
Hbox6.removeAll();
ComplexPolynom pol1 = new ComplexPolynom(n);
for (int i=0;i<n;i++){

pol1.setComplexPolynom(i,
Double.parseDouble(n1[i].getText()),
Double.parseDouble(n2[i].getText()),
Double.parseDouble(n3[i].getText()));
}
ComplexPolynom pol2 = new ComplexPolynom(n);
for (int i=0;i<n;i++){
pol2.setComplexPolynom(i,
Double.parseDouble(m1[i].getText()),
Double.parseDouble(m2[i].getText()),
Double.parseDouble(m3[i].getText()));
}
ComplexPolynom pol3;
if(e.getActionCommand()=="+"){
pol3 = (ComplexPolynom)pol1.adun(pol2);
}
else{
pol3 = (ComplexPolynom)pol1.def(pol2);
}
Hbox4.add(
new JLabel("("+pol1.toStringAll()+")"));
Hbox5.add(
new JLabel("+("+pol2.toStringAll()+")"));
Hbox6.add(
new JLabel("=("+pol3.toStringAll()+")"));
pack();
}}}
b.add(but);
}}
abstract class Scadere {
abstract public Object adun(Object t);
abstract public Object invers();
public Object def(Object t) {
Scadere tt = (Scadere)t;
return adun(tt.invers());
}}

class Complex extends Scadere{


public Complex() {
real = 0;
img = 0;
}
public Complex(double Real,double Img) {
real = Real;
img = Img;
}
public void setComplex(double Real,
double Img) {
real = Real;
img = Img;
}
public String toString(){
return real+(img>0 ? "+" : "")+(img!
=0 ? img+ "i" : "");
}
public Complex adun(Object t) {
Complex tt = (Complex)t;
Complex ret = new Complex();
ret.img = img + tt.img;
ret.real = real + tt.real;
return ret;
}
public Complex clone() {
Complex temp = new Complex();
temp.img = img;
temp.real = real;
return temp;
}
public Complex invers() {
Complex temp = this.clone();
temp.img = temp.img*(-1);
temp.real = temp.real*(-1);
return temp;

}
protected double real,img;
}
class ComplexPolynom extends Complex {
public ComplexPolynom() {
super();
pol = new ComplexPolynom[1];
pol[0] = this;
baz = 0;put = 0;
length = 1;
}
public ComplexPolynom(int n) {
super();
pol = new ComplexPolynom[n];
pol[0] = this;
for(int i=1;i<pol.length;i++){
pol[i] = new ComplexPolynom();
}
length = n;
}
public void setComplexPolynom(
int n,double Real,double Img,double Baz ) {
pol[n].baz = Baz;
pol[n].put = n;
pol[n].setComplex(Real, Img);
}
public ComplexPolynom
getComplexPolynom(int n) {
return pol[n];
}
public String toString(){
return (baz>=0 ? "+":"")
+baz+"("+super.toString()+")^"+put;
}
public String toStringAll() {
String output = "";

for(ComplexPolynom temp:pol) {
output+=temp;
}
return output;
}
public ComplexPolynom adun(Object t) {
ComplexPolynom tt = (ComplexPolynom)t;
int maxl = tt.length>length?
tt.length:length;
ComplexPolynom ret =
new ComplexPolynom(maxl);
for(int i=0;i<maxl;i++) {
if (tt.length>i){
ret.pol[i].baz = tt.pol[i].baz;
ret.pol[i].img = tt.pol[i].img;
ret.pol[i].real = tt.pol[i].real;
}
if (length>i){
ret.pol[i].baz += pol[i].baz;
ret.pol[i].img += pol[i].img;
ret.pol[i].real += pol[i].real;
}
ret.pol[i].put = i;
}
return ret;
}
public ComplexPolynom invers() {
ComplexPolynom temp =
new ComplexPolynom(length);
for(int i=0;i<length;i++) {
temp.pol[i].baz = pol[i].baz*(-1);
temp.pol[i].put = pol[i].put;
temp.pol[i].img = pol[i].img*(-1);
temp.pol[i].real = pol[i].real*(-1);
}
return temp;

}
public ComplexPolynom clone() {
ComplexPolynom temp =
new ComplexPolynom(length);
for(int i=0;i<length;i++) {
temp.pol[i].baz = pol[i].baz;
temp.pol[i].put = pol[i].put;
temp.pol[i].img = pol[i].img;
temp.pol[i].real = pol[i].real;
}
return temp;
}
public int length;
private double baz,put;
private ComplexPolynom[] pol;
}

Rezultatul realizrii programului:

5. Probleme propuse:
Realizarea polimorfismului pentru clasele date cu crearea
metodelor conform specificului claselor.
1.
Fraction ComplexFracion.
2.
Complex ComplexPolynom.
3.
Fraction FracionArray.
4.
Fraction FracionPolynom.

5.
6.
7.
8.
8.
9.
10.
11.

Complex ComplexArray.
Complex ComplexFraction.
Polynom ComplexPolynom.
Polynom FractionPolynom.
Polinom <- PoliniomArray
Array <-ComplexArray
Array<-FractionArray
Array <-ComplexFraction

Partea 5
5.1.Crearea excepiilor
Fiecare caz excepional este n conformitate cu anumite
clase. n cazul n care clasa corespunztoare nu exist, atunci ea
poate fi creat. Excepii sunt motenite de la clasa de baz
Throwable i clasele sale derivate Error i Exception din
pachetul java.lang.
n Java atunci cnd o excepie este generat ntotdeauna este
creat un obiect de tip corespunztor, care trebuie s fie prelucrat
de ctre un anumit bloc de cod. Atunci cnd se creeaz o metod
prelucrarea excepiei poate fi inclus n codul, care poate genera
aceast metod.
Exist trei moduri de a crea excepiile :
- blocuri try catch ;
- declaraia excepiei n seciunea throws a metodei i
transmiterea apelantului
- capturarea excepiei, convertirea la alt clas i repetarea
apelului
Examinare primului mod are loc n urmtorul exemplu. La
I/O se folosete o clasa IOException. De exemplu:
public void doRead(){

try{
System.in.read(buffer);
}
catch (IOException e) {
String err = e.toString();
System.out.println(err);
}}
Activarea clasei IOException este generat de metoda
read():
public int read() throws IOException
Metoda doRead() n blocul try apeleaz metoda read(), care
ncearc s introduc datele din System.in n buffer. Dac este o
eroare de intrare, realizarea trece la bloca catch, care prelucreaz
excepia, n caz contrar blocul catch nu este realizat. Atunci cnd
blocul try-catch este omis, compilatorul va indica o eroare.
A doua abordare poate fi demonstrat n acelai exemplu.
Dac o metod poate genera o excepie, pe care nu o
prelucreaz, atunci o transmite pentru prelucrare altei metode, i
trebuie s anune acest comportament prin utilizarea cuvntului
cheie throws, astfel nct metodele apelate s se poat proteja de
aceste excepii.
ns, metoda poate conine blocul try-catch, sau poate sa
nu-l conin. De exemplu, metoda doRead() poate fi declarat:
public void doRead() throws IOException{
System.in.read(buffer);
}
Va prelucra excepia metoda care va activa metoda
doRead():
public void myDoRead(){
try {
doRead();
}
catch (IOException e){
String err = e.toString();
System.out.println(err); }}

A treia metod va fi examinat mai jos la crearea excepiilor


personale.
O metod poate prelucra cteva excepii.
/ * Exemplu # 1: prelucrarea a 2 tipuri
de excepii: * /
class TwoException {
public static void main(String[] args) {
try {
int a = (int)(Math.random() * 2);
System.out.println("a = " + a);
int c[] = { 1/a };
c[1] = 1;
}
catch(ArithmeticException e){
System.out.println("divizare la 0"+ e);
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("depete limitelle
tabloului: " + e);
}
System.out.println
("dup blocul try/catch");}}
Excepia "divizare la 0" apare atunci cnd iniializarea
elementului din matrice a = 0. n caz contrar, (a = 1) se genereaz
o excepie depete limitele tabloului atunci cnd ncearc s
atribuie o valoare pentru al doilea element al matricei c [], care
conine doar un element.
Clasele derivate de excepii trebuie s fie plasate nainte de
orice clas printe a lor, n caz contrar clasele de baz vor prinde
aceste excepii. De exemplu:
catch (Exception e ){}/* clasa de baz Exception prinde
toate excepiile * /
catch (ArithmeticException e) {} / * nu poate fi activat,
astfel nct se produce o eroare de compilare * /

Operatorul try poate fi inclus n alt try. Dac operatorul try


nu conine catch, care corespunde excepiei date, cutarea va fi
continuat pe urmtorul nivel, i vor fi inspectate seciunile catch
din urmtorul nivel try.
/* exemplu # 2 : blocurile incluse trycatch */
class MultiTryCatch {
public static void main(String[] args) {
try {//bloc exterior
int a = (int)(Math.random() * 2);
System.out.println("a = " + a);
try {//bloc interior
int c[] = { 1/a };
c[1] = 1;
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("depete limitele
tabloului: " + e);
}}
catch(ArithmeticException e){
System.out.println("divizarea la 0"+ e);
}}}
In rezultatul execuiei pentru a = 0 va fi aruncat excepia
ArithmeticException, ns blocul de prelucrare potrivit try/catch
este extern pentru locul de generare a excepiei. Acest bloc va fi
utilizat pentru prelucrarea excepiei care a avut loc.
peratorul throw
Operatorul throw se utilizeaz pentru generarea excepiilor. n
acest caz se utilizeaz obiectul clasei Throwable sau obiectul
clasei derivate, sau referinele lor. Sintacsa instruciunii throw:
throw ObiectThrowable;
Dup realizarea acestui operator, realizarea codului
programului se ntrerupe. Cel mai apropiat bloc try gsete

realizatorul de excepie necesar catch. Dac este gsit , ncepe


realizarea lui, altfel este controlat urmtorul bloc inclus try.
n exemplul urmtor se creaz un obiect excepie i apoi
operatorul throw genereaz excepia prelucrat n catch n cere la
rndul su este generat o alt excepie.
// Exemplu # 3 : generarea excepiilor //
public class ThrowGeneration {
static void throwGen() {
try {
throw new
ClassCastException("demonstraia");
} catch (ClassCastException e) {
System.out.println
("excepia metodei throwGen()");
throw e;//generarea a unei excepii
}}
public static void main(String[] args) {
try {
throwGen();
} catch(ClassCastException e) {
System.out.print(
"generarea metodei in afara metodei: " + e);
}}}
Metoda
throwGen()
creaz
obiectul
clasei
ClassCastException i arunc o excepie. Prelucrarea excepiei
spune c o excepie este aruncat, i apoi o genereaz, astfel
excepia ClassCastException este transferat la rutina de tratare a
excepiei n metoda main(), n caz contrar, compilatorul ar cere
tratarea excepiilor n metod sau decizia de aceast excepie prin
instruciunea throw.
Daca metoda genereaz excepia cu ajutorul operatorului
throw, blocul catch lipsete, atunci tipul clasei de excepii
trebuie s fie specificat n operatorul throws la declararea
metodei pentru toate tipurile de excepii, n afar de excepiile
clasei RuntimeException.

/ / Exemplu # 4: Utilizarea throws //


public class ThrowsSample {
static void method() throws
IllegalAccessException {
System.out.println("In interiorul metodei");
throw
new IllegalAccessException(
"demonstrarea excepiei");
}
public static void main(String[] args) {
try {
method();
} catch (IllegalAccessException e) {
System.out.println("throw: " + e);}}}
Uneori apare necesitatea de a efectua anumite aciuni,
indiferent dac o excepie a avut loc sau nu. n acest caz se
folosete bloc finally, care este executat dup blocul try sau catch.
De exemplu:
try {/ * codul care poate arunca o excepie * /}
catch (Exception e) {/ * prelucrarea excepie * /}
finally {/ * este executat sau dup try, sau dup catch * /}
Fiecrui bloc try trebuie s-i corespund cel puin un bloc
catch sau finally. Blocul finally este adesea folosit pentru a
nchiderea fiierelor i eliberarea resurselor luate pentru uz
temporar la nceputul metodei. Codul blocului finally este
executat, chiar dac n faa lui sunt instruciunile de returnare
return, break, continue. De exemplu:
/ * Exemplu # 5: de execuie a blocului finally: * /
class SampleFinally {
static void procA() {
try {
System.out.println("in metoda procA()");
throw
new RuntimeException(
"demonstraia excepiei");

} finally {
System.out.println("blocul finally a metodei
procA()");
} }
static int procB() {
try {
System.out.println("in metoda procB()");
return 1;
} finally {
System.out.println("blocul finally a metodei
procB()");
return 0;
} }
public static void main(String[] args) {
try {
procA();
}
catch (Exception e) {/*execuia */}
int i = procB();} }
n metoda procA() din cauza excepiei are loc ieirea forat
din blocul try, dar nainte de a prsi metoda, se realizeaz finally.
Metoda procB() -i finalizeaz lucrul realiznd operatorul return
din blocul try, dar, nainte de a iei este executat de blocul
finally.
Excepiile proprii
Avem posibilitatea de a crea proprii excepii ca o clas
derivat a clasei Exception i apoi s le folosim n prelucrarea
situaiilor care apar la activarea metodei. De exemplu:
/* exemplu # 6 : metod, care cauzeaz o
excepie creat de programator: */
public class MyBasic {
static int result(int i) throws
MyResultException {
try {

i = 1 / i;
throw new
MyResultException("Excepia proprie");
} catch (ArithmeticException e) {
throw new
MyResultException("MyResultException
bazat pe o alt excepie ", e);
}}
public static void main(String[] args) {
try {
int a = result(8);
} catch (MyResultException e) {
System.out.println(e.toString());
}}}
Atunci cnd este imposibil s se calculeze valoarea necesar
se genereaz obiectul ArithmeticException, realizatorul cruia la
rndul su genereaz excepia MyResultException, folosit ca o
excepie proprie, care are dou argumente. Primul - un mesaj care
poate fi afiat n fluxul de eroare, i al doilea - o excepie, care
aduce la apelul excepiei proprii. Acest cod arat cum se poate
salva informaii n o excepiile proprii. Avantajul n acest caz este
c dac metoda activat va dori s tie motivul real de apel pentru
MyResultException, ea doar trebuie s apeleze metoda
getHiddenException(). Acesta
permite metodei apelate s
deschid sau s lucreze cu o excepie specific sau este destul de
prelucrat MyResultException .
/* exemplu # 7 :excepie proprie: */
public class MyResultException extends
Exception{
private Exception _myException;
public MyResultException(String error,
Exception e){
super(error);
_myException = e;
}

public MyResultException(String error){


super(error);
}
public Exception getHiddenException(){
return(_myException);
}}
Lucrare de laborator nr. 5
1. Tema lucrrii:
Crearea excepiilor
2. Scopul lucrrii:
nsuirea modalitilor de creare i realizare a excepiilor n
Java;
3. Etapele de realizare:
1. Realizarea mai multor tipuri de excepii;
2. Realizarea excepiilor standarde ;
3. Crearea excepiilor poprii ;
4. Crearea interfeii programului;
5. Prezentarea lucrrii.
4. Exemplu de realizare:
import java.lang.RuntimeException;
import java.util.Stack;
public class JFrame extends
javax.swing.JFrame {
public JFrame() {
initComponents();
}
@SuppressWarnings("unchecked")
private void initComponents() {
jScrollPane1 = new
javax.swing.JScrollPane();
jTextArea1 = new
javax.swing.JTextArea();

jButton1 = new
javax.swing.JButton();
jLabel1 = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowC
onstants.EXIT_ON_CLOSE);
jTextArea1.setColumns(20);
jTextArea1.setRows(5);
jTextArea1.addKeyListener(new
java.awt.event.KeyAdapter() {
public void
keyPressed(java.awt.event.KeyEvent evt) {
jTextArea1KeyPressed(evt);
} });
jScrollPane1.setViewportView(jTextArea1);
jButton1.setText("Verifica");
jButton1.addMouseListener(new
java.awt.event.MouseAdapter() {
public void
mouseClicked(java.awt.event.MouseEvent evt){
jButton1MouseClicked(evt);
} });
jLabel1.setForeground(new
java.awt.Color(255, 51, 51));
javax.swing.GroupLayout layout = new
javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.Group
Layout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap().addGroup(layout.
createParallelGroup(javax.swing.GroupLayout.
Alignment.LEADING).addComponent(jScrollPane1
, javax.swing.GroupLayout.DEFAULT_SIZE, 457,

Short.MAX_VALUE).addComponent(jButton1,
javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(jLabel1,javax.swing.
GroupLayout.PREFERRED_SIZE, 392,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap()) );
layout.setVerticalGroup(
layout.
createParallelGroup(javax.swing.GroupLayout.
Alignment.LEADING).addGroup
(layout.createSequentialGroup().addGap(32,
32, 32).addComponent (jScrollPane1,
javax.swing.GroupLayout.PREFERRED_SIZE, 77,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(layout.createParallelGroup(javax.s
wing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(33, 33, 33) .addComponent(jButton1))
.addGroup(layout.createSequentialGroup().add
Gap(18, 18, 18).addComponent(jLabel1)))
.addContainerGap(javax.swing.GroupLayout.DEF
AULT_SIZE, Short.MAX_VALUE)));
pack();
}// </editor-fold>
private void
jButton1MouseClicked(java.awt.event.MouseEve
nt evt) {
jLabel1.setText("");
Calcul c = new Calcul();
String s = "";
String s2 = jTextArea1.getText();
try{
boolean k = true;
while(k){
int l = c.funct(jTextArea1.getText());
s=""+s+jTextArea1.getText()+"\n";
jTextArea1.setText(""+c.afisare_stack());

if (l==1){
k=false;
s=""+s+jTextArea1.getText()+"\n";
}
c.c.removeAllElements();
}
jTextArea1.setText(s);
}
catch(Exception e ){
jLabel1.setText("Verificai datele
introduse");
} }
private void
jTextArea1KeyPressed(java.awt.event.KeyEvent
evt) { try{ if(evt.getKeyCode()>=48 &&
evt.getKeyCode()<=57||evt.getKeyCode()==32){
jLabel1.setText(""+evt.getKeyChar());
}
else throw new
RuntimeException();
}
catch(RuntimeException e){
jLabel1.setText("Nu ai ntrodus numr !");
} }
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new
Runnable() {
public void run() {
new JFrame().setVisible(true);
} }); }
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JScrollPane
jScrollPane1;
private javax.swing.JTextArea jTextArea1;
}

class Calcul {
Stack c = new Stack();
public int funct(String text){
String s[] = text.split(" ");
int j = 1;
for(int i=0;i<s.length;i=i+2,j=j+2){
if(j<s.length){
c.add((Integer.parseInt(s[i])+
Integer.parseInt(s[j])));
}
else{
if(i<s.length)
c.add(s[i]);
} }
return c.size();
}
public String afisare_stack(){
String s="";
int j=1;
for(int i=0;i<c.size();i++,j++){
s = ""+s+c.elementAt(i);
if(j!=c.size())
s=""+s+" ";
}
return s;
}}
Rezultatul realizrii programului:

5. Probleme propuse:
De realizat variantele date folosind excepiile.
1. Sa se citeasc cte un rnd dintr-un fiier i s se nscrie
in stiv. Apoi rndurile din stiv de nscris n fiier n
ordine invers.
2. Introducei un numr, sub forma de cifre n stiv. Afiai
numrul la care cifrele sunt inversate.
3. Sa se creeze o stiv complectat cu cmpurile
nregistrrii. Organizai acces direct la elementele
nregistrrii.
4. S se creeze i complecteze dou stive, i s se schimbe
informaia intre stive cu locul.
5. Definii clasa Stack. Introducei o secven de caractere i
afia-o n ordine invers
6. Creai o clasa Queue. Introduce o serie de iruri de
caractere, s se verifice daca string-ul dat este unic in
coad.
7. Folosind clasa Set, pentru un ir de numere ntregi s se
creeze metode care determin concatenarea i intersecia
mulimii.
8. Se introduc N parametri de la consol. Aceti parametri
sunt elemente ale vectorului de tip double, i in baza
vectorului se creaz clasa cu obiectul DoubleVector.

Apoi, programul afiaz la consola valorile vectorului n


form: Vector: 2.3 5.0 7.3.
9. Listele I (1..N) i U (1..N), conin rezultatele a N
msurri de curent i tensiune pentru o rezisten
necunoscut R. Apreciai valoarea aproximativa a lui R.
10. Efectuai o sumare pereche pentru orice secven finit de
numere, dup cum urmeaz: n prima etap, se adun
cte dou numerele. La a doua etap, se adun
rezultatele primei etape i etc. pn cnd nu rmne un
numr. Dac n orice etap, dac rmne numr fr
pereche, el trece n etapa urmtoare.
11. Efectuai nmulirea a dou polinoame de grad fix, n
cazul n care coeficienii polinoamelor sunt stocai n
liste.
12. Ne utiliznd facilitile obiectelor adugtoare, aranjai
elementele negative ale listei la sfrit, iar cele pozitive la nceputul acestei liste, pstrnd ordinea.

Partea 6
6.1. Crearea applet-urilor.
Unul dintre scopurile de dezvoltare Java: crearea applet-uri mici programe care se execut pe Web-browser. Deoarece appleturile trebuie s fie secure, ele sunt limitate n capacitatea lor, dei
rmn n continuare un instrument puternic pentru programarea
Web de partea clientului.
/ / Exemplu # 1: Un applet simplu: //
import java.applet.Applet;
import java.awt.*;
public class FirstApplet extends Applet {
private String date;

public void init() {


date = new
java.util.Date().toString();
}
public void paint(Graphics g) {
g.drawString("Apletul este activ:",
50, 15);
g.drawString(date, 50, 35);
}}
Pentru a afia ora i data curent, n acest exemplu a fost
folosit obiectul Date din pachetul java.util. Metod ToString()
este folosit pentru a converti informaia din obiect ntr-un ir de
caractere extras ntr-un applet folosind metoda drawString().
Parametrii acestei metode sunt coordonatele textului, ncepnd cu
colul de sus din stnga a applet-ului.
Applet-ul nu are nevoie de o metod main () codul de
rulare poate fi plasat n metoda init () sau paint (). Pentru a rula
applet-ul trebuie de ntrodus referina la clasa lui n HTMLdocument i s vizualizai acest document cu Web-browserul care
accept Java. n acest caz, se poate de fcut un fragment foarte
simplu (tag) <applet> ntr-un document HTML n view.html:
<html><body>
<applet
code=
FirstApplet.class
width=300 height=300>
</applet>
</body></html>
Fiierul FirstApplet.class pentru un astfel de activare
trebuie s fie n acelai director cu documentul HTML. Realizarea
HTML-documentului are loc n browser-ul Microsoft Internet
Explorer sau Netscape Navigator.

Exemplu applet-ului, in care se utilizeaz metoda


init()paint(), metoda setColor() care atribue culoare caracterelor,
metoda drawString() desenarea irurile.
/ * Exemplu # 1: extragerea irurilor cu diferite culori: * /
import java.applet.*;
import java.awt.*;
public class ColorConstants extends Applet {
public void init(){ }
public void paint(Graphics g)
{
g.setColor(Color.yellow);
g.drawString("<Yellow>", 5, 30);//
culoare galben
g.setColor(Color.blue);
g.drawString("<Blue>", 5,
60);//culoare albastr
g.setColor(Color.green);
g.drawString("<Green>", 5,
90);//culoare verde
}}
Majoritatea metodelor grafice utilizate in applet-uri sunt
metode abstracte din clasa de baza Graphics din pachetul
java.awt. Metodele applet-ului primesc obiectul de tip Graphics
in calitate de parametru, i mpreuna cu el primete culoarea
curent, fontul, poziia cursorului. Setarea contextului se realizeaz
de obicei de metoda udate() sau paint().
Cele mai des utilizate metode din aceasta clasa:
drawLine(int x1, int y1, int x2, int y2)
desena linie
drawRect(int x, int y, int width, int
height)i fillRect(int x, int y, int width,
int height) desean un dreptunghi un colorat;

draw3DRect(int x, int y, int width, int


height, boolean raised) desen dreptunghi
tridimensional;
drawRoundRect(int x, int y, int width,
int height, int arcWidth, int arcHeight)
desen un dreptunghi rotunjit;
drawOval(int x, int y, int width, int
height) desen un oval;
drawPolygon(int[] xPoints, int[]
yPoints, int nPoints) desen un poligon dat de
matricele x si y;
drawPolygon(Polygon p) poligon, avnd n vedere
obiectul Poligon;
paint(), drawPolyline(int[] xPoints, int[]
yPoints, int nPoints) desen secven de linii, date de
matricele x si y;
drawArc(int x, int y, int width, int
height, int startAngle, int arcAngle) desen
un arc
drawImage(Image img, int x, int y, Color
bgcolor, ImageObserver observer) adaug
imaginea;
drawString(String str, int x, int y)
desen un text;
setColor(Color c), getColor() seteaz i
returneaz culoarea curent;

getFont() returneaz fontul curent;


setFont(Font font) seteaz fontul specificat.
Exemplele de mai jos, demonstreaz modul de utilizare a
metodelor clasei Graphics pentru a afia imagini grafice ntr-o
fereastr applet.
/ / Exemplu # 2: desenarea poligonului:
import java.applet.*;
import java.awt.*;
public class DrawPoly extends Applet {
int poly1_x[] = { 40, 80,
0, 40};
int poly1_y[] = {
5, 45, 45,
5};
int poly2_x[] = { 140, 180, 180, 140,
100, 100, 140};
int poly2_y[] = {
5, 25, 45, 65,
45, 25,
5};
int poly3_x[] = { 240, 260, 220, 260,
220, 240};
int poly3_y[] = {
5, 65, 85, 25,
25,
5};
public void paint(Graphics g)
{
g.drawPolygon(poly1_x, poly1_y,
poly1_x.length);
g.drawPolygon(poly2_x, poly2_y,
poly2_x.length);
g.drawPolygon(poly3_x, poly3_y,
poly3_x.length);
}}
/ / Exemplu # 3: dreptunghi tridimensional:
import java.applet.*;
import java.awt.*;
public class ThreeDRect extends Applet {

public void draw3DRect(Graphics g, int x,


int y,
int width, int height, boolean raised)
{
g.draw3DRect(x, y, width - 1, height
- 1, raised);
g.draw3DRect(x + 1, y + 1, width - 3,
height - 3, raised);
g.draw3DRect(x + 2, y + 2, width - 5,
height - 5, raised);
}
public void fill3DRect(Graphics g, int x,
int y,
int width, int height, boolean raised)
{ g.draw3DRect(x, y, width-1, height-1,
raised);
g.draw3DRect(x + 1, y + 1, width - 3,
height - 3, raised);
g.draw3DRect(x + 2, y + 2, width - 5,
height - 5, raised);
g.fillRect(x + 3, y + 3, width - 6,
height - 6);
}
public void paint(Graphics g){
g.setColor(Color.gray);
draw3DRect(g, 10, 5, 80, 40, true);
draw3DRect(g, 130, 5, 80, 40, false);
fill3DRect(g, 10, 55, 80, 40, true);
fill3DRect(g, 130, 55, 80, 40,
false);
}}
/ / Exemplu # 4: extragerea n fereastr a GIF-imaginei:
import java.applet.*;
import java.awt.*;
public class DrawImage extends Applet {
Image img;

public void init() {


img = getImage(getCodeBase(),
"cow.gif"); }
public void paint(Graphics g){
g.drawImage(img, 0, 0, this);
}}
Cnd sunt utilizate proprietile tag-ul <applet> este posibil de a
trimite parametrii din HTML-document n codul applet-ul.
/ / Exemplu # 5: Transmiterea parametrilor pentru applet:
import java.awt.*;
import java.applet.*;
public class ReadParam extends Applet{
int b;
String name = "OK";
boolean statement;
public void start() {//citirea parametrilor
String param;
param = getParameter("statement");
if(param != null)
statement =
Boolean.valueOf(param).booleanValue();
try {
param = getParameter("bNumber");
if(param != null) //dac nu este gsit
b = Integer.parseInt(param);
} catch(NumberFormatException e) {
b = 0;
statement = false;
}}
public void paint(Graphics g) {
double d = 0;
if(statement) d = Math.pow(b,2);
else name = "FALSE !";
g.drawString("Name: " + name, 0, 11);
g.drawString("Value b: " + b, 0, 45);

g.drawString("b power 2: " + d, 0, 62);


g.drawString("Statement: " + statement,
0, 79);
} }
Dac parametru nu este disponibil, getParameter ()
returneaz null. HTML-documentul pentru acest exemplu ar putea
arata ca:

<html><head><title>Parametrii
Apletului</title></head>
<body>
<applet
code=ReadParam.class
width=250 height= 300>
<param name = bNumber value = 4>
<param name = statement value =
true>
</applet></body> </html>
Pentru a utiliza componente n applet-uri se folosesc clase
interfee n care componentele de pe ecran se creaz prin
mijloacele Java i n msura minim depinde de platforma i
echipament. Acest tip de clase componente au fost adunate n
biblioteca Swing.
/ / Exemplu # 6: applet cu componente:
import javax.swing.*;
import java.awt.*;
public class MyJApplet extends JApplet {
JLabel lbl = new JLabel("Swingapplet!");;
public void init() {
Container c = getContentPane();
c.add(lbl);
}}
In acest program se realizeaz plasarea etichetei text JLabel
pe forma in applet. Constructorul clasei JLabel primete obiectul

String i folosete valoarea ei la crearea etichetei. Apelat n mod


automat la ncrcarea applet-ului metoda init(), de obicei
responsabil de initializarea
cmpurilor i introducerea
componentei pe form. Pentru acesta se apeleaz metoda add()
din clasa Container, care introduce componentele ntr-un
container. Metoda add() nu este activat imediat, ca i n
biblioteca AWT. Pachetul Swing impune ca toate componentele sa
fie adugate in panoul formei ContentPane , de aceia trebuie
iniial de activat metoda getContentPane() a clasei JApplet
pentru a crea o referin la obiect, ca parte a procesului add().
/* exemlu #7 : lucrul metodei init(), start(), stop() */
import java.awt.*;
import javax.swing.*;
public class InitDemo extends JApplet {
private int i;
private String msg = null;
private Color c;
public void init() {
c = new Color(0, 0, 255);
this.setBackground(c);
this.setForeground(Color.white);
setFont(new java.awt.Font("Courier", 1,
14));
msg = " initialization";
i = 1;
}
public void start() {
int j = i * 25;
if (j < 255){
c = new Color (j, j, 255 - j); }
setBackground(c);
String str = Integer.toString(i);
msg += " " + str;
}
public void paint(Graphics g)

{ g.drawString(msg, 30, 30);}


public void stop() {
i++;
msg = "start() - stop()"; }}
Atunci cnd se lucreaz cu font-uri, se poate de determinat
care dintre ele sunt disponibile i pot fi utilizate. Pentru a obine
aceast
informaie,
se
folosete
metoda
getAvailableFontFamilyNames()
din
clasa
GraphicsEnvironment. Metoda returneaz un array de iruri de
caractere care conine numele de font-uri disponibile.
/ * Exemplu # 8: acces la font-urile sistemului de operare:
*/
import javax.swing.*;
import java.awt.*;
public class FontDemo extends JApplet {
private int i;
private String msg = null;
private String[] fonts;
public void init() {
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironm
ent();
fonts = ge.getAvailableFontFamilyNames();
}
public void start() {
int j = i;
if (j > fonts.length) i = 0;
else setFont(new Font(fonts[j], 1, 14));
String str = Integer.toString(i);
msg = fonts[j] + " " + str;
i++;
}
public void paint(Graphics g) {
g.drawString(msg, 30, 30);
} }

Biblioteca Swing, precum i biblioteca AWT, susine un set


de metode grafice din clasa Graphics. Toate elementele grafice se
deseneaz n fereastr. Apariia in fereastr se face printr-un
context grafic folosind metoda paint() sau metoda update().
Clasa Graphics, obiectul creia este trecut la context, definete
funciile de desen.
6.2. Frame-uri
Spre deosebire de applet-uri, aplicaii grafice care extind
clasa java. awt. Frame sau subclasa jawax.swing.JFrame, nu au
nevoie de browser. Pentru crearea interfeei grafice a aplicaiei
GUI, trebuie s-i ofere un obiect Frame sau JFrame, in care vor
fi adunate componentele utilizate de aplicaia GUI.
Astfel de aplicaie se lanseaz cu ajutorul metodei main() i
este responsabil pentru afiarea n fereastr. Frame-urile sunt larg
utilizate pentru construirea unor sisteme distribuite, care
funcioneaz n reele locale i private.
/ / Exemplu # 9: afiarea textului, liniilor, i ovalelor:
import java.awt.*;
import java.awt.event.*;
public class WindowApp extends Frame{
String msg = "Window-Application";
int x1 = 30, y1 = 50, x2 = 200, y2 = 50;
public void paint(Graphics g){
g.drawString(msg, 30, 40); /* afiarea
rndului din poziia =30 y=40*/
g.drawLine(x1, y1, x2, y2);
//afiarea rndului
int x = 30, y = 200, width = 150,
height = 100;
Color c = new Color(255, 100, 100);/*
culoarea roie */
g.setColor(c);
g.drawOval( x, y, width, height);//oval

g.drawArc(x + 100, y + 50, width - 50,


height, 0, 360);//sector
}
public static void main(String args[]){
WindowApp fr = new WindowApp();
fr.setSize(new Dimension(500, 400));/*
dimensiunile ferestrei*/
fr.setTitle("awt-Application");//titlul
fr.setVisible(true); // vizibilitatea
fr.repaint(); //redesenare - activnd
paint()
} }
Metoda main() activeaz metoda setrii parametrilor
ferestrei i metoda de redesenare a ferestrei repaint(). Un numr
mare de metode a clasei Frame motenete ierarhic de la clasele
Component, Container si Window. Clasa JFrame din biblioteca
Swing este o subclas a clasei Frame.
Lucrare de laborator nr. 6
1. Tema lucrrii:
Programarea applet-elor
2. Scopul lucrrii:
nsuirea modalitilor de creare i realizare a applet-ului n
Java;
3. Etapele de realizare:
17) Crearea applet-ului;
18) Metode de activare a applet-ului;
19) Crearea obiectelor grafice n applet;
20) Crearea interfeii programului;
21) Prezentarea lucrrii.
4. Exemplu de realizare:
import java.applet.Applet;

import java.awt.Color;
import java.awt.Graphics;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Main extends Applet {
boolean t = true ;
int y = 9;
int x = 10;
double i = 0.03;
int r = 200;
int b = 0;
int g = 0;
public Color c = new Color(10, 0, 200);
String mesaj= " Programarea Orientata pe
Obiecte - APPLET ";
public void start(){t = true;}
public void stop (){t = false;}
public void init (){super.setSize(500,
500);}
public void parametri(){
x = x+2;
y = y+3;
}
public void paint(Graphics g){
if(t){
parametri();
g.setColor(Color.white);
g.clearRect(0, 0, getWidth(),
getHeight());
if((y%9)==0)
g.setColor(Color.red);
else{
if((y%7)==0)
g.setColor(Color.BLUE);
else{
if((y%5)==0)

g.setColor(Color.GREEN);
else{
if((y%3)==0)
g.setColor(Color.MAGENTA);
else{
if((y%2) == 0)
g.setColor(Color.darkGray);
}}}}
g.drawString(mesaj, x, y);
try {
Thread.sleep(100);
} catch (InterruptedException
ex)
{
Logger.getLogger(Main.class.
getName()).log(Level.SEVERE, null, ex);
}
repaint();
}}}
Rezultatul realizrii programului:

5. Probleme propuse:
Pentru toate variantele de creat un applet care realizeaz
sarcina indicat.
1. Sa se creeze micare pe ecran a irurilor de caractere (unul
dup altul) dintr-un tablou de iruri. Direcia de micare n
applet i consecutivitatea fiecrui rnd este selectat
aleatoriu.
2. De creat un ir de caractere pe ecran, unde caracterele
apar din diferite prti ale applet-ului, i sa se alinieze unul
dup altul. Procesul trebuie s fie repetat ciclic.

3. Sa se creeze o micare a cercului n applet, astfel nct,


atunci cnd atingei limitele ecranului, cercul este reflect,
cu efect de comprimare elastic.
4. De prezentat ntr-un applet apropierea mingei i deplasarea
ei. Mingea trebuie s se mite, cu o viteza constant.
5. Sa se reprezinte n applet un segment, ce se rotete n
planul ecranului n jurul unuia din punctele finale ale lui.
Segmentul trebui s-i schimbe culoarea de la o poziie la
alta.
6. Sa se reprezinte n applet un segment, ce se rotete n
planul ecranului n jurul punctului, care se deplaseaz de-a
lungul segmentului.
7. S se reprezinte un dreptunghi, care se rotete n planul
ecranului n jurul centrului su de greutate.
8. S se reprezinte un dreptunghi, ce se rotete n planul
ecranului n jurul unuia dintre vrfuri.
9. Reprezint un triunghi, ce rotete n plan ecranului n jurul
centrului su de greutate.
10. Sa se creeze micare pe ecran a imaginilor din directorii.
Direcia de micare n applet i consecutivitatea imaginilor
este selectat aleatoriu.
11. Sa se reprezinte n applet un ceas electronic cu timpul
curent.
12. Sa se reprezinte n applet calendarul lunii curente.

Partea 7
7.1. Colecii
Colecie reprezint o realizare de tipuri abstracte (structuri)
de date, care realizeaz dou operaii de baz:
introduce un element nou n colecie;
terge elementul din colecie.

Coleciile sunt unite ntr-o bibliotec de clase java.util, i


reprezint containere pentru depozitarea i manipularea obiectelor.
Colecii - sunt tablouri dinamice, liste legate, arbori, seturi, tabele
hash, stive, cozi. n clasa Collection sunt definite metode statice
care lucreaz cu toate coleciile. Un alt mod de a lucra cu
elementele coleciei este utilizarea metodelor din clasa Iterator,
care prevede un mijloc de parcurgere a coninutului coleciei.
Clasele coleciilor:
Collection vrful ierarhiei a claselor;
ist extinderea coleciei pentru prelucrare listei;
Set extinderea colecii pentru prelucrarea mulimi (seturi),
care conine elemente unice;
Map afiarea datele sub form de cheie-valoare .
Toate
clasele
de
colecii
realizeaz
interfaa
Serializable.
Metodele clasei Collection:
boolean add(Object obj) adaug obj la
colecia activat i returneaz true, dac obiectul se adaug, i
false, dac obj este deja un element a coleciei. Tot aa ca
Object - superclasa pentru toate clasele, ntr-o colecie, se pot
pstra obiecte de orice tip, cu excepia celor de baz;
boolean addAll(Collection c) adaug toate
elementele coleciei la colecia activat;
void clear() terge toate elementele din colecie;
boolean contains(Object obj) returneaz
true, daca colecia conine elementul obj;
boolean equals(Object obj) returneaz true,
daca coleciile sunt egale;
boolean isEmpty() returneaz true, daca
colecia este goala;
Iterator iterator() regsete un iterator;

boolean remove(Object obj) terge obj din


colecie;
int size() ntoarce numrul de elemente din
colecie;
Object[] toArray() copie elementele coleciei
intr-un tablou;
Pentru a lucra cu elementele coleciei se utilizeaz
urmtoarele clase:
Comparator pentru compararea obiectelor;
Iterator, ListIterator, Map.Entry pentru a
enumera i accesa obiectele din colecie.
Clasa Iterator se utilizeaz pentru accesul la elementele
coleciei.
Iteratorii se plaseaz intre elementele din colecie.
Metodele clasei Iterator:
Object next() returneaz un obiect la care arata
iteratorul, i mut indicatorul curent la urmtorul iterator,
asigur accesului la elementul urmtor. Dac elementul urmtor
din colecie este absent, metoda next(), genereaz o excepie
NoSuchElementException;
boolean hasNext() verific elementul urmtor, i
dac nu-i, returneaz false. Iteratorul n acest caz rmne
neschimbat;
void remove() terge obiectul , returnat de ultimul
apel a metodei next();
Clasa ListIterator extinde clasa Iterator i este destinat n
primul rnd pentru a lucra cu liste. Disponibilitatea metodelor
Object previous(), int previousIndex() si boolean
hasPrevious() prevede navigarea de la sfritul listei . Metoda
int nextIndex() returneaz numrul urmtorului iterator .
Metoda add(Object ob) permite inserarea a unui element in
list in poziia curent. Apelul metodei void set(Object ob)
nlocuiete elementul listei curent cu obiectul care este transmis
metodei ca parametru.

Clasa Map.Entry este predefinit pentru a extrage cheile i


valorile folosind metode getKey() i getValue(), respectiv.
Apelarea metodei setValue(Object value) nlocuiete
valoarea asociat cu cheia curenta.
7.2. Liste
Clasa ArrayList este un masiv dinamic de referine la
obiecte. Extinde clasa AbstractList i realizeaz interfaa List.
Clasa are urmtorii constructori:
ArrayList()
ArrayList(Collection c)
ArrayList(int capacity)
Practic, toate metodele clasei sunt o implementare a
metodelor abstracte din superclasele sale i interfee. Metode
interfeei List permite de a insera i terge elemente din poziii,
indicate de indice:
void add(int index, Object obj) inserat obj
n poziia indicat de index;
void addAll(int index, Collection c)
insereaz n list toate elementele coleciei c, ncepnd de la
poziia index;
Object get(int index) returneaz elementul n
forma de obiect din poziia index;
int indexOf(Object ob) returneaz indexul
obiectului indicat;
Object remove(int index) terge obiectul din
poziia index;
tergerea elementelor coleciei este o sarcin voluminoas,
astfel un obiect ArrayList este potrivit pentru a pstra liste
neschimbate.
/* exemplu # 1 : Lucru cu liste : */
import java.util.*;
public class DemoList1 {

public static void main(String[] args)


{
List c = new ArrayList();
//Collection c = new ArrayList();//ncearc
aa!
int i = 2, j = 5;
c.add(new Integer(i));
c.add(new Boolean("True"));
c.add("<STRING>");
c.add(2,
Integer.toString(j)
+
"X");
//schimba 2 cu 5 !
System.out.println(c);
if (c.contains("5X"))
c.remove(c.indexOf("5X"));
System.out.println(c);
}
}
Rezultatul la consol va fi:
[2, true, 5X, <STRING>]
[2, true, <STRING>]
Pentru a accesa elementele din list pot fi utilizat interfaa
ListIterator, n timp ce clasa ArrayList dispune de metode
similare, n special setObject(int index, Object ob), care permite
s nlocuiasc elementul din list fr iterator, returnnd elementul
ters.
/* exemplu # 2 : schimbul si tergerea
elementelor : */
import java.util.*;
public class DemoList2 {
static ListIterator it;
public static void main(String[] args)
{
ArrayList a = new ArrayList();
int index;

System.out.println("colecia

pustie:

"
+ a.isEmpty());
Character ch = new Character('b');
a.add(ch);
for (char c = 'a'; c < 'h'; ++c)
a.add(new Character(c));
System.out.println(a
+
"numrul
de
elemente:"
+ a.size());
it
=
a.listIterator(2);
//extragerea
iteratorului listei
it.add("new"); //adugarea elementului
System.out.println(
a
+
"adugarea
elementului
n
poziia");
System.out.println("numrul
de
elemente
este:"
+ a.size());
//compararea metodelor
index
=
a.lastIndexOf(ch);
//index
=
a.indexOf(ch);
a.set(index,
"rep");
//schimbul
elementului
System.out.println(a
+
"schimbul
elementului");
a.remove(6);
//tergerea
elementului
System.out.println(a + "eswte ters al
6-lea element");
System.out.println("colecia e pustie:
"
+ a.isEmpty());
}
}

Colecia LinkedList pune n aplicare o list nlnuit. n


contrast cu matricea, care stocheaz obiectele din locaiile de
memorie consecutive, lista legat pstreaz obiectul separat, ns
mpreun cu link-urile urmtoarei i anterioarei secvene a irului.
n lista alctuit din N elemente, exist N +1 poziii a iteratorului.
Plus la toate metodele care exist in LinkedList se
realizeaz metodele void addFirst(Object ob), void
addLast(Object ob), Object getFirst(), Object
getLast(),
Object
removeFirst(),
Object
removeLast() care aduga, extrage, terge i extrage primul i
ultimul element din list.
/* exemplu # 3 : adugarea si tergerea
elementelor : */
import java.util.*;
public class DemoLinkedList {
public static void main(String[] args){
LinkedList aL = new LinkedList();
for(int i = 10; i <= 20; i++)
aL.add("" + i);
Iterator it = aL.iterator();
while(it.hasNext())
System.out.print(it.next() + " ->
");
ListIterator
list
=
aL.listIterator();
list.next();
System.out.println("\n"
+
list.nextIndex()
+ "indice");
//tergerea
elementului
cu
indicele
curent
list.remove();
while(list.hasNext())
list.next();//trecerea la indicele
urmtor
while(list.hasPrevious())

/*extragere n ordine invers */


System.out.print(list.previous()
+

"

");
//metodele LinkedList
aL.removeFirst();
aL.removeLast();
aL.removeLast();
aL.addFirst("FIRST");
aL.addLast("LAST");
System.out.println("\n" + aL);
}
}
7.3. Set
Interfaa Set declar comportamentul colecii, nu permite
suprapunerea elementelor. Interfaa SortedSet motenete Set i
anuna comportamentul mulimii, sortate n ordine cresctoare cu
metodele first() / last(), care returneaz primul i ultimul
elemente.
Clasa HashSet motenete de la clasa abstract AbstractSet
i implementeaz interfaa Set, utiliznd un tabel hash pentru a
stoca colecia. Cheia (cod hash) este folosit n loc de indexe pentru
acces la date, care accelereaz mult cutarea unui anumit
element. Viteza de cutare este esenial pentru coleciile cu un
numr foarte mare de elemente. Toate elementele dintr-o mulime
sunt sortate cu ajutorul tabelului de hash, care stocheaz hash
codurile elementelor.
Constructorii clasei:
HashSet()
HashSet(Collection c)
HashSet(int capacity)
HashSet(int capacity, float fillRatio),
unde capacity numrul de celule pentru pstrarea
hash-coduri.

/* exemplu # 4 : utilizarea mulimii


pentru
extragerea
cuvintelor
unice
din
fiier : */
import java.util.*;
import java.io.*;
class DemoHashSet {
public static void main(String[] args)
{
Set words = new HashSet(100);
// utilizarea coleciilor LinkedHashSet sau
TreeSet
long
callTime
=
System.currentTimeMillis();
try {
BufferedReader in =
new BufferedReader(new FileReader(
"c://pushkin.tx
t"));
//La sfritul fiierului necesit s fie
irul END
String line = "";
while
(!(line
=
in.readLine()).equals("END")) {
StringTokenizer tokenizer =
new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
String
word
=
tokenizer.nextToken();
words.add(word);
}
}
} catch (IOException e) {
System.out.println(e);
}
Iterator it = words.iterator();
while (it.hasNext())

System.out.println(it.next());
long totalTime =
System.currentTimeMillis()callTime;
System.out.println("cuvinte:
"
+
words.size() + ", " + totalTime
+
"
milisecunde");
}
}
Clasa TreeSet servete pentru stocarea obiectelor folosind
un arbore binar, specifica cruia este sortarea elementelor sale.
Atunci cnd este adugat un obiect la arbore el este imediat pus n
poziia necesar, innd cont de sortare. Sortarea se datoreaz
faptului c toate elementele adugate realizeaz interfaa
Comparable. Operaiile de tergere i inserare de obiecte sunt mai
lente dect un hash-set, dar mai rapid dect n liste.
Clasa TreeSet conine metode pentru a prelua prima i
ultima (cel mai mic i cel mai mare) elemente first() si last().
Metodele SortedSet subSet(Object from, Object
to),
SortedSet
tailSet(Object
from)
i
SortedSet headSet(Object to) servesc pentru a extrage
o anumit parte a setului.
/* exemplu # 5: crearea mulimelor din
list si metodele lor */
import java.util.*;
public class DemoTreeSet {
public static void main(String[] args)
{
Collection c = new ArrayList();
boolean b;
for (int i = 0; i < 6; i++)
c.add(Integer.toString(
(int) (Math.random() * 90)) + 'Y');
System.out.println(c + "lista");
TreeSet set = new TreeSet(c);

System.out.println(set
+
"mulimea");
b
=
set.add("5
Element");
//adugarea(b=true)
b
=
set.add("5
Element");
//adugarea(b=false)
//dup adugare
System.out.println(set + "add");
Iterator it = set.iterator();
while (it.hasNext()) {
if (it.next() == "5 Element")
it.remove();
}
//dup tergere
System.out.println(set + "delete");
//extragerea
elementului
maximal
i
minimal
System.out.println(set.last() + " "
+ set.first());
}
}
Rezultatul realizrii:
[42Y, 61Y, 55Y, 3Y, 4Y, 55Y]lista
[3Y, 42Y, 4Y, 55Y, 61Y]set
[3Y, 42Y, 4Y, 5 Element, 55Y, 61Y]add
[3Y, 42Y, 4Y, 55Y, 61Y]delete
61Y 3Y
Mulimea este iniializat de list i sortat imediat n
procesul de creare . Dup adugarea unui nou element a fcut o
ncercare nereuit de a se aduga din nou. Folosind iteratorul
elementul poate fi gsit i scos din mulime.
7.4. Hri Map

Harta Map - este un obiect care deine o pereche de cheievaloare. Cutarea obiectului (valori) este facilitat n comparaie
cu mulimile, datorit faptului c aceasta poate fi gsit dup cheie
individual. n cazul n care elementul cu cheia specificat nu este
gsit, atunci este returnat null.
Clasele de hri :
AbstractMap realizeaz interfaa Map;
HashMap extinde AbstractMap, utiliznd hash-tabel,
n care cheile sunt ordonate n dependen de valorile codurilor
hash;
TreeMap extinde AbstractMap, folosind un arbore n
care cheile sunt aranjate ntr-un arbore de cutare ntr-un mod
ordonat.
Interfeele harii:
Map afieaz chei i valorile unice;
Map.Entry descrie o pereche de cheie-valoare
SortedMap conine cheile sortate.
Interfaa Map conine urmtoarele metode:
void clear() elimin toate perechile din hart;
boolean containsKey(Object obj) returneaz
true, daca harta chemata conine obj ca cheie;
Set entrySet() returneaz un set care conine valorile
harii;
Set keySet() returneaz un set de cheii;
Object get(Object obj) returneaz valoarea
asociat cu cheia obj;
Object put(Object obj1, Object obj2) pune
cheia obj1 i valoarea obj2 in hart. Cnd este adugat elementul
in hart cu o cheie existent va fi nlocuit elementul curent cu cel
nou. Metoda va returna elementul nlocuit;
Collection values() returneaz o colecie ce
conine coninutul hari;
Interfaa Map.Entry conine urmtoarele metode:

Object getKey() returneaz cheia curent;


Object getValue() returneaz valoarea curent;
Object setValue(bject obj) stabilete valoarea
obj n poziia curent.
Exemplul de mai jos arat cum de creat un hash-hart i
acces la elementele sale.
/* exemplu # 6 : crearea hash-hrii i
schimbarea elementului dup cheie: */
import java.util.*;
public class DemoHashMap {
public static void main(String[] args){
Map hm = new HashMap(5);
for (int i = 1; i < 10; i++)
hm.put(Integer.toString(i),
i
+
"
element");
hm.put("14s", new Double(1.01f));
System.out.println(hm);
hm.put("5", "NEW");
System.out.println(hm
+
"modificarea
elementului ");
Object a = hm.get("5");
System.out.println(a + " a fost gsit dup
cheie '5'");
/* exstregerea hash-tabelului cu metoda
interfeii Map.Entry */
Set set = hm.entrySet();
Iterator i = set.iterator();
while(i.hasNext()){
Map.Entry me = (Map.Entry)i.next();
System.out.print(me.getKey()+"
:
");
System.out.println(me.getValue());
}
}
}

Mai jos urmeaz un fragment de sistem corporativ, care


demonstreaz posibilitatea
clasei HashMap i a interfeii
Map.Entry la stabilirea drepturilor utilizatorilor.
/* exemplu # 7 : utilizarea coleciilor
pentru controlul accesului la sistem : */
import java.util.*;
public class DemoSecurity {
public static void main(String[] args)
{
CheckRight.startUsing("2041",
"Bill
G.");
CheckRight.startUsing("2420",
"George
B.");
/*adugarea unui nou utilizator controlul
nivelului de acces */
CheckRight.startUsing("2437",
"Phillip
K.");
CheckRight.startUsing("2041",
"Bill
G.");
}
}
class CheckRight {
private
static
HashMap
map
=
new
HashMap();
public static void startUsing(
String id, String name) {
if (canUse(id)){
map.put(id, name);
System.out.println("accesul
este
acordat");
}
else {
System.out.println("accesul
este
interzis");
}
}

public static boolean canUse(String id)


{
final int MAX_NUM = 2;//de schimbat
2 pe 3
int currNum = 0;
if (!map.containsKey(id))
currNum = map.size();
return currNum < MAX_NUM;
}
}
Rezultatul realizrii:
accesul este acordat,
accesul este acordat
accesul este interzis
accesul este interzis,
Astfel nct s aib acces la sistem simultan permis doar
pentru doi utilizatori. n cazul n care n codul programului se va
modifica valoarea constantei MAX_NUM mai mult de 2, atunci
noul utilizator primete drepturi de acces.
Clasa WeakHashMap permite mecanizmului de distrugere a
obiectelor de a tergere din hart valoarea dup cheie, referin
cruia a ieit din domeniul de aplicare al programului.
Clasa LinkedHashMap memoreaz lista obiectelor
adugate la hart i formeaz o list dublu-nlnuit. Acest
mecanism este eficient doar dac este suprancrcat coeficientul
hrii, atunci cnd se lucreaz cu cache-memorie.
ncepnd cu versiunea de Java 1. 4 a fost adugat clasa
IdentityHashMap, codurile hash a obiectelor-cheie sunt calculate
de metoda System.identityHashCode() dup adresa obiectului n
memorie, n contrast cu metoda hashCode (), care calculate
exclusiv pe coninutul obiectului.

7.5. Colecii motenite


n unele tehnologii, cum ar fi Servletele, pn n prezent se
folesesc coleciile care existau n Java iniial, i anume harta
Hashtable i enumerarea Enumaration.
/* exemplu # 8 : crearea hash-tabel i
cutarea elementelor dup cheie : */
import java.util.*;
import java.io.*;
public class HashTableDemo {
public static void main(String[] args)
{
Hashtable capitals = new
Hashtable();
showAll(capitals);
capitals.put("Ucraina", "Kiev");
capitals.put("Frana", "Paris");
capitals.put("Belarusi", "Minsc");
showAll(capitals);
//cutarea dup cheie
System.out.print("introducei ara: ");
BufferedReader br =
new BufferedReader(
new
InputStreamReader(System.in));
String name;
try {
name = br.readLine();
showCapital(capitals, name);
} catch (IOException e) {
e.printStackTrace();
}
}
private static void showAll(Hashtable
capitals){
Enumeration countries;

if (capitals.isEmpty())
System.out.println("tabelul
este gol");
else {
countries = capitals.keys();
String country;
while (countries.hasMoreElements())
{
country = (String)
countries.nextElement();
System.out.print(country + " ");
System.out.println(capitals.get(country));
}
}
}
private static void showCapital(
Hashtable cap, String country)
{
if (cap.get(country) != null) {
System.out.print(country + " ");
System.out.println(cap.get(country));
} else
System.out.println("nscrierea
lipsete");
}
}
Ca rezultat, la consol se va afia:
tabelul este gol
Belarus - Minsk
Frana - Paris,
Ucraina - Kiev,

introducei ar: Ucraina


Ucraina - Kiev
exemplu
#
9
:
crearea
coleciei
parametrizate : */
import java.util.*;
public class Principiul de lucru cu coleciile, n
comparaie cu structura lor, la schimbare versiuni limbajului Java
nu s-au schimbat n mod semnificativ.
7.6. Parametrizarea coleciei in J2SE 5.0
Este propus un mecanism mult mai convenabil pentru lucrul
cu coleciile, i anume:
nu este nevoie n mod constant pentru a converti obiectele
returnate (de tip Object) la tipul dorit;
compilatorului se transmite un raport preliminar cu privire
la tipul de obiecte care vor fi stocate n colectarea i verificarea se
face la compilare.
/* DemoGenerics {
public static void main(String args[]) {
Map <String, Integer> map =
new HashMap <String, Integer> ();
map.put("Key 1", 1);
int res = map.get("Key 1");/*
compilatorul cunoate tipul valorii */
Character ch = new Character(2);
// map.put(ch, 2);//errore de compilare
//compilatorul nu permite de a aduga un alt tip
}
}
n aceast situaie nu creeaz o nou clas pentru fiecare tip
i colecia nu este schimbat, pur i simplu compilatorul conine
informaii cu privire la tipul de elemente care pot fi stocate n
hart. Parametrul coleciei nu poate fi un tipul de baz.

Trebuie remarcat faptul c ar trebui s indice tipul la crearea


unei referine, altfel va fi permis pentru a aduga obiecte de toate
tipurile.
// exemplu # 10 : parametrizarea :
import java.util.*;
public class UncheckCheck {
public static void main(String args[]) {
Collection c1 = new HashSet <String> ();
c1.add("Java");
c1.add(5); //nu este error: c1 nu este
parametrizat
for(Object ob : c1)
System.out.print(ob);
Collection <String> c2 = new
HashSet<String>();
c2.add("A");
// c2.add(5);
//error de compilare: deoarece c2 este
parametrizat
}
}
Rezultatul realizrii va afia :
Java5
Pentru ca parametrizarea coleciei sa fie complet, trebuie de
specificat un parametru i atunci cnd se declar un link, i atunci
cnd se declar un obiect.
Exist biblioteci deja gata, n care nu sunt teste de tip, prin
urmare, utilizarea lor nu poate garanta c in colecie nu va fi plasat
un obiect de alt tip. Pentru acesta n clasa Collections a fost
adugat[ o nou metod checkedCollection():
public static < E > Collection < E >
checkedCollection(Collection< E > c,
Class< E > type)

Aceast metod creeaz o colecie, verificat n faza de


implementare, de exemplu, n cazul de adugare a unui obiect de
alt tip genereaz o excepie ClassCastException:
/* exemplu # 11 : colecia verificat :
*/
import java.util.*;
public class SafeCollection{
public static void main(String args[]) {
Collection c =
Collections.checkedCollection(
new HashSet <String>(),
String.class);
c.add("Java");
c.add(5.0);
//error
}
}
n aceast clas au fost adugate o serie de metode,
specializate pentru testarea anumitor tipuri de colecii, i anume:
checkedList(),
checkedSortedMap(),
checkedMap(), checkedSortedSet(), checkedSet().
n versiunea Java 5.0 au fost adugate mai multe clase i
interfee noi, cum ar fi EnumSet, EnumMap, PriorityQueue etc.
Ca o ilustrare a posibilitilor putem considera una dintre ele interfaa Queue:
public interface Queue < E > extends
Collection < E >
Metodele interfeei Queue:
Eelement() returneaz, dar nu elimina elementul din capul
cozii;
boolean offer(E o) introduce un element n coad, dac
este posibil (de exemplu: dimensiuni limitate);
E peek() - returneaz, dar nu elimina elementul din capul
cozii, returneaz null, n cazul n care coada este goal;

E poll() ntoarce i elimin elementul din capul cozii,


returneaz null, n cazul n care coada este goal;
E remove() - returneaz i elimin elementul capul cozii .
Metode de element() i remove() difer de metoda Peek() i
poll(), care arunc o excepie n cazul n care coada este goal.
Este de remarcat faptul c clasa LinkedList acum n afar
de interfa List <E> pune n aplicare i Queue:
/* exemplu # 12 : colecia verificat :
*/
import java.util.*;
public class DemoQueue {
public static void main(String args[])
{
LinkedList <Integer> c =
new LinkedList <Integer> ();
//adugare a 10 elemente
for (int i = 0; i < 10; i++)
c.add(i);
Queue <Integer> queue = c;
for (int i : queue) //extragerea
elementelor
System.out.print(i + " ");
System.out.println(" :size= "
+ queue.size());
//eliminare a 10 elemente
for (int i = 0; i < 9; i++) {
int res = queue.poll();
}
System.out.print("size= " +
queue.size());
}
}
In rezultatul realizrii se va afia :
0 1 2 3 4 5 6 7 8 9 :size=10
size=1

7.7. Prelucrarea tablourilor


In biblioteca java.util este clasa Arrays, care conine
metode de manipulare cu coninutul matricei, i anume, de a
cuta, complecta, compara, converti n colecie:
int binarySearch(parametrii) mod
suprancrcat i servete pentru organizarea binar de cutare ntro matrice de tipuri primitive i obiect. Returneaz poziia primei
coincidene;
void fill(parametrii) metod suprancrcat
servete pentru complectarea tablouri de diferite tipuri i primitive;
void sort(parametrii) metoda metod
suprancrcat servete pentru a sorta o matrice sau o parte din ea
folosind interfaa Comparator i fr ea;
List asList(Object [] a) metod care copii
elementele matrice ntr-un obiect de tip List.
Aplicarea acestor metode are loc n exemplu urmtor.
/* Exemplu # 13 : metodele clasei Arrays
:*/
import java.util.*;
public class ArraysEqualDemo {
public static void main(String[] args)
{
char m1[] = new char[3],
m2[] = { 'a', 'b', 'c' }, i;
Arrays.fill(m1, 'a');
System.out.print("tabloul m1:");
for (i = 0; i < 3; i++)
System.out.print(" " + m1[i]);
m1[1] = 'b';
m1[2] = 'c';
//m1[2]='x'; //va aduce la alt rezultat
if (Arrays.equals(m1, m2))
System.out.print("\nm1 i m2 sunt identice
");

else
System.out.print("\nm1 i m2 nu sunt
identice ");
m1[0] = 'z';
Arrays.sort(m1);
System.out.print("\n tabloul m1:");
for (i = 0; i < 3; i++)
System.out.print(" " + m1[i]);
System.out.print(
"\n valoarea 'c' se afl pe poziia -"
+ Arrays.binarySearch(m1, 'c'));
}
}
n rezultatul realizrii va fi extras:
matricea M1: AAA
M1 i M2 sunt identice
M1 i M2 nu sunt identice
Valoarea c se afl pe poziia 1

Lucrare de laborator nr. 7


1. Tema lucrrii:
Programarea n mediul vizual a proectelor.
2. Scopul lucrrii:
nsuirea modalitilor de creare i realizare a coleciilor n
Java;
3. Etapele de realizare:
22) Crearea coleciilor i a hrilor;
23) Metode de realizare a coleciilor i a hrilor;
24) Metode de complectare i extragere a obiectelor din colecii i
hri;
25) Crearea interfeii programului;
26) Prezentarea lucrrii.

4. Exemplu de realizare:
import java.awt.Color;
import java.util.HashSet;
import java.util.Set;
public class JFrame extends
javax.swing.JFrame {
public JFrame() {
initComponents();
}
@SuppressWarnings("unchecked")
private void initComponents() {
jTextField1 = new
javax.swing.JTextField();
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
jLabel4 = new javax.swing.JLabel();
jButton1 = new
javax.swing.JButton();
jButton2 = new
javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowC
onstants.EXIT_ON_CLOSE);
jTextField1.setText("1 3 5 7");
jLabel1.setText("Introducei
Progresia Geometrica");
jLabel3.setText("Suma P.G.");
jLabel4.setText("Ratia P.G. ");
jButton1.setText("Calculeaz");
jButton1.addMouseListener(new
java.awt.event.MouseAdapter() {

public void
mouseClicked(java.awt.event.MouseEvent evt)
{
jButton1MouseClicked(evt);
} });
jButton2.setText("tergere");
jButton2.addMouseListener(new
java.awt.event.MouseAdapter() {
public void
mouseClicked(java.awt.event.MouseEvent evt)
{
jButton2MouseClicked(evt);
}});
javax.swing.GroupLayout layout =
new
javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(layout.createParal
lelGroup( javax.swing.GroupLayout.Alignment.
LEADING).addGroup( layout.createSequentialGr
oup().addGap(26, 26,
26).addGroup( layout.createParallelGroup(jav
ax.swing.GroupLayout.Alignment.LEADING,
false).addComponent(jLabel2,
javax.swing.GroupLayout.DEFAULT_SIZE, 296,
Short.MAX_VALUE)
.
addComponent(jLabel1).addComponent(jTextFiel
d1, javax.swing.GroupLayout.DEFAULT_SIZE,
296, Short.MAX_VALUE)
.
addGroup(layout.createSequentialGroup().addC
omponent(jButton1)
.addGap(18, 18, 18).addComponent(jButton2))
.addComponent(jLabel4,
javax.swing.GroupLayout.DEFAULT_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE)
.addComponent(jLabel3,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE))
.addContainerGap()) );
layout.setVerticalGroup(layout.createParalle
lGroup( javax.swing.GroupLayout.Alignment.LE
ADING)
.
addGroup(layout.createSequentialGroup().addG
ap(54, 54, 54)
.
addComponent(jLabel1).addPreferredGap( javax
.swing.LayoutStyle.ComponentPlacement.RELATE
D)
.addComponent(jTextField1,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE).addP
referredGap( javax.swing.LayoutStyle.Compone
ntPlacement.RELATED)
.
addComponent(jLabel2).addPreferredGap( javax
.swing.LayoutStyle.ComponentPlacement.RELATE
D)
.
addComponent(jLabel3).addPreferredGap( javax
.swing.LayoutStyle.ComponentPlacement.RELATE
D)
.addComponent(jLabel4).addGap(34, 34,
34).addGroup( layout.createParallelGroup(jav
ax.swing.GroupLayout.Alignment.BASELINE).add
Component(jButton1).addComponent(jButton2))
.addContainerGap(25, Short.MAX_VALUE)));

pack();
}
private void
jButton1MouseClicked(java.awt.event.MouseEve
nt evt) {
jTextField1.setBackground(Color.white);
jLabel3.setText("Suma P.G. :");
jLabel4.setText("Ratia P.G. :");
jLabel2.setText("");
Set s = new HashSet();
String str[] =
jTextField1.getText().split(" ");
for(int i=0;i<str.length;i++){
try {
s.add(Integer.parseInt(str[i]));
} catch (NumberFormatException
numberFormatException) {
jTextField1.setBackground(Color.red);
jLabel2.setText("Erorr , Nu ai
introdus caractere !");
}}
// scoatem sting-ul cu caractere
String stmp = ""+s.toString();
String tmp[] =
jTextField1.getText().split(" ");
if(tmp.length >=3){
if((Integer.parseInt(tmp[1])Integer.parseInt(tmp[0])
+Integer.parseInt(tmp[1])) ==
Integer.parseInt(tmp[2])){
jLabel3.setText("Suma P.G. :
"+s.hashCode());
jLabel4.setText("Ratia P.G. : "+
(Integer.parseInt(tmp[0])-

Integer.parseInt(tmp[1])
+Integer.parseInt(tmp[1])));
}
else{
jLabel2.setText("Nu este o progresie
geometrica");
jLabel3.setText("");
jLabel4.setText("");
}}}
private void
jButton2MouseClicked(java.awt.event.MouseEve
nt evt) {
jTextField1.setBackground(Color.white);
jTextField1.setText("");
jLabel3.setText("Suma P.G. :");
jLabel4.setText("Ratia P.G. :");
jLabel2.setText("");
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new
Runnable() {
public void run() {
new
JFrame().setVisible(true);
}});}
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JTextField
jTextField1;
}
Rezultatul realizrii programului:

5. Probleme propuse:
De realizat sarcinile utiliznd coleciile
1. Creai o clas Stack bazat pe colecii. Introducei o
secven de caractere i s l imprimai n ordine invers.
2. Creai o clas Queue bazat pe colecii. Introduce o serie de
iruri de caractere i stabili dac exist un ir-model n
aceast coad.
3. Defini o clas Set bazat colecii pentru un set de numere
ntregi, Creai metodele de determinare a uniunii i
interseciei de seturi .
4. Se introduc parametri - elemente ale vectorului. Construii
o matrice de tip double, pe baza de colecii. Extragei
valorile de elemente ale vectorului n form: Vector: 2.3
5.0 7.3.
5. Listele I (1. . N) i U (1. . N), conin rezultatele
msurtorilor de tensiune i curent pentru o rezisten
necunoscut R. Gsii numrul aproximativ a rezistenii R.
6. Efectuai o sumare n pereche pentru orice secven finit
de numere construite pe baza de colecii, dup cum
urmeaz: n prima etap, se adun perechi de numere, la a
doua etap, se sumeaz perechi de rezultate a primei etape
i a.m.d. pn cnd rmne un rezultat. Dac la sfritul

etapei rmne numr fr pereche, el trece n etapa


urmtoare.
7. Adunai dou polinoame de grad fix, n cazul n care
coeficienii
polinoamelor sunt stocate n obiectul
HashMap.
8. nmulii dou polinoame de grad fix, n cazul n care
coeficienii de polinoame sunt stocate n List.
9. Nu utilizai faciliti conexe, rearanjai elementele negative
ale listei la sfrit, dar cele pozitive la nceputul listei.
10. De apreciat progresia geometric pentru o mulime care se
pstreaz n Set.
11. De apreciat progresia aritmetic pentru un ir de numere,
care se pstreaz n List.
12. De apreciat numerele maximal i minimal a irului de
numere care se pstreaz n HashSet.

S-ar putea să vă placă și