Sunteți pe pagina 1din 23

PROGRAMARE JAVA

Curs 3

Definirea claselor in Java

Clasele Java pot avea diferite niveluri de accesibilitate fa de alte


clase:

public (accesibil pentru orice alt clas)


private (inaccesibil pentru orice alt clas)
protected (accesibil pentru subclase)
package (implicit) ( accesibil pentru clase din acelai pachet de
clase)

Clasele din biblioteca Java sunt publice i fiecare este


definit ntr-un fiier separat de celelalte clase; numele
clasei este acelai cu numele fiierului.
O clas (neabstract) poate conine: numai metode statice,
numai date, date i metode nestatice (Object methods),
date, metode statice i nestatice.

Metode statice

Notiunea de funcie se folosete n Java pentru ambele


categorii de funcii dintr-o clas Java:

Metode statice sau nestatice (cu nume diferit de numele clasei)


Constructori de obiecte (cu acelai nume ca i clasa)

Se folosesc rar: funcii cu date i rezultate de un tip primitiv,


funcii recursive, .a. Utilizarea excesiv a acestora este specific
programrii procedurale.
Sunt precedate de cuvntul static i au alt mod de utilizare
dect metodele aplicabile obiectelor.
Utilizarea lor nu este condiionat de existena unor obiecte.
Se mai numesc i metode ale claselor (Class Methods) n contrast
cu metodele nestatice (ale obiectelor).

Metode statice

Sunt apelate fr a crea obiecte dar folosind numele clasei


naintea numelui metodei.
Metoda main trebuie s fie o metod static

class Sqrt
{
public static void main (String args[ ])
{
int x = Integer.parseInt (args[0]); // functie statica din
// clasa Integer
double r = Math.sqrt (x); // functie statica din clasa Math
System.out.println (r);
}
}

Metode ale obiectelor

Utilizarea de clase cu date i metode nestatice este specific


programrii orientate pe obiecte
Metodele obiectelor sunt n general publice i pot fi clasificate
astfel:

Metode de acces la datele ncapsulate n clas (get, set)


Metode motenite de la clasa Object i suprascrise
Metode specifice clasei respective.

Ex: class CComplex conine:

Date private
Metod public de access la date
Metode specifice
Metode motenite

public class CComplex{


private int re, im;
public CComplex(int re, int im){
this.re = re;
this.im = im;
}
public CComplex(){
re = 0;
im = 0;
}
public void Add(CComplex c){
re = re + c.re;
im = im + c.im;
}
public void Sub(CComplex c){
re = re - c.re;
im = im - c.im;
}
public String ToString(){
return "("+re+"+i"+im+")";
}
}

Metode ale obiectelor

Toate clasele Java extind clasa Object i redefinesc cteva


metode motenite de la clasa Object: toString(),
equals()
public class Complex extends Object {
... // date si constructori
// redefinire metoda mostenita
public String toString () {
StringBuffer sb = new StringBuffer ();
sb.append(re);
if(im>0)
sb.append('+');
else {
sb.append('-');
im =-im;
}
return sb.append(im).toString();
}
... // alte metode
}

Metode ale obiectelor

O funcie nu poate transmite n afar adresa unui obiect


creat n funcie printr-un parametru referin.

// metoda statica pentru trecere sir in litere mari - gresit !!!


static void toUpper (String t)
{
t = t.toUpperCase(); // se creeaza un nou obiect, cu alta adresa
}
O funcie poate modifica un obiect a crui adres o primete

ca argument numai dac n clasa respectiv exist metode


pentru modificarea obiectelor.

static String toUpper (String s) { return s.toUpperCase(); }

Clasele String, Integer, Float .a. nu conin metode


pentru modificarea datelor din aceste clase, deci o funcie
care primete o referin la un astfel de obiect nu poate
modifica acel obiect. n acest fel se protejeaz obiectul
transmis ca argument fa de modificarea sa nedorit de
ctre funcia care l folosete.

Metode ale obiectelor

Obiectele din clase fr metode de modificare a datelor


(read-only) se numesc obiecte nemodificabile (immutable
objects).
Pentru o scriere mai compact se practic uneori
nlnuirea de metode (method chaining), adic aplicarea
unei metode asupra rezultatului unei alte metode, ntr-o
aceeai expresie.

// citeste linie, elimina spatii si trece in litere mari


import java.io.BufferedReader;import java.io.InputStreamReader;
import java.io.IOException;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)
try
{
String line = br.readLine().trim().toUpperCase();
System.out.println(line);
}catch (IOException e) {
e.printStackTrace();
}

Obiecte java

Toate obiectele sunt create dinamic, folosind operatorul new,


care apeleaz implicit constructorul clasei pentru
iniializarea variabilelor din obiectul creat.
Variabilele de un tip clas conin referine (pointeri) la
obiecte, n timp ce variabilele de un tip primitiv (int,
double, char) conin valori.
Efectul atribuirii ntre variabile referin este copierea unei
adrese i nu copierea unui obiect;
Folosirea operatorului de comparaie == ntre variabile
referin va compara adrese i nu obiecte;
Comparaia la egalitate ntre obiecte se face cu metoda
equals() care exist n orice clas (motenit de la clasa
Object i redefinit).

this

Are dou utilizri n Java:

ca variabil referin implicit care se refer la obiectul curent i


este folosit n metode nestatice
ca nume de constructor.

Este folosit ca variabil referin n diferite situaii:

pentru a deosebi variabilele clasei de argumente cu acelai nume:


public MyVector ( int nmax) { this.nmax=nmax; n=0; }

pentru a explicita c este vorba despre metode sau variabile din


aceeai clas sau din acelai obiect:
public int size () { return this.n;} // din clasa MyVector

Atunci cnd rezultatul metodei este chiar obiectul pentru care s-a apelat
metoda

this

Un constructor se poate referi la alt constructor din aceeai


clas numai folosind this i nu prin numele sau.
public class MyVector
{
private Object a[]; // adresa vector
private int n, nmax; // dimensiune si capacitate vector
public MyVector (int m) // un constructor
{
nmax=m; n=0;
a= new Object[m]; // aloca memorie
}
// alt constructor
public MyVector () { this (10); } // capacitate implicita 10
.
}

iruri de caractere n Java

n Java un ir este un obiect din clasa String sau din


clasele StringBuffer, StringBuilder, iar operaiile cu
iruri se realizeaz prin apeluri de metode din aceste clase.
Constantele ir, ntre ghilimele, sunt obiecte nemodificabile
de tip String.
Clasa String este o clas read-only i final, deci nu se
poate extinde cu metode de modificare a vectorului de
caractere coninut n fiecare obiect.
Ex: metoda replaceAll() din clasa String pentru nlocuirea
unui subir s1 cu un alt subir s2 n irul s:
s.replaceAll (s1,s2);

Siruri de caractere n Java

Metodele replaceAll() i replace() au ca rezultat un


nou ir obinut dup substituire i nu modific obiectul
pentru care se apeleaz; de aceea utilizarea corect este
urmtoarea:
s = s.replaceAll (s1,s2);

Clasele StringBuffer i StringBuilder sunt variante ale


clasei String care conin n plus i metode pentru modificarea
obiectului (irului).
Ex: metode care modific irul coninut ntr-un obiect de tip
StringBuffer: append, insert, delete, setCharAt,
setLength.
Un obiect de tipul StringBuffer transmis unei funcii ca
argument poate fi modificat de ctre funcie.
static void toUpper (StringBuffer s) {
String str = new String (s);
s.replace (0,str.length(),str.toUpperCase());
}

Concatenarea de iruri

Intr-o expresie cu operatorul binar +, dac unul din operanzi


este de tip String, atunci compilatorul Java face automat
conversia celuilalt operand la tipul String (pentru orice tip
primitiv i pentru orice tip clas care redefinete metoda
toString)
O instruciune de forma a = a + b; cu a i b de tip
String este tratat de compilator astfel: se transform
obiectele a i b n obiecte de tip StringBuilder, se
apeleaz metoda append() i apoi creeaz un obiect String
din obiectul StringBuilder rezultat din concatenare:

String a = unu, b = doi;


StringBuffer am = new StringBuffer (a), bm = new StringBuffer (b);
am.append(bm);
a = new String (am);

Concatenarea de iruri

Din punct de vedere al timpului este de preferat utilizarea


metodei append() din clasa StringBuilder.

public static String arrayToString ( int a[ ]) { // creare sir cu


//continutul unui vector
StringBuilder aux = new StringBuilder ([);
int n =a.length;
for (int i=0;i<n-1;i++)
aux.append (a[i] + ,);
return new String (aux.append (a[n-1] +]) ) ;
}

Trecerea de la tipul String la tipul StringBuffer se


poate face numai printr-un constructor, dar trecerea invers
se poate face prin metoda toString(), iar aceste
transformri pot fi necesare pentru c n clasa
StringBuffer nu se regsesc toate metodele din clasa
String.

Metoda toString() exist n toate clasele i produce un ir


cu datele din obiectul pentru care se apeleaz (face
conversia de la tipul datelor din obiect la tipul String).
Orice tip de obiect se poate transforma ntr-un ir String
prin metoda toString(), apelat explicit sau implicit, dar
nu i prin cast.

Float x = new Float(3.14); String s = (String)x; //eroare la compilare


String s1 =x.toString();
String s2 = x+; // apel implicit toString
Pentru extragerea de cuvinte (tokens) dintr-un text se folosesc

fie clasele Scanner, StringTokenizer i StreamTokenizer,


fie clasele pentru lucrul cu expresii regulate: Pattern, Matcher
Imprirea unui text n cuvinte se poate face folosind clasele
Pattern, Matcher sau cu metoda split() din clasa
String, care creeaz un vector de cuvinte: String[]
split ( )

Operaii de citire scriere n Java

Afiarea pe ecran i scrierea n fiiere text a oricrui tip de


date se face simplu folosind metodele print() i
println() din clasele PrintStream sau PrintWriter.
Aceste metode pot primi un singur argument de orice tip
primitiv sau de tipul generic Object i realizeaz automat
conversia numerelor din format intern n format extern (n ir
de caractere).
Variabila System.out, de tip PrintStream, desemneaz
ecranul i este folosit pentru afiarea n mod text (nu i
ntr-o interfa grafic).
Pentru citire de numere de la consol, cu conversie din
format extern n format intern, se poate folosi clasa
Scanner.

public static void main (String arg[])


{
float sum=0;
Scanner sc = new Scanner (System.in);
while ( sc.hasNextFloat())
{
sum += sc.nextFloat();
}
System.out.println(sum);
}

In general, un fiier text este identificat sau prin numele su


(de tip String) sau prin calea complet la fiier (obiect de
tip java.io.File).
Clasele de I/E pentru operaii cu fiiere disc au constructori
cu argument String i cu argument File pentru numele
fiierului disc cu care lucreaz

Clasele din pachetul java.io pot fi grupate astfel:

Clasa RandomAccessFile, pentru operaii de citire i/sau de scriere cu


acces secvenial i direct
Clasele din familiile InputStream si OutputStream, pentru operaii
de citire octei i respectiv de scriere octei (dar nu citire i scriere n
acelai fiier)
Clasele din familiile Reader si Writer, pentru operaii de citire
caractere i respectiv de scriere caractere (dar nu citire i scriere n
acelai fiier).

Pentru a scrie numere ntr-un fiier text pe disc se creeaz


mai nti un obiect FileInputStream sau FileWriter i
apoi se creeaz obiectul PrintStream sau PrintWriter.

PrintStream ps = new PrintStream(new FileOutputStream("numere.txt"));


for (int x=1; x<100;x++)
ps.print (x+" "); // cu spatii intre numere
ps.close();

Exist i un corespondent al funciei sprintf() din


limbajul C sub forma metodei format() din clasele String
si java.util.Formatter, cu o utilizare asemntoare
funciei sprintf().
Pentru scrierea de iruri n fiiere text se poate utiliza direct
metoda write() din clasa FileWriter, dar pentru a scrie
linii de text trebuie adugat explicit caracterul \n.
FileWriter fw = new FileWriter("t.txt");
for (int i=1;i<21;i++)
fw.write (i+" "); // conversie din int in
// String si spatii intre numere
fw.close();

Citirea de linii de la tastatur sau dintr-un fiier text se poate


face cu metoda readLine() din clasa BufferedReader
sau din DataInputStream, pentru citire din fiiere text
formate din linii.
Ex. citire din fisier

String line, fname; // linie de text si nume fisier


BufferedReader br = new BufferedReader (new FileReader(fname));
while ( (line = br.readLine()) != null) // rezultat null la
// sfrsit de fisier
System.out.println (line);

Ex. citire de la tastatur:


String line;
DataInputStream cin = new DataInputStream (System.in);
while ( (line = cin.readLine()) != null)
System.out.println (line);

Pentru citire de numere de la consol trebuie extrase din


linia citit irurile de cifre i fcut conversia din format
extern n format intern (binar) folosind metode statice ca
Double.parseDouble(String s)
Integer.parseInt(String s),
Float.parseFloat(String s).

float x,sum=0; String line, words[];


DataInputStream cin = new DataInputStream (System.in);
while ( (line = cin.readLine()) != null)
{
words=line.split(" ");
for (int i=0;i<words.length;i++)
if ( ! words[i].isEmpty())
{
x=Float.parseFloat(s);
sum += x;
}
}

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