Documente Academic
Documente Profesional
Documente Cultură
https://docs.oracle.com/javase/tutorial/java/javaOO/index.html
http://pages.cs.wisc.edu/~cs368-2/JavaTutorial/NOTES/Java-Classes.html
https://www.cs.utexas.edu/~scottm/cs307/codingSamples.htm
Atentie toate temele/aplicatiile se vor trimite la adresa: teme@infrasoft.ro
Tipuri de date
In Java tipurile de date se impart in doua categorii: tipuri primitive si tipuri
referinta.
Tipuri primitive
aritmetice
intregi: byte (1 octet), short (2), int (4), long (8)
reale: float (4 octeti), double (8)
caracter: char (2 octeti)
logic: boolean (true si false)
Tipuri de referinta
vectorii;
clasele;
interfetele;
Valoarea unei variabile de acest tip este o referinta (adresa de memorie).
Variabile
Variabilele pot fi de tip primitiv sau referinte la obiecte (tip referinta).
Declararea variabilelor: Tip numeVariabila;
Initializarea variabilelor: Tip numeVariabila = valoare;
Declararea constantelor: final Tip numeVariabila;
In functie de locul in care sunt declarate, variabilele se impart in urmatoatele
categorii:
Variabile membre, declarate in interiorul unei clase;
Parametri metodelor, vizibili doar in metoda respectiva;
Variabile locale, declarate intr-o metoda, vizibile doar in metoda respectiva.
Variabile locale, declarate intr-un bloc de cod, vizibile doar in blocul
respectiv.
Definirea claselor
- in Java este obligatorie definirea a cel putin unei clase (clasa de baza);
- nu este obligatorie crearea unei instante a clasei de baza, caz in care se vor
utiliza date si metode statice.
Sintaxa unei clase:
[modificator] class NumeClasa
{
Corpul clasei;
}
Modificatorii pot fi:
- public : poate fi folosita din orice alta clasa, indiferent de pachetul in care
se gaseste.
- abstract : este incomplet definita ; nu poate fi instantiata, fiind folosita
doar pentru a crea un model comun pentru o serie de subclase.
- final : nu se mai pot defini subclase.
Obs : daca modificatorul lipseste, clasa este implicita si poate fi folosita doar de
clasele care se afla in accelasi pachet.
Corpul unei clase contine:
Declararea si/sau initializarea variabilelor de instanta si de clasa (variabile
membre).
Declararea si implementarea constructorilor;
Declararea si implementarea metodelor de instanta si de clasa (metode
membre).
Declararea unor clase imbricate (interne).
Observatie : implementarea metodei unei clase trebuie sa se faca
obligatoriu in corpul clasei.
Declararea datelor membre
Variabilele membre ale unei clase se declara de obicei inaintea metodelor.
O variabila se declara astfel:
[modificatori] Tip numeVariabila [ = valoareInitiala ];
unde un modificator poate fi :
un modificator de acces : public, protected, private
unul din cuvintele rezervate: static, final;
Static: variabila este de clasa si nu de instanta;
static tip variabilaClasa;
Final: indica faptul ca valoarea variabilei nu mai poate fi schimbata
(declararea constantelor ).
final double PI = 3.14 ;
Exemplu simplu:
public class BicycleDemo {
public static void main(String[] args) {
// Creeaza doua obiecte de tip Bicycle
// Bicycle este tipul zonei de memorie
Bicycle bike1 = new Bicycle();
Bicycle bike2 = new Bicycle();
// bike1 numele instantei, new - operatorul de instantiere ,iar Bicycle(); este- constructor
implicit; se putea crea obiectul si: Bicycle bike1;
As fi putut face definirea si in urmatorul fel:
}
Constructorii unei clase
- sunt metode speciale care au aceelasi nume cu cel clasei, nu
returneza nici o valoare si sunt folosite pentru initializarea obiectelor clasei;
- o clasa poate avea mai multi constructori care trebuie sa difere prin lista
argumentelor;
- daca in clasa nu se declara nici un constructor, sistemul ii creaza automat
un constructor implicit.
Tipuri de constructori:
- fara argumente;
- cu argumente;
Declararea metodelor:
- Metodele sunt responsabile cu descrierea comportamentului unui obiect.
- Metodele se pot gasi doar in cadrul claselor.
O metoda se declara astfel:
[modificatori] TipReturnat numeMetoda ( [argumente] )
{// Corpul metodei}
unde un modificator poate fi :
un specificator de acces : public, protected, private .
unul din cuvintele rezervate: static, abstract, final.
Unde:
static : metoda este de clasa si nu de instanta;
abstract : metoda care nu are implementare si trebuie obligatoriu sa faca
parte dintr-o clasa abstracta;
final : metoda nu mai poate fi supradefinita in subclasele clasei in care a fost
definita.
Ciclul de viata al unui obiect
In limbajul Java argumentele sunt transmise doar prin valoare
- daca argumentul are tip primitiv de date, metoda nu ii poate schimba
valoare decat local;
- daca argumentul este de tip referinta, metoda nu poate modifica valoarea
referintei obiectului.
1. Crearea obiectelor
Crearea obiectelor se realizeaza prin instantierea unei clase si implica
urmatoarele lucruri:
Declararea
Presupune specificarea tipului acelui obiect, cu alte cuvinte specificarea
clasei acestuia
NumeClasa numeObiect;
Instantierea
Se realizeaza prin intermediul operatorului new si are ca efect crearea
efectiva a obiectului cu alocarea spatiului de memorie corespunzator.
numeObiect = new NumeClasa();
2. Folosirea obiectelor
Obiectul creat poate fi folosit in urmatoarele sensuri: aflarea unor informatii
despre obiect, schimbarea starii sale sau executarea unor actiuni.
obiect.NumeVariabila sau obiect.NumeMetoda(argument)
Operatorul . (punct) se numeste si operator de dereferentiere.
Aplicatie:
Fie pachetul Matematica ce contine clasele complex si dreptunghi
REZULTAT:
Extinderea claselor
- Java permite doar mostenirea simpla - o clasa poate avea un singur parinte
(superclasa).
- o clasa poate avea un numar nelimitat de subclase;
- radacina arborelui este clasa Object din pachetul java.lang
Sintaxa extinderii:
class clasa1 extends clasa2
unde clasa1 este subclasa si clasa2 este superclasa.
- relatia de derivare a claselor este tranzitiva.
class C1{int x;}
class C2 extends C1{int y;}
C1 este clasa derivata din clasa Object si este supercalasa pentru clasa C2.
Clasa C2 este subclasa directa a clasei C1 si subclasa indirecta a clasei
Object.
Clasa Object
- in limbajul Java, clasa Object este superclasa pentru toate clasele.
Clasa Object defineste si implementeaza comportamentul comun al tuturor
celorlalte clase Java prin metode specifice:
returnarea clasei din care face parte un obiectul curent:
getclass( )
reprezentarea obiectiului curent intr-un String:
toString( )
exemplu:
class Curs_2 {
public static void main(String args[])
{
String ob="abc";
System.out.println(ob.getClass());
System.out.println(ob.getClass().getClass());
}
}
Constructorii subclaselor
Instantierea unui obiect din clasa extinsa implica instantierea unui obiect din clasa
parinte.
Fiecare constructor al subuclasei trebuie sa aiba un constructor cu aceeasi
signatura in parinte sau sa apeleze explicit un constructor al clasei extinse.
Apelul explicit al unui constructor din superclasa se realizeaza cu expresia:
super([argumente])
Polimorfism
supraincarcarea (overloading) : in cadrul unei clase pot exista metode cu
acelasi nume cu conditia ca signaturile lor sa fie diferite.
supradefinirea (overriding): o subclasa poate rescrie o metoda a clasei parinte
prin implementarea unei metode cu acelasi nume si aceeasi signatura ca ale
superclasei.
Observatii:
- o metoda supradefinita poate sa ignore codul din superclasa sau poate sa il
extinda prin expresia super.
- o metoda nu poate supradefini o metoda declarata final in clasa parinte.
- in Java nu este posibila supraincarcarea operatorilor.
Modificatorii de aces
- o subclasa mosteneste de la parintele sau toate variabilele si metodele care nu
sunt private.
//import java.util.Scanner;
//clasa Test_punct
Tablouri
- tabloul este un obiect creat dinamic care poate fi assignat variabilelor de tip
Object;
- toate elementele unui tablou au aceelasi tip;
Declararea vectorului
Se realizeaza prin expresii de forma:
Tip[] numeVector;
Tip numeVector[];
Exemplu:
int[] intregi;
String adrese[];
- delararea unui tablou nu creaza obiectul tablou si nici nu aloca spatiu de memorie
pentru componente;
Instantierea unui tablou
Operatia de alocare a memoriei se realizeaza prin intermediul operatorului
new
numeVector = new Tip[nrElemente];
- in urma instantierii vor fi alocati:
nrElemente * dimensiune(Tip) octeti necesari pentru memorarea
elementelor din vector;
v = new int[10];
//aloca spatiu pentru 10 intregi: 40 octeti
c = new char[10];
//aloca spatiu pentru 10 caractere: 20 octeti
Intializarea (optional)
- dupa declararea unui vector, acesta poate fi initializat, caz in care nu mai
este instantiat (alocarea memoriei se realizeaza automat).
String culori[] = {"Rosu", "Galben", "Verde"};
int []factorial = {1, 1, 2, 6, 24, 120};
Tabluri mutidimensionali
- tablourile multidimensionale sunt vectori de vectori;
Tip matrice[][] = new Tip[nrLinii][nrColoane];
- matrice[i] este linia i din matrice si reprezinta un vector cu nrColoane
elemente.
Operatii asupra unui tablou
- dimeniunea unui tablou se poate calcula cu ajutorul variabilei length.
int []a = new int[5];
// a.length are valoarea 5
int m[][] = new int[5][10];
// m[0].length are valoarea 10
- copierea unui vector se poate realiza fie element cu element, fie cu
ajutorul metodei System.arraycopy
int a[] = {1, 2, 3, 4};
int b[] = new int[4];
for(int i=0; i<a.length; i++)
b[i] = a[i];
Echivalent cu : System.arraycopy(a, 0, b, 0, a.length);
Clasa java.util.Arrays ofera metode utile pentru prelucrarea unui vector cum ar
fi:
sort - sorteaza ascendent un vector, folosind un algoritm de tip Quick-Sort
performant, de complexitate O(n log(n)).
int v[]={3, 1, 4, 2};
java.util.Arrays.sort(v);
// Sorteaza vectorul v
// Acesta va deveni {1, 2, 3, 4}
binarySearch - cautarea binara a unei anumite valori intr-un vector sortat;
equals - testarea egalitatii valorilor a doi vectori.
Exemplu
Siruri de caractere
In Java, un sir de caractere poate fi reprezentat astfel:
-printr-un vector format din elemente de tip char;
-un obiect de tip String;
-un obiect de tip StringBuffer
Exemple echivalente de declarare a unui sir:
String s = "abc";
String s = new String("abc");
char data[] = {a, b, c};
Obiecte de tip String
3. Constructor utilizat pentru alocarea unui nou String care contine aceeasi
secventa de caractere care este stocata intr-un alt sir.
public String(String <sirOriginal>)
Exemplu:
Clasa StringBuffer
- prelucreaza siruri de caractere de lungime variabila;
- o instanta a clasei StringBuffer reprezinta un String care poate fi
modificat dinamic;
- un obiect de tip StringBuffer contine un bloc de memorie numit buffer
care poate sa contina un sir, dar nu este obligatoriu sa fie ocupat in totalitate;
- crearea unui obiect de tip StringBuffer se realizeaza apleland unul din
costructorii:
StringBuffer( ); //un sir cu capacitatea de 16 caractere
StringBuffer(int capacitate);
StringBuffer(String sir)
Exemplu : StringBuffer a = new StringBuffer(Un sir de tip buffer);
Metode publice din clasa StrindBuffer
int capacty();
StringBuffer delete(int start, int end);
StringBuffer replace(int start, int end, String sir);
int length();
String substring(int start);
Conversie de date
- conversia unui tip de date byte, short, int, float, double, char, boolean la un sir
de caractere se realizeaza cu metoda statica toString() .
- conversia unui sir de caractere String la un tip de data primitiva se realizeaza cu
metoda:
tip.parseTip(String sir);
Exemplu: int.parseInt(sir);
double.parseDouble(sir).
Exemplu
- poate avea specificatorul public caz in care poate fi extinsa de orice clasa
din afara pachetului;
- poate contine date membre la care se adauga declaratii de metode
neimplementate.
- clasa care extinde o clasa abstracta trebuie sa implementeze metodele
neimplementate din clasa abstracta.
- daca o clasa nu implementeaza metodele neimplementate este deasemenea
abstracta si nu poate fi instantiata.
Metode abstracte
Metodele fara nici o implementare se numesc metode abstracte si pot fi incluse
doar in clase abstracte.
In fata unei metode abstracte trebuie sa apara obligatoriu cuvantul cheie
abstract, altfel va fi furnizata o eroare de compilare.
abstract class ClasaAbstracta {
abstract void metodaAbstracta(); // Corect
void metoda(); // Eroare}
OBSERVATII
O clasa abstracta poate sa nu aiba nici o metoda abstracta.
Orice clasa care are o metoda abstracta trebuie declarata ca fiind abstracta.
Platforma de lucru Java cuprinde numeroase exemple de ierarhii care
folosesc la nivelele superioare clase abstracte:
Number: superclasa abstracta a tipurilor referinta numerice;
Reader, Writer: superclasele abstracte ale fluxurilor de intrare/iesire pe
caractere;
InputStream, OutputStream: superclasele abstracte ale fluxurilor de
intrare/iesire pe octeti;
AbstractList, AbstractSet, AbstractMap: superclase abstracte pentru
structuri de date de tip colectie.
Aplicatie complexa
package clase;
public abstract class fig_geo
{
String nume;
public fig_geo(String nume)
{
this.nume=nume; }
public abstract double arie();
@Override
public String toString()
{
return nume + " " + arie();
} }
package clase;
public class cerc extends fig_geo
{
double raza;
public cerc(double raza)
{
super("Cerc");
this.raza=raza;
}
@Override
public double arie()
{
return Math.PI*raza*raza;
}
package clase;
public class dreptunghi extends fig_geo
{
double L,l;
public dreptunghi(double L,double l)
{
super("Dreptunghi");
this.L=L;
this.l=l;
}
public double arie()
{
return L*l;
}
}
import java.util.Scanner;
import clase.*;
public class Test_clase_extends
{
static Scanner in=new Scanner(System.in);
static int n;
public static void main(String args[])
{
System.out.print("Cate figuri doresti sa introduci?: ");
n=in.nextInt();
fig_geo elem[]=new fig_geo[n];
for(int i=0;i<n;i++)
elem[i]=citire();
for(int i=0;i<n;i++)
System.out.println(elem[i]);
}
public static fig_geo citire() //metoda care intoarce obiectul grafic citit de la tastatura
{
String nume;
double raza,L,l;
System.out.print("Apasa 'c' pentru a defini un cerc si 'd' pentru a defini un dreptunghi:
");
do
{
nume=in.nextLine();
}
while(nume.length()==0);
switch(nume.charAt(0))
{
case 'c':
System.out.println("Cerc ");
System.out.println("Raza: ");
raza=in.nextDouble();
return new cerc(raza);
case 'd':
System.out.println("Dreptunghi");
System.out.println("Lungime:");
L=in.nextDouble();
System.out.println("Latime:");
l=in.nextDouble();
return new dreptunghi(L,l);
default:
System.out.println("Eroare obiect nul");
return new cerc(0.0);
}
}
}
Interfete
Interfetele permit, alaturi de clase, definirea unor noi tipuri de date.
O interfata Java este o colectie de constante si metode fara
implementare.
EXCEPTII