Introducere in Java
Limbajul a fost inventat in 1990 de James Gostling de Sun Microsystems, insa specificatiile s-au publicat in 1995 . Versiunea oficiala, Java 1.0 a fost distribuita in 1996. Cele mai raspandite medii de programare:
JDK - Sun
Visual J++ - Microsoft
Latte - Borland
Visual Cafι for Java (Symantec),
Visual Age for Java (IBM)
Caracteristici
este independent de
periferic si platforma
are restrictii ce
maresc securitatea in retea
este un limbaj de
programare orientat pe obiecte
este foarte asemnator
cu C++
este compatibil cu
lucrul distribuit in retele
Java si POO
Defmitia lui John Wirth (1973) Program = <date> + <instructiuni>
Defmitia POO:
Program = <obiecte_ce_interactioneaza>
<obiect> = <proprietati> + <metode>
Obiectele
Reprezinta elementele programelor 00; sunt caracterizate de
proprietati = datele
asociate (variabile de instanta)
metode =
corespondentul functiilor din limbaj ele procedurale
Clasele
Sunt utilizate pentru instantierea unuia sau a mai multor obiecte.
class <nume clasa> { <proprietati> <metode>
Pachete
Puterea si atractivitatea limbajului Java consta in pachetele de clase predeflnite. Pachetele au nume
structurate pe schema de directoare ξn care sξnt stocate clasele
compilate.
Interfata Java API (Application Pogramming Interface)
Interfafa API este indispensabila in programarea in limbajul Java si este costituita dintr-o serie de pachete care contin clase si interfefe pentru construirea aplicafiilor si miniaplicafiilor (appllet-urilor).
Pachetele din API sunt urmatoarele:
Java.lang Java.applet j ava.io Java.net j ava.awt j ava.awt.image Java.awt.peer j ava.util
Aceste pachete, a caror descriere succinta urmeaza, pot fi importate in aplicatii prin comanda import
Java.lang
Acest pachet este importat automat in flecare clasa. Pachetul confine clasele corespunzatoare elementelor fundamentale ale limbajului Java, cum ar fi: Object (superclasa abstracts pentru orice clasa Java), Process (controlul proceselor), Thread (superclasa firelor de executie), Boolean, Character, String, Number, Integer, Long, Float, Double etc.
Java, util
Constituie biblioteca de utilitare sistem: Date (data calendaristica), Random (numere aleatoare), interfata Enumeration (obiectul ce o implementeaza poate genera o secvenfa de elemente ce vor putea fi furnizate unul cβte unul).
java.awt
Pachetul AWT (Application Window Toolkit) confine instrumentele programarii ferestrelor si interfafa grafica cu utilizatorul (GUI - Graphics User Interface). Cu acest pachet se pot implementa cadre (Frame, Panel), meniuri, casete de daialog (Dialog, FileDialog), Button, Checkbox, CheckboxGroup, Choice, List, TextField, TextArea, Label etc.
Java.applet
Pachetul este necesar pentru programarea miniaplicafiiolor. Confine clasa Applet si interfefele: AppletContext, AppletStub (necesar implementarii unuor programelor de vizualizare a applet-urilor), AudioClip.
Java.awt.image
Clasele din acest pachet (ColorModel, CropImageFilter,DirectColorModel, ImageFilter, IndexColorModel, PixelGrabber, RGBImageFilter etc.) sunt dedicate prelucrarii obiectelor imagine.
java.awt.peer
Confine numai interfefe necesare pentru implementarea elementelor grafice dependente de platforma din AWT.
java.io
Pachetul contine obiectele necesare programarii operatiilor de intrare/iesire, interfetele pentru fluxuri de intrare/iesire si fisiere
java.net
Pachetul este util in programarea distribuita, obiectele pot interactiona cu protocoale precum sockets, Telnet, FTP, HTTP, etc.
Includerea unui pachet de clase se face cu ajutorul instructiunii import.
import java.awt.*; import java.applet;
unde awt este un acronim de la Application Window Toolkit.
Securitatea in Java
Programele sursa sunt compilate si se obtine formatul bytecode. Inainte de a fi executat de catre interpretor (JVM - Java Virtual Machine) codul este verificat din punctul de vedere a urmatoarelor criterii:
depasirea stivei in
ambele capete
conversii ilegale de
date
valori si parametri
incorecti
modificarea claselor
utilizarea eronata a
claselor
violari de acces
alte activitati
suspecte
Diferente fata de C++
programul este o lista de
clase
nu exista functii
independente
nu exista variabile
externe
nu exista pointeri
nu exista apeluri
externe
nu exista mostenire
multipla
nu exista fisiere
header (*.h)
nu exista destructori;
exista un garbagge collector care disponibilizeaza automat spatiul de
memorie care nu mai este necesar
exista programe care
nu au functia main()
este posibila tratarea
exceptiilor
pot fi aplicatii
standalone (interpretor) sau applet-uri (browser cu masina virtuala Java)
Mostenirea
O clasa poate mosteni proprietatile si metodele altei clase.
class <nume> extends <nume_clasa_parinte> {
Interfete
Clase abstracte ce nu pot contine date sau definitii de metode. Este permisa doar declararea metodelor.
interface <nume_interfata> {
<metode si variabile statice> }
class <nume_clasa> implements <nume_interfata> { <corpul clasei>
Tipuri primitive de date
In Java dimensiunile tipurilor de date sunt aceleasi pe orice platforma pentru a se asigura portabilitatea.
Tipul primitiv |
Dimensiune |
Valoare minima |
Valoare maxima |
Valoare implicita |
Clasa |
boolean |
neprecizat!) |
- |
- |
false |
Boolean |
char |
16-bit |
Unicode 0 |
Unicode 216- 1 |
x\x0000 (null) |
Character |
byte |
8-bit |
-128 |
+127 |
(byte)0 |
Byte |
short |
16-bit |
-213 |
+213-1 |
(short)0 |
Short |
int |
32-bit |
-231 |
+2Si - 1 |
0 |
Integer |
long |
64-bit |
|
+2bS - 1 |
OL |
Long |
float |
32-bit |
IEEE754 |
IEEE754 |
O.Of |
Float |
double |
64-bit |
IEEE754 |
IEEE754 |
O.Od |
Double |
void |
- |
- |
- |
- |
Void |
- |
- |
- |
- |
- |
Biglnteger 2) |
- |
- |
- |
- |
- |
BigDecimal 3) |
Note.
l} dimensiunea pentru boolean trebuie sa asigure stocarea literalilor true si false
2 Clasa Biglnteger permite aceleasi operatii ca si cu int, dar numerele pot fi de orice dimensiune.
Clasa BigDecimal permite aceleasi operatii ca si cu float, dar precizia poate fi oricare. Utilizarea claselor Biglnteger si BigDecimal creste precizia calculelor, dar scade viteza de executie. Important. Toate tipurile aritmetice sunt toate cu semn.
Obiect - tip primitiv
char c = 'x'; // alocare + init
Character r; // numai referinta
Character C = new Character(c); // alocare + init
Character C = new Character('x'); // idem
Tipurile referinta
utilizate pentru a referi un obiect din interiorul altui obiect: o referinta catre o clasa o referinta catre o interfata o referinta catre un tablou
Tipuri de aplicatii Java
Toate aplicatiile Java sunt programe ce cuprind o lista de clase. In urma compilarii rezulta un "cod de octeti" - bytecode - care poate fi executat pe o masina independenta sau preluata de catre un browser de pe retea. Exista deci doua mari categorii de aplicatii:
aplicatii standalone
applet-uri (miniaplicatii)
In ambele categorii executia este insotita de interpretarea codului generat. Spre deosebire de programele scrse in limbaje "native" (C, PASCAL etc.) care sunt traduse in limbajul masinii si apoi executia este directa, programele Java asunt de circa 10 ori mai lente.
Cresterea de viteza este de asteptat de la interpretoare optimizate sau de la compilatoarele JIT (Just In Time) care si-au facut aparitia. O alta posibilitate este relizarea de procesoare care sa poata executa comenzile exprimate in bytecode.
Dezvoltarea de aplicatii Java
JDK (Sun) contine:
javac compilator Java pentru a genera bytecode.
Java interpretor Java pentru a executa bytecode-ul produs de javac.
jre interpretor Java folosit de utilizatorii finali pentru executia programelor
jdb depanator simbolic Java, foarte asemanator cu dbx din UNIX.
javadoc generator de documentatie HTML pentru codul sursa Java.
appletviewer vizualizator de applet-uri, fara a necesita prezenta unui navigator Web.
native2ascii convertor de fisiere scrise in cod non-Unicode Latin-1
jar arhivator de fisiere .class, imagini si sunet intr-o singura arhiva Java (util in cazul applet-
urilor cand printr-o singura tranzactie HTTP se aduc la client
toate resurseler Java asociate unui fisier HTML.
Aplicatii standalone
Sunt aplicatiile ce se executa de un interpretor Java. Clasa care reprezinta o aplicatie standalone trebuie
sa aiba definita metoda main() cu care va incepe executia.
Exemplu
class Aplicatiel
public static void main( String args[] )
System.out.println( "Mult succes in semestrul II !" ); } Pentru a putea executa aceasta aplicatie se parcurg etapele:
se editeaza un fisier
text cu continutul de mai sus
se salveaza cu numele
clasei, Aplicatiel.Java
se compileaza si se
construieste (build) clasa
javac Aplicatiel.Java
(daca nu exista erori, este creat fisierul Aplicatiel.class)
se executa aplicatia (clasa Aplicatiel) cu interpretorul stand-alone
java Aplicatiel
Rezultatul executiei este afisarea
Mult succes in semestrul II !
Analiza aplicatiei.
Contine o singura clasa
class Aplicatiel {
Clasa Aplicatiel contine metoda main () declarata public static void main( String args[] )
public - pentru a putea fi executata aplicatia
static - metoda nu va putea fi modificata de subclase
Metoda are si argumente String args [ ] , un vector de siruri.
Numarul de argumente este dat de valoarea args.length. Argumentele pot fi afisate ca in exemplul urmator.
class Aplicatie2 public static void main( String args[] )
int i ;
System.out.println( "Numarul de argumente este " + args.length )
for(i=0;i<args.length;
System.out.println(i + ". " + args [i] ) } }
Operatoml + aplicat simrilor are ca rezultat concatenarea acestora.
INSTRUCTIUNI
if
if(nota >= 5)
System.out.println("Promovat") ; else
System.out.println("Nepromovat");
Operatorul conditional
<expresie boolecinci>?<expresiel>:<expresie2>
System.out.println( nota>=5?"Promovat":"Nepromovat" ); Asociere else
if(notal >= 5)
if(nota2 >= 5)
System.out.println("Promovate ambele discipline"); else
System.out.println("Nepromovata disciplina 2");
if(notal >= 5) {
if(nota2 >= 5)
System.out.println("Promovate ambele discipline");
}
else
System.out.println("Disciplina 1 nepromovata");
Constructia if else ife
if(nota < 5) System.out.println("Nepromovat"); else if (nota <7) System.out.println("Mediocru"); else if (nota >=7 && nota<9)
System.out.println("Bine") ;
else if (nota ==10 ) System.out.println("Exceptional") ; else
System.out.println("Foarte bine");
Instructiuni compuse
if(nota >= 5)
System.out.println("Promovat") ; else {
System.out.println("Nepromovat");
System.out.print ("Repetitio ");
System.out.print ("mater studiorum est !");
c:\pg\asa\Cursuri_ASA\Cursul_l_Intro>javac nota4.j ava
c:\pg\asa\Cursuri_ASA\Cursul_l_Intro>java nota4
Nepromovat
Repetitio mater studiorum est !
c:\pg\asa\Cursuri_ASA\Cursul_l_Intro>
switch
switch(nota){
case 10: System.out.println("Exceptional") ;
break; case 9: System.out.println("Foarte bine");
break; case 7: case 8: System.out.println("Bine") ;
break; case 6: case 5: System.out.println("Mediocru");
break; default: System.out.println("Nepromovat");
break;
while
while (<expresie booleana>)
<instructiune>
while(nota < 5) nota += 0.5;
etc.
Tratarea exceptiilor. Instructiunea try
try {
// secventa unde poate apare o exceptie
} catch (Exceptiel el) {
// tratare exceptie 1
}
catch (Exceptie2 e2) {
// tratare exceptie 2 } finally { ... }
Primele aplicatii
Citirea §i afisarea in ecou a caracterelor
import java.io.*;
public class ecou sysin {
public static void main(String argv[]) {
byte b;
byte[] a=new byte[81];
int i=0;
try {
while((b=(byte)System.in.read()) ! = '\n')a [i++]=b; } catch(IOException e) {e.printStackTrace();} System.out.println("Ati introdus:"+(new String(a,0,i
Atentie: tablourile in Java sunt obiecte
byte x[]; // nealocat, ci doar declarat in stil C++
byte [] y; // declarat stil Java
byte v[]=new byte[81], //alocare a.length
[ pentiuc@stud |
08:34pm] |
consola$ Java ecou sysin |
abcdefgh. |
|
|
Ati introdus: |
abcdefgh. |
|
[pentiuc@stud |
0 8:35pm] |
consola$ |
Citeste un sir de caractere
O varianta in care se defineste o functie
import java.io.*; public class citsir {
public static String citeste sir() { byte b,a[]=new byte[81]; int i=0;
System.out.print("Citeste un sir:"); try {
while((b=(byte)System.in.read())!='\n')
a[i++]=b;
} catch(IOException e) {e.printStackTrace();} return new String(a,0,i);
public static void main(String argv[]) {
System.out.println("Ati introdus sirul :"+citeste_sir());
ex_citeste
import java.io.*; class citeste {
public static String sir(String text) { byte b,a[]=new byte[81]; int i=0;
System.out.print(text); try {
while((b=(byte)System.in.read())!='\n')a[i++]=b; } catch(IOException e) {e.printStackTrace();} return new String(a,0,i) ; }
public static int intreg(String text) {
return Integer.parselnt(sir(text)); }
public static double real(String text) { return (Double.valueOf(sir(text))).doubleValue();
public class ex_citeste {
public static void main(String argv[]) {
System.out.println("Ati introdus sirul :"+citeste.sir("Dati un
int n=citeste.intreg("\nn=");
System.out.println("Ati introdus n="+ n);
System.out.println("Ati introdus x="+citeste.real("Un real
Clasa are metode statice. Apelul lor <nume_clasa> . <nume_metoda>
[pentiuc@stud 08:47pm] consola$
Java ex_citeste Dati un sir:Exemplu
Ati introdus sirul :Exemplu
n=2003
Ati introdus n=2003 Un real x=9.99 Ati introdus x=9.99 [pentiuc@stud 08:48pm] consola$
Crearea si utilizarea unui pachet Java (package)
Fisierul citeste.java
package citeste;
import java.io.*;
public class citeste {
//
// Argumentul text este un mesaj de avertizare
// (poate fi si un sir nul "")
//
public static String sir(String text) {
byte b,a[]=new byte[81];
int i=0;
if(text!="") System.out.print(text);
try {
while((b=(byte)System.in.read())!='\n')a[i++]=b;
} catch(IOException e) {e.printStackTrace();}
return new String(a,0,i);
public static int intreg(String text) { return Integer.parselnt(sir(text));
public static double real(String text)
return (Double.valueOf(sir(text))).doubleValue(); } }
Fisierul expackcit.java
import citeste.*;
public class ex pack cit {
public static void main(String argv[]) {
System.out.println("Ati introdus sirul :"+citeste.sir("Dati un sir:"));
int n=citeste.intreg("\nlntroduceti un intreg\nn=");
System.out.println("Ati introdus n="+ n);
System.out.println("Ati introdus x="+citeste.real("Un real
System.out.println("Un double fara mesaj de avertizare\n"); double y=citeste.real(""); System.out.print(y);
Exemplul de executle nr.1
[pentiuc@stud 09:06pm] consola$ Java ex_pack_cit
Dati un sir:abc ABCD 123
Ati introdus sirul :abc ABCD 123
Introduceti un intreg
n=l
Ati introdus n=l
Un real x=-l.200987
Ati introdus x=-l.200987
Un double fara mesaj de avertizare
3.1415926
3.1415926[pentiuc@stud 09:06pm] consola$
Daca se actioneaza tasta Enter pentru ultima introducere a unui double fara
mesaj de avertizare, va apare o exceptie
Exemplul de executie nr.2
[pentiuc@stud 09:05pm] consola$ Java ex_pack_cit
Dati un sir:xyz abc 123
Ati introdus sirul : xyz abc 123
Introduceti un intreg n=1999
Ati introdus n=1999
Un real x=1.999
Ati introdus x=1.999
Un double fara mesaj de avertizare
<------ Enter
j ava.lang.NumberFormatException:
at j ava.lang.Double.valueOf(Double.j ava) at citeste.citeste.real(citeste.Java:25) at ex pack cit.main(ex pack cit.java:9)
[pentiuc@stud 09:05pm] consola$
Se poate observa ca
exceptia a aparut la apelul Double . valueOf (Double . j ava), continutul
liniilor precizate in stiva fiind urmatoral:
citeste.Java:25
return (Double.valueOf(sir(text))).doubleValue(); ex_pack_cit.j ava:9
double y=citeste.real("");