Documente Academic
Documente Profesional
Documente Cultură
Indrumar POO
Indrumar POO
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
}}
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 clase Interfee. Aceste clase contin
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.
De exemplu, clasa MouseMotionAdapter are dou metode:
mouseDragged() i mouseMoved(). Esenta 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 mouse-ului se realizeaza prin
aplicarea metodei mouseMove(). Pentru a crea o interfa grafic
trebui s fie indicat un loc (fereastr), n care aceasta va fi afiat.
Fereastra este un container care creaza o interfa cu utilizatorul.
Contextul grafic este incapsulat n clas i este disponibil n dou
moduri:
prin activarea metodelor paint(), update();
prin valoarea returnata 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 fereastrei. 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
foloseste 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
ignoreaz. Dac este evenimentul ateptat, programul incepe
procesul de realizare a activitii sale. Clasa abstract
WindowAdapter este utilizat pentru primirea i prelucrarea
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;
{
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
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();
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++)
{
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:
}
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;
b1.add(user);
b1.add(dat);
b1.add(but);
left.add(b1);
this.add(left,BorderLayout.WEST);
center = new JPanel();
com = new
JTextArea(ts.comments(),20,20);
center.add(com);
center.setBackground(Color.red);
this.add(center,BorderLayout.CENTER);
right = new JPanel();
history = new
JTextArea(ts.getAnnotation(),20,20);
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 {
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.
3.
4.
5.
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;
}
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" : "");
}
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.
Complex ComplexArray.
6.
Complex ComplexFraction.
7.
Polynom ComplexPolynom.
8.
Polynom FractionPolynom.
8.
Polinom <- PoliniomArray
9.
Array <-ComplexArray
10.
Array<-FractionArray
11.
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.
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.WindowConstants.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));
MouseEvent 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("Verificati 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 ati introdus numar !");
} }
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;
}}
Reyultatul realizrii progeamului:
5. Probleme propuse:
De realizat variantele date folosind exceptiele.
1. Sa se citeasca cite un rind 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 comlecteze dou stive , i s se schimbe
informaia intre stive cu locul.
5. Definii clasa Stack. ntroducei o secven de caractere i
afisa-o n ordine invers
6. Creati o clasa Queue. Introduce o serie de siruri de
caractere, s se verifece daca string-ul dat este unic in
coad.
7. Folosind clasa Set, pentru un ir de numere ntregi s se
creeze metode care determin concatinarea i intersecia
multimii.
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
ramin 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 cunt coordonatele textului, ncepnd cu
colul de sus din stnga a appletului.
Applet-ul nu are nevoie de o metod main () codul de
rulare pote 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>
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: exstragerea n ferestr 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>
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 fonturi, se poate de determinat
care dintre ele sunt disponibile i pot fi utilizate. Pentru a obine
aceast
informaie,
se
foloseste
metoda
getAvailableFontFamilyNames()
din
clasa
GraphicsEnvironment. Metoda returneaza un array de siruri de
caractere care conine numele de fonturi disponibile.
/ * Exemplu # 8: acces la fonturile 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 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);
repaint();
}}}
Rezultatul realizrii programului:
5. Probleme propuse:
Pentru toate variantele de criat 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 parti ale appletului, 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 roteste 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 roteste n
planul ecranului n jurul punctului, care se deplaseaz de-a
lungul segmentului.
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 colectie;
terge elementul din colecie.
Coleciile sunt unite ntr-o bibliotec de clase java.util, i
reprezinta containere pentru depozitarea i manipularea obiectelor.
Colectii - sunt tablouri dinamice, liste legate, arbori, seturi, 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 colectiei.
Clasele coleciilor:
Collection vrful ierarhiei a claselor;
List extinderea colectiei pentru prelucrare listei;
"schimbul elementului");
a.remove(6); //tergerea elementului
System.out.println(a +
"este ters al 6-lea element");
System.out.println("colecia e pustie: "
+ a.isEmpty());
}}
Colectia LinkedList pune n aplicare o list nlnuit. n
contrast cu matricea, care stocheaz obiectele din locaiile de
memorie consecutive, lista legat pastreaza 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
realizeaza 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 : adaugarea si stergerea
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
indecele
curent //list.remove();
while(list.hasNext())
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.txt"));
//La sfritul fiierului trebie 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.
it.remove();
}
//dup tergere
System.out.println(set + "delete");
//exstragerea elementului maximali
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 elementul poate fi gsit i scos din mulime.
7.4. Hri Map
Harta Map - este un obiect care deine o pereche de cheievaloare. Cautarea 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 realizeaza interfaa Map;
HashMap extinde AbstractMap,utilizind hash-tabel, n
care cheile sunt ordonate n dependen de valorile codurilor
hash;
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 realizriit:
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 primeste drepturi de acces.
Clasa WeakHashMap permite mecanizmului de distrugere a
obiectelor de a stergere din hart valoarea dupa 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, pina acum inca se
folesesc colectiile 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.*;
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
parametrizate : */
import java.util.*;
crearea
coleciei
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 interfata Queue:
public interface Queue < E > extends
Collection < E >
Metodele interfetei Queue:
Eelement() returneaz, dar nu elimina elemental 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 elemental din capul
cozii, returneaz null, n cazul n care coada este goal;
E poll() ntoarce i elimin elemental din capul cozii,
returneaz null, n cazul n care coada este goal;
E remove() - retuneaz 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:
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("Introduceti
Prograsia Geometrica");
jLabel3.setText("Suma P.G.");
jLabel4.setText("Ratia P.G. ");
jButton1.setText("Calculeaza");
jButton1.addMouseListener(new
java.awt.event.MouseAdapter() {
public void
mouseClicked(java.awt.event.MouseEvent evt)
{
jButton1MouseClicked(evt);
} });
jButton2.setText("Stergere");
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. :");
}}}
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
siruri 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
intersectiei de seturi .
4. Construii o matrice de tip double, pe baza de colectii.
Extragei elementele 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 colectii, 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.