Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
o Conditional OR
o Ternary operator
Operator Symbol
Conditional or Logical OR ||
Ternary Operator ?:
The meaning of ternary is composed of three parts. The ternary operator (? :) consists of three
operands. It is used to evaluate Boolean expressions.
variable = (condition) ? expression1 : expression2
The above statement states that if the condition returns true, expression1 gets executed, else the
expression2 gets executed and the final result stored in a variable.
9. Operatori la nivel de bit în limbajul de programare Java, prioritatea operațiilor, utilizarea
parantezelor pentru a modifica ordinea de efectuare a lor (1)
Operatorii pe biţi acţionează asupra biţilor valorilor întregi (int şi long).
Operator Nume Descriere
a&b și 1 dacă ambii biţi au valoarea 1.
a|b sau 1 dacă cel puţin un bit are valoarea 1.
a^b sau exclusiv 1 dacă biţii au valori diferite.
~a complement Inversează valoarea biţilor.
n << p deplasare Deplasează biţii lui n la stânga cu p poziţii.
stânga fără
semn
n >> p deplasare Deplasează biţii lui n la dreapta cu p poziţii.
dreapta cu
semn
Evaluarea operatorilor în Java are loc conform priorității operatorului, adică evaluarea are loc
începând cu operatorii cu prioritate mai mare și este urmată de operatorii cu prioritate relativ mai
mică.
! when you initially declare a two-dimensional array, you must remember to specify the first
dimension
b) initializand direct conținutul tabloului
Ex: pentru declarea si alocarea zonei de memorie pentru un tablou bidimensional cu numele b de tip
int cu doua linii si trei coloane se foloseste instructiunea:
int b[][]={{1, 2, 3}, {7, 8, 9}};
Pentru eliberarea memoriei ocupate de un tablou, este suficient sa anulam toate referintele catre
tablou.
15. Tablouri bidimensionale pătratice, tablouri bidimensionale în care fiecare rând are
număr diferit de coloane
Un tablou pătratic este o matrice care are numarul de linii egal cu numarul de coloane. Matricele
patratice sunt un caz aparte al matricelor oarecare doarece in cazul acestora apar doua diagonale.
Una din aceste diagonale se numeste diagonala principala, iar cealalta diagonala secundara.
Pentru a identifica elementele acestore diagonale, putem folosi următoarele progame:
- Elementele diagonalei principale:
static void printPrincipalDiagonal(int mat[][], int n)
{ System.out.print("Principal Diagonal: ");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// Condition for principal diagonal
if (i == j) {
System.out.print(mat[i][j] + ", "); }}}
System.out.println(""); }
- Elementele diagonalei secundare:
static void printSecondaryDiagonal(int mat[][], int n) {
System.out.print("Secondary Diagonal: ");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// Condition for secondary diagonal
if ((i + j) == (n - 1)) {
System.out.print(mat[i][j] + ", "); } } }
System.out.println(""); }
Tablourile bidimensionale pot avea un număr de rînduri/coloane diferite. Pentru acest tip de tablouri
e relevantă metoda de calculare a lungimii rîndului/coloanei:
Numarul de linii care poate fi stocat într-un tablou bidimensional, este permanent retinut in variabila
<nume_tablou>.length
Numarul de coloane ale fiecarei linii (i) este permament retinut in variabila <nume_tablou>[i].length
Accesarea unui element al tabloului bidimensional se face prin următoare instrucțiune:
<nume_tablou> [<indice_linie>] [<indice_coloana] (ex: int a[4][3];)
16. Prelucrarea tablourilor bidimensionale în limbajul de programare Java (determinarea
sumei/ produsului, elementului maxim/ minim, parcurgerea, etc.)
Prelucratea tablourilor bidimensionale se efectuiază prin folosirea proprietășilor și a metodelor
specifice tablourilor, în dependența de rezultatul care trebuie să fie obținutt.
- Determinarea sumei elementelor unui tablou bidimensional:
public static int suma(int[][] array) {
int suma1 = 0;
for (int row=0; row < array.length; ++row) {
for(int col=0; col<array[row].length; ++col) {
suma1 = suma1 + array[row][col]; }
} return sum1; }
- Determinarea produsului elementelor unui tablou:
public static int produs(int[][] array) {
int produs1 = 1;
for (int row=0; row < array.length; ++row) {
for(int col=0; col<array[row].length; ++col) {
produs1= produs1 * array[row][col]; }
} return sum1; }
- Determinarea elementului minim
min = matrix[3][2];
for(int i=0; i<numRows; i++) {
for(int j=0; j<numCols; j++) {
if(matrix[i][j] < min)
min = matrix[i][j]; } }
Parcurgerea presupune accesarea elementelor ale tabloului, într-o anumită ordine – de regulă
aceasta se face pe linii, de sus în jos și de la stânga la dreapta:
int n, m, a[100][100]; ...
for(int i = 0 ; i < n ; i ++) {
// linia i
for(int j = 0 ; j < m ; j ++)
// a[i][j] // … }
17. Tablouri multidimensionale (tridimensionale ș.a.) în limbajul de programare Java
Tablourile multidimensionale sunt vectori de tablouri și au următpare structură:
tip tablou[][][] = new tip[dim1][dim2][dim3];
De exemplu, arr[i][j][k] este echivalent cu ((arr[i])[j])[k]. Respectiv, arr este o matrice, de matrice,
de matrice.
In a 3d array, the three dimensions are interpreted as:
- number of arrays: the first dimension indicates how many arrays a 3d array will have
- number of rows: the second dimension signifies the total number of rows an array will have
- number of columns: the third dimension indicates the total columns in the 3d array
Declaraţie:
int[][][] threeDimArr = new int[4][5][6];
sau, cu inițializare:
int[][][] threeDimArr = { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7,
8 } } };
Acces:
int x = threeDimArr[1][0][1];
sau
int[][] row = threeDimArr[1];
18. Proprietatea „length”, forma specială a ciclului „for” pentru tablouri (similar for-each
din alte limbaje).
The array length is the number of elements that an array can holds. We can find the array length by
using the array attribute “length”. We use this attribute with the array name:
int lungime= matrice.length;
Length size implies the total number of elements that an array can contain. The “length” property
can be invoked by using the dot (.) operator followed by the array name. We can find the length of
int[], double[], String[], etc:
int[] arr=new int[5];
int arrayLength=arr.length
In the above code snippet, arr is an array of type int that can hold 5 elements. The “arrayLength” is a
variable that stores the length of an array. To find the length of the array, we have used array name
(arr) followed by the dot operator and “length” attribute, respectively. It determines the size of the
array.
Important: “length” attribute determines the maximum number of elements that the array can
contain or the capacity of the array. It does not count the elements that are inserted into the array.
That is, length returns the total size of the array. For arrays whose elements are initialized at the time
of its creation, length and size are the same.
Speaking about the logical size, array index will always be less than the actual size by 1 (int
arrayLength=arr.length-1), because the array index starts from 0.
Atributul length poate fi utilizat pentru a căuta o anumită valoare în matrice sau pentru a căuta
valorile minime / maxime.
19. Sortarea tablourilor în limbajul de programare Java
The sorting is a way to arrange elements of a list or array in a certain order (ascending or
descending)
For sorting an array in an ascending order, we may use the “sort()” method
sort() - it is a static method that parses an array as a parameter and does not return anything. We can
invoke it directly using the class name. It accepts an array of type int, float, double, long, char, byte.
Example:
import java.util.Arrays;
public class SortArrayExample1 {
public static void main(String[] args) {
//defining an array of integer type
int [] array = new int [] {90, 23, 5, 109, 12, 22, 67, 34};
//invoking sort() method of the Arrays class
Arrays.sort(array);
System.out.println("Elements of array sorted in ascending order:
");
//prints array using the for loop
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]); } } }
For sorting an array in an descending order, we may use “reverseOrder()” method. It does not parse
any parameter. It returns a comparator that imposes the reverse of the ascending ordering.
Example:
import java.util.Arrays;
import java.util.Collections;
public class SortArrayExample4 {
public static void main(String[] args) {
Integer [] array = {23, -9, 78, 102, 4, 0, -1, 11, 6, 110, 205};
// sorts array[] in descending order
Arrays.sort(array, Collections.reverseOrder());
System.out.println("Array elements in descending order: "
+Arrays.toString(array)); } }
20. Șiruri de caractere (Clasele String, StringBuffer și StringBuilder) în limbajul de
programare Java: declararea, inițializarea, modificarea etc., deosebirile între clasele
„String”, „StringBuffer” și „StringBuilder
Valorile șir de caractere sunt gestionate de tipul de date “string”. Acestea pot fi create utilizand
sintaxa implicită, bazată pe new:
String s = new String();
String sCuValoare = new String("Salut String!" );
Sirurile de caractere sunt obiecte. Atunci cand se utilizeaza semnul egal (=) intre 2 obiecte de tip
string, veti copia valoarea referinței la obiect, ci nu valoarea obiectului:
String string1 = "Hello Strings";
String string2 = string1; // string 2 va avea valoarea referinței la obiectul string1
Obiectul inițială de tip “string” (string1) nu-si modifica valoarea după ce a fost creat.
Clasele “StringBuffer” si “StringBuilder” sunt folosite pentru a face obiectele “String” mutable. Prin
urmare, aceste obiecte pot fi modificate. Obiectele de caractere create cu aceste clase pot economisi
memorie. StringBuffer asigură siguranța firelor, deoarece două fire nu pot accesa simultan aceeași
metodă în clasa StringBuffer. Aceasta proprietate poate reduce performanța. Clasele “StringBuffer”
si “StringBuilder” conțin metode cum ar fi append (), insert (), invers (), replace ().
Diferente generale intre sir de caractere, stringbuffer si stringbuilder
Șirul este o clasă Java care este utilizată pentru a crea un obiect de tip String, care este o secvență de
caractere.
StringBuffer este o clasă Java care este utilizată pentru a crea obiecte String, care pot fi modificate
cu siguranța firelor.
StringBuilder este o clasă care este utilizată pentru a crea obiecte șir, care pot fi modificate fără
siguranța firului.
Mutabilitate
Șirul este o clasă imuabilă. | StringBuffer este o clasă mutable. | StringBuilder este o clasă mutable.
Securitatea filetului
Metodele de șir sunt sigure. | Metodele lui StringBuffer sunt sigure și sincronizate cu fir. |
Metodele lui StringBuilder nu sunt sigure și nu sunt sincronizate.
Performanţă
Șirul este rapid. | StringBuffer este lent. | StringBuilder este rapid.
21. Principalele metode folosite la prelucrarea șirurilor de caractere în limbajul Java
Clasa “String” are mai multe metode pentru a prelucra o valoare. Cele mai utilizate sunt:
charAt() - întoarce caracterul aflat la un anumit indice; indicele ia valori de la 0 la length()-1;
concat() - concateneaza un string la sfarsitul celui existent; la fel ca +;
equals() - compara la nivel de caracter 2 valori string; face diferenta intre litere mici si mari
length() - returneaza numarul de caractere; este diferit de atributul “length” al unui vector (e o
metoda)
replace() - înlocuiește aparițiile unui caracter cu unul primit
substring() - returneaza un subsir
toLowerCase() - converteste toate caractere la litere mici
toString() - returnează valoarea obiectului String
toUpperCase() - converteste toate caractere la majuscule
trim () - elimina spațiul de la sfârșitul șirului de caractere
Este important de ținut minte ca unele dintre aceste metode creaza un nou obiect de tip string, în loc
sa modifice obiectul curent.
Exemplu:
String text1 = "TEST" ;
text1.toLowerCase(); //rezultatul este un alt string
22. Avantajele programării orientate pe obiecte
Programarea orientată pe obiect (Programare Orientată Obiectual) este unul din cei mai importanți
pași făcuți în evoluția limbajelor de programare spre o mai puternică abstractizare în implementarea
programelor. Ea a apărut din necesitatea exprimării problemei într-un mod mai simplu, pentru a
putea fi înțeleasă de cât mai mulți programatori. Astfel unitățile care alcătuiesc un program se
apropie mai mult de modul nostru de a gândi decât modul de lucru al calculatorului.
Clasele grupează datele și unitățile de prelucrare a acestora într-un modul, unindu-le astfel într-o
entitate mult mai naturală. Deși tehnica se numește "Programare Orientată Obiectual", conceptul de
bază al ei este Clasa. Clasa, pe lângă faptul că abstractizează foarte mult analiza/sinteza problemei,
are proprietatea de generalitate, ea desemnând o mulțime de obiecte care împart o serie de
proprietăți.
● Modularitatea: codul sursa pentru o clasa poate fi scris si mentinut independent de codul
sursa pentru alte clase. Odata creat, un obiect poate fi usor transferat in interiorul sistemului
● Reutilizarea codului: daca o clasa exista deja, puteti utiliza in programul dvs. obiecte din
acea clasa. Acest lucru permite programatorilor sa implementeze / testa / depana obiecte
complexe, specifice pentru sarcini, pe care apoi le puteti folosi in propriul cod.
● Debugging mai usor: Daca un anumit obiect se dovedeste a fi o problema, il puteti elimina
din program si puteti adauga/conecta, ca inlocuitor, un obiect diferit. Acest lucru este similar
cu rezolvarea problemelor mecanice in lumea reala. Daca un surub se rupe, il inlocuiti pe el,
nu intreaga masina.
23. Clase: declararea, operatori de protecție, set-teri și get-teri
Clasele reprezinta principiile de baza ale programarii orientate obiect. Clasele reprezinta notiuni
abstracte, modele (blueprints), ce descriu:
- caracteristicile, atributele unui obiect; reprezinta ceea ce stie sau ce este obiectul;
- ce stie sa faca obiectul, comportamentul acestuia descris de metodele sale;
// bloc clasa
Modificatorii de access utilizati pentru membrii unei clase (metode si atribute) sunt:
Asa cum reiese din scurta descriere a modificatorilor de acces, acestia reprezinta reguli cu privire la
dreptul de a accesa membrii (atribute si metode) unei clase din alte clase.
2. Set-teri si Get-teri
În Java, Set-teri si Get-teri sunt două metode convenționale care sunt folosite pentru returnarea și
actualizarea valorilor variabilelor din cadrul unei clase. Sunt folositi pentru a evita expunerea
variabilelor in exteriorul clasei.
Variabile locale sunt definite pe stiva metodei si ele exista atâta timp cât metoda este executata
(exista in stiva de apeluri). Variabilele locale nu pot fi accesate si din interiorul unor metode
imbricate chiar daca ele exista cand metoda imbricata este executata.
O funcție recursivă este cea care se apeleaza de una sau de mai multe ori de catrea ea insasi. Exista
doua tipuri de metode recursive in Java:
1. Recursivitate directă
Aici funcția1 se numește continuu, deci este o funcție recursivă.
O funcție1 care apelează o altă funcție2, care la rândul său apelează funcție1 se numește funcție
indirectă recursivă.
function1(){ function2(){
function2(); function1();
} }
27. Metode supraîncărcate și suprascrise
Supraîncarcarea se referă la posibilitatea de a avea într-o clasă mai multe metode cu același nume,
dar implementari diferite. În Java, compilatorul poate distinge între metode pe baza semnăturii lor,
acesta fiind mecanismul din spatele supraîncărcarii. O clasă poate supraîncărca metodele moștenite.
Constructorii pot fi supraîncărcați.
Supraîncărcarea are loc la compilare, motiv pentru care mai este numită și polimorfism static
(compile time polymorphism). În aceasta fază compilatorul decide ce metodă este apelată pe baza
tipului referinței și prin analiza numelui și a listei de parametri. La runtime, când este inițiat apelul
unei metode supraîncărcate, deja se știe unde este codul care trebuie executat.
Suprascrierea se referă la redefinirea metodelor existente în clasa părinte de către clasa copil în
vederea specializării acestora. Metodele din clasa parinte nu sunt modificate. Putem suprascrie doar
metodele vizibile pe lanțul de moștenire (public, protected). O metodă din clasa copil suprascrie
metoda din clasa părinte dacă are același tip de return și aceeași semnatură (nume și parametri).
Membrul static al clasei nu ocupă memorie pe bază de instanță, adică toate obiectele au aceeași
copie a membrului static. Elementul static poate fi utilizat independent de orice obiect din acea
clasă.
Variabile statice:
- O variabilă statică acționează ca o variabilă globală pentru toți ceilalți membri ai clasei.
- O variabilă statică poate fi accesată înainte ca orice obiect al clasei să existe.
- O variabilă statică poate fi accesată cu numele clasei în care este definită urmată de
operatorul punct (.).
Metode statice:
Clasa statică
- Java are conceptul de clasă statică imbricată. Clasa cea mai exterioară nu poate fi făcută
statică, în timp ce clasa cea mai interioară poate fi făcută statică.
- O clasă imbricată static nu poate accesa membrul nestatic al clasei exterioare.
- Poate accesa numai membrii statici ai clasei exterioare.
Final este un cuvânt cheie aplicabil clasei, variabilei și metodelor. Clasa, variabila și metoda sunt
declarate ca finale folosind cuvântul cheie „final” precedat de numele lor. Odată ce o variabilă este
declarată definitivă; nu poate fi modificat în continuare în program. Variabilele finale nu ocupă
memorie pe bază de instanță.Toate obiectele claselor au aceeași copie a variabilei finale.
Cuvântul cheie this se referă la instanța curentă a clasei și poate fi folosit de metodele, care nu sunt
statice, ale unei clase pentru a referi obiectul curent. Apelurile de funcții membru din interiorul unei
funcții aparținând aceleiași clase se fac direct prin nume. Apelul de funcții aparținând unui alt obiect
se face prefixând apelul de funcție cu numele obiectului. Situația este aceeași pentru datele membru.
Totuși, unele funcții pot trimite un parametru cu același nume ca și un câmp membru. În aceste
situații, se folosește cuvântul cheie this pentru dezambiguizare, el prefixând denumirea câmpului
când se dorește utilizarea acestuia.
În general, cuvântul cheie this este utilizat pentru:
- a se face diferenta între câmpuri ale obiectului curent și argumente care au același nume
- a pasa ca argument unei metode o referință către obiectul curent
- a facilita apelarea constructorilor din alți constructori, evitându-se astfel replicarea unor
bucăți de cod
In exemplul de mai sus variabilele se pot accesa in urmatorul mod folosind cuvantul cheie “this”:
public Car(){ //Constructor fara parametrii
this.modelYear = 0;
this.modelName = “”;
}
Astfel se evidentiaza referinta la campurile obiectului curent.
30. Moștenirea în Java, avantajele și tipurile de moștenire
Numită și derivare, moștenirea este un mecanism de refolosire a codului specific limbajelor
orientate obiect și reprezintă posibilitatea de a defini o clasă care extinde o altă clasă deja existentă.
Ideea de bază este de a prelua funcționalitatea existentă într-o clasă și de a adăuga una nouă sau de a
o modela pe cea existentă.
Moștenirea este folosită în general atunci când se dorește construirea unui tip de date care să
reprezinte o implementare specifică (o specializare oferită prin clasa derivată) a unui lucru mai
general. Un exemplu simplu ar fi clasa Dacia care moștenește clasa Car.
Clasa existentă este numită clasa-părinte, clasa de bază sau super-clasă. Clasa care extinde clasa-
părinte se numește clasa-copil (child), clasa derivată sau sub-clasă.
Avantaje:
- posibilitatea reutilizării codului ;
- obţinerea extensiei unei clase fară a fi necesară o recompilare a clasei iniţiale;
- utilizarea polimorfismului în timpul executiei programului prin folosirea funcţiilor virtuale.
Tipuri de Moştenire:
- Moştenire simplă: clasa derivată preia caracteristicile şi metodele unei singure clase de bază;
- Moştenire multiplă: clasa derivată preia caracteristicile şi metodele de la mai multe clase de
bază.
Mostenirea multipla este obtinuta prin intermediul interfetelor:
Exemplu:
class Animal { class Dog extends Animal {
// default constructor // default constructor of
Animal(){ class Dog
System.out.println("animal"); Dog() {
} super();
} System.out.println("dog");
}
}
O metodă abstractă este o metodă care este declarată fără o implementare (fără acolade și urmată de
punct și virgulă), astfel:
abstract void moveTo(double deltaX, double deltaY);
33. Interfețe: declararea, utilizarea
In limbajul Java, interfetele ofera raspuns lipsei mostenirii multiple. O interfata creeaza un protocol
pe care clasele trebuie sa il implementeze. Folosind interfete, poate fi precizat pentru o clasa ce sa
implementeze, dar nu si cum sa faca acest lucru.
Interfetele reprezinta constructii Java similare claselor abstracte. Ele pot contine declaratii de
constante si metode fara implementare. Dupa definire, o interfata poate fi implementata de un numar
nedefinit de clase. De asemenea, o clasa poate implementa oricate interfete doreste.
Pentre a implementa o interfata, o clasa trebuie sa ofere implementare tuturor metodelor definite in
interiorul interfetei respective. Nu prezinta importanta modul in care metodele vor fi implementate
in clasa.
Definirea unei interfete se realizeaza in mod similar cu cea a unei clase, prin intermediul cuvantului
cheie interface.
In declaratia unei interfete poate fi utilizat doar modificatorul public. Toate atributele definite in
interiorul unei interfete sunt implicit constante, chiar daca nu sunt declarate folosind modificatorii
static si final. Este obligatorie initializarea acestor atribute de tip constanta. Metodele declarate intr-
o interfata sunt implicit definite cu modificatorii abstract si public.
interface A{
void a1();
void a2();
}
interface B {
int x = 0;
void b();
}
interface C extends A, B {
// this interface will expose
// * all the methods declared in A and B (a1, a2 and b)
// * all the fields declared in A and B (x)
}
34. Deosebirile și asemănările dintre clase abstracte și interfețe
În primul rând, o clasă abstractă permite câmpuri care nu sunt statice sau finale, spre deosebire de
câmpurile statice și finale utilizate în interfețe. Interfețele nu pot avea niciun cod de implementare
folosit în ele și poate exista un cod de implementare folosit în clasa abstractă. Codurile de
implementare introduse în clasa abstractă pot avea câteva sau toate metodele implementate. În mod
implicit, toate metodele interfeței sunt "abstract. „
Vizibilitatea este, de asemenea, posibilă pentru metodele sau membrii unei clase abstracte, care pot
varia, cum ar fi public, protejat, privat sau nici unul. Vizibilitatea interfeței, pe de altă parte, poate fi
presetată doar la un mod de vizibilitate care este "public". ""
O clasă abstractă va moșteni automat clasa de obiecte. Aceasta, de fapt, înseamnă că sunt incluse
metode precum clona () și egal (). Într-o interfață, nu este posibilă nicio moștenire a clasei
obiectului. După aceasta, clasa abstractă are capacitatea de a avea un constructor, dar o interfață nu
poate avea una.
Interfața din Java are de asemenea o funcție foarte importantă cu implementarea mai multor
moșteniri, deoarece o clasă poate avea doar o clasă super. Deși poate exista o singură clasă
superioară, ea poate fi implementată în orice număr de interfețe. Nu este posibil să existe mai multe
moșteniri într-o clasă abstractă.
În performanță, interfețele tind să fie mai lente în implementare, spre deosebire de clasa abstractă, în
principal datorită direcției suplimentare de găsire a metodei corespunzătoare într-o clasă. Diferența,
totuși, a devenit mai lentă datorită mașinilor virtuale moderne Java care sunt în continuă actualizare.
Adăugarea unei metode într-o interfață necesită urmărirea tuturor claselor de implementare care
implementează interfața specifică. Alternativ, se poate extinde interfața astfel încât să permită să
aibă metode suplimentare. Dacă se întâmplă să se ocupe de o clasă abstractă, tot ce este necesar este
să fie adaugata implementarea implicită a metodei și codul va continua să funcționeze. În măsura în
care există diferențe între clasele abstracte și interfețe, este important de reținut că nu sunt rivali.
35. Pachete, avantajele polimorfismului, exemple
In limbajul Java pachetele de clase reprezinta entitati logice care permit organizarea claselor si
interfetelor. Pachetele de clase sunt colectii de clase si interfete inrudite, care asigura atat controlul
accesului, cat si controlul spatiului de nume.
Crearea unui pachet se realizeaza prin intermediul instructiunii package, care specifica un nume
pentru pachetul care urmeaza a fi creat. Aceasta instructiune va fi plasata in fisierele sursa care
cuprind clasele si interfetele din pachet.
Instructiunea package (declaratia de pachet) trebuie sa ocupe prima linie intr-un fisier sursa. De
asemenea, nu poate fi specificata decat o singura declaratie de pachet intr-un fisier sursa. Daca un
fisier sursa contine o instructiune package, aceasta va fi aplicata tuturor claselor si interfetelor
definite in acel fisier sursa.
Polimorfismul este capacitatea unui obiect de a lua multe forme. Cea mai obișnuită utilizare a
polimorfismului în POO apare atunci când se folosește o referință de clasă părinte pentru a se referi
la o clasă copil obiect.
Exemplu: public interface Vegetarian{}
public class Animal{}
public class Deer extends Animal implements Vegetarian{}
Acum, clasa Deer este considerată polimorfă, deoarece aceasta are o moștenire multiplă.
Avantajele polimorfismului:
- Codul programatorilor poate fi reutilizat prin polimorfism;
- Suportă un singur nume de variabilă pentru mai multe tipuri de date;
- Reduce utilizarea unui obiect de către un alt obiect.
36. Utilizarea listelor, clasele „ArrayList”, „LinkedList” și altele
Lista în Java oferă facilitatea de a menține o colecția ordonata. Acesta conține metodele bazate pe
index pentru a insera, actualiza, șterge și căuta elemente. Poate avea și elementele duplicate. De
asemenea, se pot stoca elementele nule în listă.
2. LinkedList este o structură de date liniară în care elementele nu sunt stocate în locații
adiacente și fiecare element este un obiect separat cu o parte de date și o parte de adresă.
Elementele sunt legate folosind pointeri și adrese. Fiecare element este cunoscut sub numele
de nod.
// Declaring the List with initial size n
List<Integer> ll = new LinkedList<Integer>();
3. Vectorul implementează o matrice dinamică care înseamnă că poate crește sau micșora după
cum este necesar. La fel ca o matrice, conține componente care pot fi accesate folosind un
index întreg.
// Declaring the List with initial size n
List<Integer> v = new Vector<Integer>(n);
O colectie este de fapt un obiect care grupeaza mai multe elemente intr-o singura unitatae. Colectiile
se utilizeaza pentru stocarea, regasirea si manupularea datelor. Deci colectiile reprezinta obiecte care
in mod natiral formeaza un grup.
Dicționarul în Java este o clasă abstractă în Java care stochează datele sub formă de perechi cheie-
valoare si se găsește în pachetul java.util. Fiecare cheie are o valoare și putem prelua valorile într-un
obiect Dicționar folosind cheia corespunzătoare.
Putem declara un obiect de dicționar în Java în modul de mai jos:
• TreeSet: ofera acces ordonat la elementele multimii, acestea fiind ordonate ascendent pe baza
valorilor; elementele sunt memorate sub forma unui arbore binar; implementarea este mai lenta
decat in cazul lui HashSet.
Set<String> ts1 = new TreeSet<>();
In ambele cazuri adaugarea datelor se realizeaza folosind metoda add():
cars.add("Volvo");
ts1.add(“Val”);
38. Lucrul cu comparatorul colecțiilor
Să presupunem că avem un Array / ArrayList de propriul nostru tip de clasă, care conține câmpuri
precum numar, nume, adresă, etc. și trebuie să sortăm lista pe baza numarului sau numelui.
Metoda 1: O abordare evidentă este să scriem propria noastră funcție sort () folosind unul dintre
algoritmii standard. Această soluție necesită rescrierea întregului cod de sortare pentru diferite
criterii, cum ar fi numărul ruloului și numele.
Metoda 2: Utilizarea interfeței de comparare - Interfața de comparare este utilizată pentru a compara
obiectele unei clase definite de utilizator. Această interfață este prezentă în pachetul java.util și
conține 2 metode compare(Object obj1, Object obj2) și equals(Object element). Folosind un
comparator, putem sorta elementele pe baza membrilor datei.
class Student { … }
class Sortbyname implements Comparator<Student> {
// Used for sorting in ascending order of name
public int compare(Student a, Student b)
{
return a.name.compareTo(b.name);
}
}
// Driver class
class Main {
public static void main(String[] args)
{
ArrayList<Student> ar = new ArrayList<Student>();
ar.add(new Student(111, "bbbb", "london"));
ar.add(new Student(131, "aaaa", "nyc"));
Utilizand fluxurile putem scrie aplicatii care salveaza si incarca datele in fisiere. Java permite si un
mecanism mai avansat si anume serializarea obiectelor. In forma cea mai simpla serializarea
obiectelor inseamna salvarea si restaurarea starii obiectelor. Obiectele oricarei clase care
implementeaza interfata Serializable, pot fi salvate intr-un stream(fluxde date) si restaurate din
acesta.
Utilizand serializarea putem salva obictele create pe o platforma si le putem transmite prin retea pe
un alt calculator care nu trebuie neaparat sa se ruleze pe aceasi platforma, totusi permite restauraea
corecta a obiectelor.
Pentru a putea fi serializat un obiect trebuie sa fie instanta a unei clase care implementeaza una din
interfetele :
java.io.Serializable sau
java.io.Externalizable (care extinde clasa Serializable)
GregorianCalendar este o subclasă concretă (una care are implementarea tuturor membrilor săi
moșteniți fie din interfață, fie din clasa abstractă) a unui calendar.
Diferența majoră între clasele GregorianCalendar și Calendar este că clasa Calendar fiind o clasă
abstractă nu poate fi instanțiată. Deci, un obiect al clasei Calendar este inițializat ca:
Calendar cal = Calendar.getInstance();
Aici, un obiect numit cal din clasa Calendar este inițializat cu data și ora curente din setările locale și
fusul orar implicit. În timp ce, Clasa GregorianCalendar fiind o clasă concretă, poate fi instanțiată.
Deci, un obiect al clasei GregorianCalendar este inițializat ca:
GregorianCalendar gcal = new GregorianCalendar();
41. Noțiunea de excepție, tipuri de excepții, prelucrarea excepțiilor (instrucțiunile „try”, „catch”
și „finally”)
In limbajul Java exceptiile ofera un mecanism eficient de identificare si rezolvare a erorilor.
Exceptiile reprezinta situatii care apar in timpul executiei unui program si care determina oprirea
acestuia. Java ofera posibilitatea tratarii exceptiilor prin stabilirea unei cai alternative de continuare a
executiei programului.
De exemplu, pot fi generate exceptii in urmatoarele cazuri:
- realizarea unei impartiri la zero ArithmeticException;
- deschiderea unui fisier care nu exista FileNotFoundException;
- accesarea indexului unui tablou care depaseste limitele IndexOutOfBoundsException;
- utilizarea unui atribut care nu a fost definit NoSuchFieldException.
La aparitia unei exceptii este generat automat un obiect care contine toata informatia
corespunzatoare exceptiei.
Java ofera o solutie eficienta de rezolvare a exceptiilor care apar intr-un program prin intermediul
mecanismului de tratare a exceptiilor. Implementarea unei astfel de solutii se face folosind
constructii de genul try … catch … finally.
try {
// instructiuni supravegheate
}
catch (Exceptie1 e1) {
// tratare exceptie e1 de tip Exceptie1
}
catch (Exceptie2 e2) {
// tratare exceptie e2 de tip Exceptie2
}
finally {
// instructiuni care se executa neconditionat
}
42. Generarea excepțiilor proprii, instrucțiunea „throw” și „throws”
Generarea unei exceptii poate fi realizata prin intermediul instructiunii throw, astfel:
throw obiect_exceptie;
Putem considera ca exceptiile reprezinta al doilea tip returnat de catre o metoda. Din acest motiv, o
metoda trebuie sa declare tipurile de exceptii care pot fi lansate din interiorul ei. In caz contrar,
compilatorul Java genereaza o eroare de compilare.
Declararea tipurilor de exceptii care pot aparea intr-o metoda este realizata folosind cuvantul cheie
throws in declaratia metodei.
Exceptiile declarate in antetul unei metode extind clasa Exception si cuprind conditii de eroare care
apar datorita problemelor de comunicatie cu sisteme externe sau datorita lucrului cu intrarile. Aceste
conditii de eroare trebuie tratate dinamic, deoarece ele nu pot fi prevenite.