Documente Academic
Documente Profesional
Documente Cultură
Short si char – 16 biti. Aceste tipuri de date sunt asemanatoare si fac posibile urmatoarele
combinatii:
short bird =’d’; - valoarea lui bird nu va fi ‘d’ ci valoarea asociata lui d adica 100
char mammal = (short)83; - valoarea mammal va fi caracterul asociat valorii 83 deci ‘S’
Tipul de date char este signed si nu poate stoca valori negative.
Int si float – 32 de biti. In cazul float este nevoie de adaugarea literei “f” pentru a fi recunoscut ca float.
Long si double – 64 de biti. Pentru ca un numar sa fie recunoscut ca long acesta trebuie sa aiba la final
“L”, in caz contrar va fi considerat int.
Java permite stocarea de numere si in alte sisteme:
-in baza 8. Foloseste 0 ca prefix ex:”017”
-hexadecimal. 0xFF
-binar, de exemplu 0b10 sau 0B10
In cazul in care avem numere cu valori mari este posibila adaugarea caracterului “_” pentru a face
numarul mai usor de citit. Putem adauga inclusiv 2 sau mai multe caractere”_” alaturat dar acestea nu se
pot adauga:in fata numarului, inainte sau dupa punctul decimal sau la finalul numarului.
Ex: double exValid = 1_00.0_0;
double notValid = 1.0_;
Identificatorii variabilelor pot incepe cu o litera, sau caracterele “$” si “_”.In cazul “_” nu poate fi folosit
ca identificator singular ci trebuie urmat de alte caractere(incepand cu Java 9).
Identificatorii pot include caractere numerice dar nu pot incepe cu acestea.
Identificatorii variabilelor nu pot fi cuvintele cheie din Java(class, enum etc) dar pot fi variatii ale lor
scrise de exemplu cu majuscule(in orice caz NU este recomandata folosirea lor!!!!!!!!!!!).
Numele claselor nu pot incepe cu “$” deoarece acest caracter este folosit de Java pentru anumite fisiere.
In cazul in care declaram mai multe variabile pe aceeasi linie acestea trebuie sa fie de acelasi tip.
NU este permisa declararea aceluiasi tip pe acelasi rand(acelasi rand=tot ce exista pana la caracterul “;”)
de exemplu “double d1,double d2;”
Primitivele au valori default doar atunci cand sunt field-uri ale unei clase sau variabile globale. In cazul
variabilelor locale acestea nu vor avea valoare default si folosirea lor fara sa fie initializata va duce la o
eroare de compilare. ATENTIE la cazul in care variabilele ce sunt utilizate(pot sa nu fie initializate atat
timp cat nu sunt folosite) sunt initializate in cadrul unor blocuri decizionale in care exista posibilitatea sa
fie initializate pentru una din valori, de exemplu “true”, si sa nu fie initializate pentru false, in acest caz
vom avea o eroare de compilare.
Incepand cu Java 10 a fost introdus keyword-ul var . Acest keyword poate fi folosit doar pentru variabile
locale.Campurile unei clase nu pot avea ca tip var.
Desi var poate stoca tipuri de date multiple odata ce este initializata cu o valoare de un anumit tip var va
pastra tipul acelei valori. De exemplu “var number=7;”, in acest caz putem sa schimbam valoarea lui
number cu un alt int “number=3;” dar nu putem sa ii asignam un alt tip de date ca de exemplu number sa
stocheze un String “number=”test”;”-NU VA COMPILA.
Exemplu 2:
var apples = (short)10;
apples = (byte)5;
apples = 1_000_000;
Acest exemplu nu va functiona din cauza liniei 3. La linia 2 chiar daca facem cast la byte va fi stocat tot
un short(byte e mai mic decat short si poate fi trecut la short in mod automat). Linia 3 nu va compila
deoarece este o valoare mai mare decat cee ace poate stoca short.
Spre deosebire de primitive var trebuie sa fie initializate la declarare(chiar daca sunt initializate dupa
acest lucru nu va functiona), deoarece in caz contrar compilatorul nu va sti de ce tip sunt, in acest caz
vom avea o eroare de compilare.
Var nu pot initializate pe acelasi rand cu alte tipuri de date(int a=3, var b=0;-NU VA COMPILA) ,NU
pot fi initializate cu null(ATENTIE poate stoca null in cazul in care a fost initializat in prealabil cu o
instanta a unui obiect SAU daca este specificat tipul ”var nume=(String)null;”) si NU suporta
declararea multipla(var a=0,b=2;-NU VA COMPILA).
NU putem folosi var ca tip de date pentru parametrii unei metode (var sunt doar variabile locale).
Putem folosi var ca: nume pachet “package var;”, nume clasa(inclusiv constructor)”public class
Var{}”, nume metoda”public void var();”, nume variabila locala “var var = “var”;”. Aceste cazuri nu
cauzeaza erori de complicare dar arata ca dracu si din aceasta cauza nu sunt recomandate.
In Java putem accesa intr-un bloc variabile din exteriorul acestuia, de exemplu daca declaram o variabila
locala in interiorul unei metode sau al unui bloc conditional etc. incercarea de a utiliza aceea variabila in
afara acelui bloc va duce la o eroare de compilare.
STRING BUILDER
Ex: StringBuilder sb = new StringBuilder(“test”);
StringBuilder sb = new StringBuilder();
StringBuilder sb = new StringBuilder(10); - in acest fel transmitem faptul ca avem idee despre ce
dimensiune va avea StringBuilder-ul.
Desi asemanatoare cu String, StringBuilder nu este immutable.
Metode uzuale StringBuilder:
EQUALITY
Ex1: StringBuilder one = new StringBuilder();
StringBuilder two = new StringBuilder();
StringBuilder three = one.append("a");
System.out.println(one == two); // false
System.out.println(one == three); // true
Obiectele one si two sunt diferite, dar one si three sunt egale,metodele din StringBuilder returneaza dupa
chaining referinta actuala, acestea facand referinta la acelasi obiect.
Ex2: String x = "Hello World";
String z = " Hello World".trim();
System.out.println(x.equals(z)); // true
Metoda equals compara continutul string-urilor si nu referintele.
ARRAYS
Exista mai multe moduri de a declara un array:
int[] numAnimals;
int [] numAnimals2;
int []numAnimals3;
int numAnimals4[];
int numAnimals5 [];
Atentie la declararea pe acelasi rand a mai multor array-uri.
Ex: int[] ids, types; - in acest caz avem doua array-uri
int ids[], types; - spre deosebire de primul exemplu avem un array si o variabila
Metode uzuale array:
- Arrays.sort(array) – sorteaza un array in ordine crescatoare daca e vorba de valori numerice sau
daca sunt string-uri in functie de valorile ASCII
- Arrays.binarySearch(array, targetElement) – functioneaza daca array-ul este sortat.Daca
elementul va fi gasit va fi returnat indexul acestuia, in caz contrar va fi returnata o valoare
negative dupa cum urmeaza, valoarea indexului unde ar trebui inserat*(-1)-1;
- Arrays.compare(array1, array2) – compara 2 array-uri si va returna o valoare(0 daca array-
urile au aceeasi dimensiune si aceleasi valori, o valoare negative in cazul in care primul array are
o dimensiune mai mica sau daca primul element care difera este mai mic in primul array, o
valoare pozitiva daca al doilea array are aceleasi elemente ca primul dar are elemente extra la
final sau daca prima valoare care difera este mai mica in cel de al doilea array).
- Arrays.mismatch(array1,array2) – daca cele 2 array-uri sunt egale va returna -1 altfel va
returna primul index in care cele 2 array-uri difera
ARRAY-URI MULTIDIMENSIONALE
ARRAY LIST
- La fel ca StringBuilder, ArrayList isi poate schimba capacitatea la runtime dupa cum e nevoie.
- Asemanator cu array, ArrayList este o secventa ordonata ce accepta duplicate.
- Putem crea un ArrayList in trei moduri:
ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList(10);
ArrayList list3 = new ArrayList(list2);
- Exemplele precedente sunt inca functionale dar au fost folosite inainte de Java 5 atunci cand au
fost introduce tipurile de date generice, astfel la crearea unui ArrayList putem specifica tipul de
date pe care vrem sa il contina:
ArrayList<String> list4 = new ArrayList<String>();
ArrayList<String> list4 = new ArrayList<>(); - valabil incepand cu Java7
- Putem asigna un ArrayList unui var:
var strings1 = new ArrayList<String>();
strings.add(“a”);
var strings2 = new ArrayList<>(); - va compila dar tinand cont ca nu am specificat tipul, se va
considera tipul cel mai generic si anume Object.
strings2.add(“s”)- merge(putem adauga deoarece String e subclasa a lui Object)
for(String s: strings2){} – nu va compila deoarece avem o lista de obiecte si nu string-uri
SETS SI MAPS
MATH API
- Math.max(a,b) – returneaza maximul dintre a si b. Parametrii pot fii double, float, int sau long
- Math.min(a.b) – returneaza minimul
- Math.round(param) – daca param e double va rotunji si va returna in long iar daca e float va
rotunji si va returna un int
- double Math.pow(double number, double exponent)
- double Math.random() – va returna un double random mai mare sau egal cu 0 dar mai mic decat
1.
CLASE WRAPPER
- Integer – Integer.valueOf(1)
- Byte – Byte.valueOf((byte) 1)
- Short – Short. valueOf((short) 1)
- Boolean – Boolean.valueOf(true)
- Long – Long.valueOf(1)
- Float – Float.valueOf((float) 1.0)
- Double – Double.valueOf(1.0)
- Character – Character.valueOf(‘c’)
Metoda valueOf() returneaza un wrapper in timp ce parseInt() returneaza o primitiva. Avem
metode de tip parse(ce convertesc din String intr-o primitiva) pentru toate clasele wrapper mai
putin Character(nu putem face din String char).
Clasele abstracte NU trebuie sa declare neaparat metode abstracte in interiorul lor, DAR o metoda
abstracta poate fi declarata doar in interiorul unei clase abstracte (public abstract long eat(); ).
Modificatorul abstract poate fi pus inainte sau dupa modificatorul de access DAR nu poate fi pus
dupa class.
Constructorul unei clase abstracte este apelat doar atunci cand clasa abstracta e initializata de o
subclasa.
Java nu permite ca o clasa sau metoda sa poata fi adnotata atat abstract cat si final deoarece
acestea sunt in conflict. Daca ar fi declarate ca final acestea nu ar m-ai putea fi suprascrise.
Java nu permite ca o clasa sau metoda sa poata fi adnotata atat abstract cat si private deoarece
acestea sunt in conflict.
Subclasele nu pot reduce nivelul de vizibilitate al unei metode. De exemplu daca o metoda a fost
declarata ca protected in clasa abstracta , aceasta va trebui sa aiba ca acces in subclasa private
sau protected.
- Inner class. Clasa non-statice definite ca membru al unei clase. Poate avea ca modificator de
acces oricare dintre cele 4, poate extinde sau implementa orice clasa sau interfata, pot fi marcate
cu abstract sau final, NU pot avea campuri si metode marcate cu static sau cu final cu
exceptia campurilor care sunt static final(constante). Aceste clase pot accesa membrii private ai
clasei in care sunt incluse.Aceste clase pot fi instantiate fie in cadrul unei metode din clasa Outer
fie de o instanta a clasei Outer de ex: Inner inner = outer.new Inner();
- Static nested class. Clase static ce sunt declarate in interiorul unei alte clas. Spre deosebire de
clasele inner nu avem nevoie de o instanta a clasei ce realizeaza incapsularea pentru a crea o
instanta. Clasa Enclosing poate accesa campurile si metodele din clasa statica incapsulata.
- Clase locale. Clase incapsulate in interiorul unei metode. Aceste clase nu au modificatory de
acces, nu pot fi declarate ca static si nu pot avea metode sau campuri marcate cu static sau final
cu exceptia campurilor constante ce sunt static final. Pot accesa variabilele locale daca acestea
sunt final sau final efectiv.
- Clase anonime. Clase ce sunt declarate si instantiate in acelasi statement.
INTERFETE
Interfetele pot avea metode declarate ca default(sunt marcate cu keyword-ul “default”). Scopul
acestora e capacitatea de a adauga noi metode fara a fi nevoie de a oferi o implementare in clasele ce au
deja implementata aceasta interfata. In cazul in care o clasa implementeaza doua sau mai multe interfete
ce contin metode default similare va fi nevoie sa fie oferita o implementare acelei metode pentru a se
depasi ambiguitatea.
Interfetele pot avea metode statice, acestea pot fi accesate de interfata ca orice alta metoda staticaq
dintr-o clasa. Clasele ce implementeaza interfete ce cintin metode statice nu pot accesa metodele statice
din interfata.
Interfetele pot avea metode private sau private static dar acestea nu pot fi apelate decat de alte metode
private din interfata sau metode default. Deasemenea acestea trebuie sa aiba o implementare si nu pot fi
abstracte.
Interfetele functionale sunt baza pentru expresiile lambda. Aceste interfete contin o singura metoda
abstracta. Acestea sunt declarate cu ajutorul adnotarii @FunctionalInterface, dar a aceasta este optionala.