Sunteți pe pagina 1din 23

Curs Java

C1.Notiuni introductive
C1.1. Limbajul nativ al masinii
The Fetch and Execute Cycle
Machine language set de instructiuni (set secvente binare) executate direct de catre
CPU (Control Processing Unit)
CPU executa doar programele stocate in Main Memory RAM Random Access
Memory
(contine
addrese si date - instructiuni)
CPU
CU - Control Unit
Cache
IR - Instruction Register
MDR Memory Data Register
PC Program Counter
MAR Memory Adress Register
ALU Arithmetic Logical Unit
ACC - Accumulator
Data Bus
Address Bus

Etapele ciclului fetch-execute:


1.
2.
3.
4.
5.
6.
7.
8.

PC pune adresa urmatoarei instructiuni in MAR


MAR pune adresa instructiunii pe Address Bus
Adress Bus gaseste instructiunea de la acea adresa de memorie
Instructiunea este pusa pe Data Bus
Instructiunea este pusa in MDR
Instructiunea intra in IR
IR decodeaza instructiunea si o executa
Se trece la urmatoarea instructiune

C1.2. Limbajul virtual al masinii

RAM
00101110
.
.
.
.
.
.

IDE - Integrated Development Kit Eclipsse - NetBeans


JDK - Java Development Kit = JRE + javac compiler + development tools
JRE - Java Runtime Environment = JIT + JVM + libraries
JVM - Java Virtual Machine
JIT - Just In Time Compiler
Javac

Interpreter

Source code

Bytecode

Machine code

(Virtual Machine Code)


.java

.class

Compiler:
- executa tot programul odata
- transforma codul sursa al aplicatiilor in bytecode

Interpreter:
- executa programul instructiune cu instructiune
- transforma bytcode in cod masina

Pentru ca bytecode sa poata fi executat pe un anumit calculator acesta trebuie sa aiba


instalata o masina virtuala Java.
Ca si aplicatie un soft compiler este mai mare si greu de implementat decat un soft
interpreter.
Caracteristici limbaj Java:

- elimina supraincarcarea operatorilor (posibilitatea operatorilor de a opera


asupra unor noi tipuri de date introduse de utilizator)
- mostenire simpla - o clasa poate avea doar o clasa parinte (superclasa)
- renuntarea la pointeri
- alocarea automata a memoriei
- eliminarea pierderilor de memorie - garbage collector
- neutralitate ahitecturala - aplicatiile Java nu depind de arhitectura masinii pe
care ruleaza
- portabilitate - obtinuta prin compilare si interpretare
- orientat pe obiecte

Platforme Java JDK:


- J2SE (Standard Edition) - aplicatii independente si appleturi
- J2ME (Micro Edition) - aplicatii dispozitive mobile
- J2EE (Enterprise Edition) - aplicatii complexe, servleturi

O subrutina reprezinta un set de instructiuni grupate sub un nume si care efectueaza


anumite sarcini.
Un obiect in Java contine date si subrutine.
O clasa in Java este o colectie de obiecte cu acelasi tip de date si care raspund la fel la
mesaje (apeluri de subrutine) de acelasi fel.
Polimorfism obiecte diferite raspund diferit la aceleasi mesaje.
Definitia unei aplicatii o clasa principala care contine subrutina Main.
Clasele pot fi asadar aplicatii daca contin aceasta subrutina, in caz contrar sunt doar
simple clase. Este recomandat ca numele aplicatiei sa fie acelasi cu numele clasei
principale.

Subrutina Main

Public static void main (string [] args){

}
Subrutina main poate apela alte subrutine din aceeasi clasa, sau din clase diferite.

Clasa principala care defineste o aplicatie


Public class numeAplicatie{

Public static void main (string [] args){

Daca aplicatia contine mai multe fisiere cu clase diferite acestea se vor salva avand
extensia .java
Compilarea se face cu compilatorul javac apelat pentru fisierul ce contine clasa
principala. Va rezulta un fisier cu extensia .class ce contine bytecode.
Interpretare/rularea aplicatiei se face cu interpretorul java pentru fisierul bytecode.

EX:

Save as: numeAplicatie.java


Compile: javac numeAplicatie.java (rezulta fisier.class)
Interpreter/Run: java numeAplicatie (fara extensia class)

CLI Command Line Interface


GUI Graphic User Interface

C1.3.Structura lexicala a limbajului

Setul Unicode = ASCII(256)+\uxxxx - este folosit de limbajul Java


xxxx-codul caracterului

1.Cuvinte cheie cuvinte rezervate


Nu pot fi folosite ca nume de clase, interfete, variabile sau metode.
True, false, null nu sunt cuvinte rezervate dar nici ele nu pot fi folosite ca si nume in
aplicatii
public
private
protected
default
final
abstract
strictfp
synchronized
native
transient
volatile
static

byte
int
short
long
double
float
boolean
char
const*
goto*
throws
enum

if
else
for
while
do
switch
case
break
continue
try
catch
return

import
package
interface
class
extends
implements
instanceof
finally
void
new
this
super

2.Identificatori secvente litere si cifre incepand cu o litera

3.Separatori: ()

{}

[]

4.Literali valori constante de tip primitiv atribuite variabilelor numerici, char, boolean
siruri de charactere.

5.Comentarii:
//

pe o singura linie

/* */

pe mai multe linii

/** */ pe mai multe linii, textul este mutat automat in documentatia aplicatiei de
catre generatorul de documentatie javadoc

6.Operatori

Atribuirea
simpla: =
compusa: +=

-=

*=

/=

%=

&=

|=

^=

<<=

Ex: (x+=y x=x+y)


Operatori matematici

++

--

Operatori incrementare, decrementare


++x preincrementare
x++ postincrementare
--y predecrementare
y-- postdecrementare

Operatori logici

&&(and), ||(or), !(not) pt boolean

Operatori relationali
Operatori pe biti

<, <=, >, <=, ==, != pt nr si char

&(and), |(or), ^ (xor), ~ (not)

Operatori de translatie

<<, >>, >>>

Operatorul + pentru siruri de caractere

Operatorul conditional
expresie booleana ? expresie1 : expresie2
Ex: n=(x==y) ? x : y
Operatorul conversie
Ex:

char a=(char)10; int 10 to char


double.Parsedouble(3.14); string 3.14 to double

C1.3.Tipuri de date

>>==

Aspecte de baza ale programarii: date si instructiuni.


Pentru data exista conceptele de variabila si tip.
Pentru instructiuni exista conceptele de control si metode(subrutine).

Variabila este o referinta la o adresa de memorie, iar data continuta de aceasta adresa
poate avea un tip. Alocarea memoriei in Java se face automat odata cu declararea
variabilei.
Datele indicate prin variabile pot fi de tip primitiv (numerice, char, boolean, siruri de
charactere) sau de tip referinta (vectori, clase, interfete).
Ex: int x=0; numele x reprezinta locul unde este stocata valoarea 0 care este de tip
integer.

Tipuri de date primitive


- numerice
integer: byte(8biti), short(16biti), int(32biti), long(64biti) - L
real: float(32biti), double(64biti) f,F,d,D,(x,y), (xey)
- char(16biti): A charactere Unicode
- boolean: true, false
- siruri de charactere: Ana, - sirul vid

Toate tipurile primitive de date sunt clase.


1 bit=o sau 1; 1 Byte= 8 biti;

C1.3.1.Variabile de tip primitiv


Declararea variabilelor: tip numeVariabila;
Initializare: tip numeVariabila=expresie; expresie - se refera la o data sau orice
calculeaza o data.
Sau: tip numeVariabila1=expresie, numeVariabila2=expresie;

Ex:

final double PI=3.14;

int x;
int x=0;
int x=0, y=0;
char initialaNume=A;
string numePersoana=Ana;

Constantele se scriu cu litere mari si au sufixul final, iar variabilele se scriu cu prima
litera mica, iar daca contin mai multe cuvinte primul se scrie cu prima litera mica iar
celalalte cu prima litera mare.

Variabile:
membre declarate in interiorul clasei vizibile pentru subrutinele acelei clase cat
si pentru alte clase in functie de nivelul de acces
locale declarate intr-o subrutina vizibile doar in subrutina respectiva
locale declarate intr-un boc de cod vizibile doar in blocul respectiv
Parametrii subrutinelor sunt vizibili doar in subrutinele respective.

C3.Controlul executiei si subrutine


C3.1.Controlul executiei

while (expresie booleana) {


...
}

if (expresie booleana) {
...
}
else {
...
}

do {
...
} while (expresie booleana);

for ( initializare; expresie booleana; pas iteratie ) {


...
}

switch (expresie) {
case valoare1:
...
break;
case valoare2:
...
break;
.
.
.
case valoaren:
...
break;
default: // optional default case
...
}

SWITCH - doar pentru variabile de tip primitiv

try {
...
}
catch ( numeclasaexceptie numevaloare ) {
...
}

Alte instructiuni:
Break - paraseste fortat corpul unei structuri repetitive

Continue - termina fortat iteratia curenta a unui ciclu si trece la urmatoarea


iteratie
Return (valoare) - termina o metoda si eventual returneaza o valoare

numeEticheta : - defineste o eticheta

Ex:
while(){
if () continue numeEticheta
if () break numeEticheta
}

C4.Variabile de tip referinta


C4.1.Vectori
Declarare: tip numeVector []; tip [] numeVector;
Instantiere(alocare de memorie): numeVector [ ]= new tip [nrelemente];
D+I: tip numeVector [ ]= new tip [nrelemente];
Optional initializare: Ex: int x [ ] = { 1, 8, 27, 64, 125, 216, 343 };
Declararea unui vector nu implica si alocarea memoriei. Instantierea lui se face prin
operatorul new.

Tablouri multidimensionale
tip matrice[] [] = new tip [nrlinii] [nrcoloane]

Dimensiunea unui vector: cu ajutorul variabilei length


Ex: int x [] = new int [5];
x.length=5

int m [] [] = new int [5] [10];


m[0]=10

Copierea vectorilor: element cu element sau cu metoda system.arraycopy

Ex: int a [] = {1,2,3,4}; int b [] = new int [4];


I: for (i=0; i<a.length; i++){
b[i]=a[i];
}

II: prin apelare metoda: numeClasa.numeMetoda(parametrii)


arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
system.arraycopy(a,0,b,0,a.length);

Sortarea vectorilor: metoda sort din clasa java.util.arrays


Vectori cu dimensiune variabila: metode din clasele vector si arraylist
Vectori eterogeni: vectori cu elemente tip obiect
Siruri de caractere
In Java un sir de caractere poate fi reprezentat printr-un vector cu elemente de tip char,
obiect de tip string sau un obiect de tip stringbuffer. Daca nu se doreste schimbarea
continutului sirul se declara de tip string, altfel de tip stringbuffer(metode: append,
insert, delete, reverse).

Primirea argumentelor de la linia de comanda


Transmiterea si primirea argumentelor
O aplicatie Java poate primi oricate argumente de la linia de comanda in momentul
lansarii. Aceste argumente sunt utile pentru a permite utilizatorului sa specifice diverse
optiuni legate de functionarea aplicatiei sau sa furnizeze date initiale programului.
Argumentele sunt introduse la lansarea aplicatiei fiind specificate dupa numele aplicatiei
si separate prin spatiu, sau daca unul din argumente contine spatii acesta trebuie pus
intre ghilimele. Argumentele sunt transmise programului sub forma unui vector de siruri.
Daca argumentele sunt introduse ca valori numerice aceste trebuie convertite in siruri
cu metode de tipul parseTipNumeric, aflate in clase corespunzatoare tipului respectiv.

C4.2.Obiecte si clase
Obiecte
Declarare: numeClasa numeObiect;
Instantiere: numeObiect = new numeClasa();
Initializare: prin intermediul constructorilor clasei
D+I+I: numeClasa numeObiect = new numeClasa();

Ex:
public class caine extends animal {
string nume;

// declararea clasei caine

// declarare variabile membre - de clasa

string rasa;
public caine (string s){

//model constructor1

nume=s;
rasa=necunoscuta;
public caine ( string numecaine, string rasacaine) {

//model constructor2

this.nume=numecaine
this.rasa=rasacaine
}
}
animal caine= new animal (nume,rasa);
this.nume - variabila de instanta - a obiectului
nume, rasa - parametrii constructorilor (pt primul tip deconstructor parametrul rasa este
necunoscut)

Folosirea obiectelor

Obiect - aflare informatii, schimbare stare, executare actiuni


Aceste lucruri se realizeaza prin aflarea sau schimbarea valorilor variabilelor sale,
respectiv prin apelarea metodelor sale.
Referirea valorii unei variabile se face prin obiect.variabila
Apelul unei metode se face prin obiect.metoda(parametrii).
Valorile variabilelor pot fi modificate indirect prin intermediul metodelor sale. POO
descurajeaza folosirea directa a variabilelor deoarece acesta poate fi adus in stari
inconsistente. In schimb pentru fiecare variabila care descrie starea obiectului exista
metode care permit schimbarea sau aflarea valorilor variabilor sale - metode de
accesare set, get.
Ex: De exemplu clasa Rectangle are variabilele publice x, y, width, height, origin.
Rectangle patrat = new Rectangle(0, 0, 100, 200);
patrat.x = 10; stare de inconsistenta
patrat.setSize(200, 300); schimba dimensiunea
Distrugerea obiectelor
Un obiect este eliminat din memorie atunci cand nu mai exista nici o referinta(variabile
ale obiectului) la acesta. Referintele sunt eliminate astfel:
- natural atunci cand variabila respectiva iese din domeniul sau de vizibilitare garbage colector
- explicit cand atribuim variabilei valoarea null - metoda finalize

Clase
Reprezinta alaturi de interfete o modalitate de a intoduce noi tipuri de date intr-o
aplicatie.
Declararea:
modificatori class numeclasa

extinde numeSuperclasa
implementeaza interfata{

}
Modificatorii de acces pot fi:
public - poate fi folosita de toate clasele indiferent de pachet
default - poate fi folosita doar de clasele din acelasi pachet
final - nu poate avea subclase
abstract - model pentru o serie de subclase, nu poate fi instantiata
strictfp - precizia calculelor cu nr reale este aceeasi pe orice platforma

Mostenire simpla - o clasa poate avea un singur parinte dar mai multi mostenitori
(subclase).
Corpul unei clase
Este format din:
- declararea si initializarea variabilelor membre - de clasa si de instanta(ale
obiectelor)
- declararea si implementarea metodelor membre - de clasa si de instanta
- declararea si implementarea constructorilor
- declararea unor clase imbiricate - interne
Tipul variabilelor de instanta al obiectelor este dat de clasa care cuprinde obiectele
respective.
Clasa este un tip.

Declararea si implementarea constructorilor


Sunt metode speciale care au acelasi nume cu cel al clasei, nu returneaza nici o
valoare si sunt folositi pentru initializarea obiectelor acelei clase in momentul instantierii
lor.
this (arg)- apeleaza explicit constructorul clasei
super (arg)- apeleaza explicit constructorul superclasei

class A {
int x=1;
A(int x) { this.x = x;}
}
class B extends A {
B() {super(2);}
B(int x) {super.x = x;}
}
Apelul explicit al unui constructor nu poate aparea decat intr-un alt constructor si trebuie
sa fie prima instructiune din constructorul respectiv.
Cu ajutorul constructorului se pot crea obiecte de tip clasa. Dupa definirea
constructorului se pot crea obiecte de tip clasa cu ajutorul operatorului new:
numeObiect = new numeClasa();
Syntaxa pentru declararea unui constructor:
modificatori numeClasa(parametri){
}

Constructorii sunt defapt subrutine speciale. Modificatorii pot fi: public, protected,
private, implicit.

Fiecare clasa are un set de constructori care se ocupa cu initializarea obiectelor nou
create. De exemplu, clasa Rectangle are urmatorii constructori:
public Rectangle()
public Rectangle(int latime, int inaltime)
public Rectangle(int x, int y, int latime, int inaltime)
public Rectangle(Point origine)
public Rectangle(Point origine, int latime, int inaltime)
public Rectangle(Point origine, Dimension dimensiune)
Desi o clasa poate avea mai multi constructori acestia trebuie sa difere prin lista de
argumente primite. De asemenea numele constructorilor trebuie sa fie acelasi cu
numele clasei. Constructorului implicit nu ii sunt atribuite argumente.
Declararea variabilelor
Variabilele membre ale unei clase se declara de obicei inaintea metodelor fiind vizibile
si in metodele respective. Variabilele locale declarate in metode sunt vizibile doar in
acele metode.
Declarare: modificatori tip numeVariabila = valoareinitiala
Modificatorii pot fi: public, private, protected, default, final (valoarea variabilei nu mai
poate fi schimbata - declarare constante), transient (serializarea obiectelor), volatile,
static (variabila de clasa).
Declararea si implementarea subrutinelor
Orice subrutina trebuie sa fie definita in interiorul unei clase.
Declararea unei subrutine:
modificatori tipreturnat numesubrutina (parametrii)
throws exception
{
...
}

Modificatorii pot fi:


public
static - metoda de clasa si nu de instanta
private
protected
default
final - metoda nu poate fi supradefinita
abstract - nu este implemntata si apartine de o clasa abstracta
strictfp
syncronized - fire de executie
native - refoloseste cod scris in alte limbaje
Vizibilitate (acces)

public

protected

private

default

Aceeasi clasa

Clase in acelasi pachet

Subclasa in acelasi pachet

Subclasa in alt pachet

X
(doar prin
mostenire)

Clase in afara pachetului

Apelarea subrutinelor:
numesubrutina (parametrii) - daca subrutina este in aceeasi clasa
numeclasa.numesubrutina (parametrii) - daca subrutina este din alta clasa
Tipreturnat poate fi:

void - nu se returneaza o valoare


type - primitiv sau referinta
Tipul returnat trebuie sa fie acelasi cu tipul declarat in metoda.
O metoda schimba valoarea argumentelor doar daca aceste sunt de tip referinta.
Metode cu nr variabil de argumente
modificatori tipreturnat metoda(tipargumente...args)
EX:
void metoda(Object ... args) {
for (int i=0; i<args.length; i++)
System.out.println (args[i]);
}

Supraincarcarea si supradefinireametodelor - polimorfism


- supraincarcarea (overloading) : in cadrul unei clase pot exista metode cu
acelasi nume cu conditia ca signaturile lor sa fie diferite (lista de argumente primite sa
difere fie prin numarul argumentelor, fie prin tipul lor) astfel incat la apelul functiei cu
acel nume sa se poata stabili in mod unic care dintre ele se executa.
- supradefinirea (overriding): o subclasa poate rescrie o metoda a clasei parinte
prin implementarea unei metode cu acelasi nume si aceea si signatura ca ale
superclasei.

class A {
void metoda() {
System.out.println("A: metoda fara parametru");
}
// Supraincarcare

void metoda(int arg) {


System.out.println("A: metoda cu un parametru");
}
}
class B extends A {
// Supradefinire
void metoda() {
System.out.println("B: metoda fara parametru");
}
}
Membri de instanta si membri de clasa
O clasa Java poate contine doua tipuri de variabile si metode :
de instanta: declarate fara modificatorul static, specifice fiecarei
instante create dintr-o clasa si
de clasa: declarate cu modificatorul static, specifice clasei.
Variabile de instanta si de
Pentru variabilele de clasa (statice) sistemul aloca o singura zona de memorie
la care au acces toate instantele clasei respective, ceea ce nseamna ca
daca un obiect modifica valoarea unei variabile statice ea se va modifica si
pentru toate celelalte obiecte.
NumeClasa.numeVariabilaStatica
Metode de instanta si de clasa
Similar ca la variabile, metodele declarate fara modificatorul static sunt
metode de instanta iar cele declarate cu static sunt metode de clasa (statice).

Diferenta ntre cele doua tipuri de metode este urmatoarea:


metodele de instanta opereaza atat pe variabilele de instanta cat si pe
cele statice ale clasei;
metodele de clasa opereaza doar pe variabilele statice ale clasei.
NumeClasa.numeMetodaStatica
Metodele de instanta nu pot fi apelate decat pentru un obiect al clasei
respective ----nu pe clasa

Numararea obiectelor unei clase


Numararea obiectelor unei clase poate fi facuta extrem de simplu folosind
o variabila statica si este utila n situatiile cand trebuie sa controlam diversi
parametri legati de crearea obiectelor unei clase.
class Exemplu {
static long nrInstante = 0;
Exemplu() {
// Constructorul este apelat la fiecare instantiere
nrInstante ++;
}
}

Clase imbricate

In functie de situatie, definirea unei clase interne se


poate face fie ca membru al clasei de acoperire - caz n care este accesibila
tuturor metodelor, fie local n cadrul unei metode.
class ClasaDeAcoperire{
class ClasaImbricata1 {
// Clasa membru
}
void metoda() {
class ClasaImbricata2 {
// Clasa locala metodei
}
}

O clasa imbricata are un privilegiu special fata de celelalte clase si anume


acces nerestrictionat la toate variabilele clasei de acoperire, chiar daca acestea
sunt private. O clasa declarata locala unei metode va avea acces si la
variabilele finale declarate n metoda respectiva.
Asadar, clasele membru pot fi declarate cu modificatorii public, protected,
private pentru a controla nivelul lor de acces din exterior, ntocmai ca orice
variabila sau metoda mebra a clasei. Pentru clasele imbricate locale unei
metode nu sunt permisi acesti modificatori.
Toate clasele imbricate pot fi declarate folosind modificatorii abstract si
final, semnificatia lor fiind aceeasi ca si n cazul claselor obisnuite.

Clase interne
Spre deosebire de clasele obisnuite, o clasa imbricata poate fi declarata statica
sau nu. O clasa imbricata nestatica se numeste clasa interna.
class ClasaDeAcoperire{
...
class ClasaInterna {
...
}
static class ClasaImbricataStatica {
...
}
}

Diferentierea acestor denumiri se face deoarece:


o clasa imbricata reflecta relatia sintactica a doua clase: codul unei
clase apare n interiorul codului altei clase;
o clasa interna reflecta relatia dintre instantele a doua clase, n sensul
ca o instanta a unei clase interne nu poate exista decat n cadrul unei
instante a clasei de acoperire.

Pentru clasele imbricate


aceste unitati de compilare sunt denumite astfel: numele clasei de

acoperire, urmat de simbolul $ apoi de numele clasei imbricate.


Clase si metode abstracte
Uneori n proiectarea unei aplicatii este necesar sa reprezentam cu ajutorul
claselor concepte abstracte care sa nu poata fi instantiate si care sa foloseasca
doar la dezvoltarea ulterioara a unor clase ce descriu obiecte concrete.
Un exemplu elocvent de folosire a claselor si metodelor abstracte este descrierea
obiectelor grafice ntr-o maniera orientata-obiect.
Obiecte grafice: linii, dreptunghiuri, cercuri, curbe Bezier, etc
Stari comune: pozitia(originea), dimensiunea, culoarea, etc
Comportament: mutare, redimensionare, desenare, colorare, etc.

Clasa Object

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