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("");