0% au considerat acest document util (0 voturi)
176 vizualizări50 pagini

! Help Java

Documentul prezintă pașii necesari pentru a crea și rula un program Java din linia de comandă. De asemenea, oferă informații despre compilarea și rularea programelor Java, precum și resurse utile pentru învățarea limbajului Java.

Încărcat de

Mircea Tirziu
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOC, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
176 vizualizări50 pagini

! Help Java

Documentul prezintă pașii necesari pentru a crea și rula un program Java din linia de comandă. De asemenea, oferă informații despre compilarea și rularea programelor Java, precum și resurse utile pentru învățarea limbajului Java.

Încărcat de

Mircea Tirziu
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOC, PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 50

Acest document este ! HELP JAVA.

doc

Cum creez şi rulez un program java în linia de comandă


1) Scriu programul
public class Test
{
public static void main(String[] args)
{
System.out.println("Buna ziua");
}
}

2) Am voie să pun o singură clasă publică. Ea va avea numele fişierului, deci salvez sub
numele Test.java
3) Instalez JDK
4) Ca să găsească calea către compilator:
a. O găsesc în Program file\Java
b. O adaug intr-un fişier bat
i. set path=%path%;C:\Program Files\Java\jdk1.8.0_45\bin
c. Sau
i. Computer
ii. Proprietăţi
iii. Advanced system setings
iv. Environment variables
v. Path. Este activă după reponirea command prompt.
5) javac Test.java
6) java Test

Tutoriale> http://docs.oracle.com/javase/tutorial/

În ce ordine să învăț: http://docs.oracle.com/javase/tutorial/tutorialLearningPaths.html

Cea mai bună carte este a lui Frasinaru


PROGRAMARE JAVA Frasinaru totE@@. Ea contine explicatii, cod, cod separat, totul.
Cartea de bază este
PROGRAMARE Cristian_Frasinaru-Curs_practic_de_Java@@.pdf

Pentru programarea grafică a applet-ului este bună


H:\! ! ! ! ! De scris\PROGRAMARE JAVA Doc Examples Reference
Glossary@@\PROGRAMARE Java AWT Reference Zukowski

JAVA J2EETutorial.pdf

Foarte multe exemple H:\! ! ! ! ! De scris\JAVA 14 code\samples

ÎN LABORATOARELE LUI PAIN sunt multe INfORMAŢII UTILE.

Documentatie pachete, clase: Google Java API Reference

Java: program classic: main şi altele


Applet: metode pentru evenimente (doc Pain).
Programul de bază este automat un obiect.

Interfaţa este mai mult ca o clasă abstract care are numai metode abstracte. Pentru că în Java
nu este permisă moştenirea multiplă. Interfeţele permit realizarea de legături.
class NumeClasa implements Interfata1, Interfata2, ...
interface NumeInterfata extends Interfata1, Interfata2, ...
class FirstApp {
public static void main( String args[]) {
System.out.println("Hello world");
}
}

Salvarea fisierelor sursa


Se va face în fisiere cu extensia .java
Fiserul care contine codul sursa al clasei primare trebuie sa aiba acelasi nume cu clasa
primara a aplicatiei (clasa care contine metoda main)
Applet
Scriere
javac FirstApp.java -> FirstApp.classcompilare
java FirstApp rulare
import java.awt.* ;
import java.applet.* ;
public class FirstApplet extends Applet {
Image img;
public void init() {
img = getImage(getCodeBase(), "taz.gif");
}
public void paint (Graphics g) {
g.drawImage(img, 0, 0, this);
g.drawOval(100,0,150,50);
g.drawString("Hello! My name is Taz!", 110, 25);
}
}

Compilare javac FirstApplet.java -> FirstApplet.class


Creearea unui fisier HTML pentru miniaplicatie (exemplu.html)
<html>
<head>
<title>First Java Applet</title>
</head>
<body>
<applet code=FirstApplet.class width=400 height=400>
</applet>
</body>
</html>

Vizualizarea appletului

appletviewer exemplu.html
Unicode
\u0030 - \u0039 : cifre ISO-Latin 0 - 9
\u0660 - \u0669 : cifre arabic-indic 0 - 9
\u4e00 - \u9fff : litere din alfabetul Han (Chinez, Japonez, Coreean)
Identificatorii
Sunt secvente nelimitate de litere si cifre Unicode, epand cu o litera. Identificatorii nu au
voie sa fie identici cu cuvintele rezervate.
Variabilele pot avea ca tip fie un tip primitiv de data, fie o referinta la un obiect.
final double PI = 3.14;
int valoare = 100;
long numarElemente = 12345678L;
Obs: Spre deosebire de C++ nu este permisa ascunderea unei variabile :
int x=12;
{
int x=96; //ilegal
}
Atentie: In Java nu exista goto. Se pot a defini etichete de forma nume_eticheta:, folosite
în expresii de genul: break nume_eticheata sau continue nume_eticheta
Exemplu:
i=0;
eticheta:
while (i<10) {
System.out.println("i="+i);
j=0;
while (j<10) {
j++;
if (j==5) continue eticheta;
if (j==7) break eticheta;
System.out.println("j="+j);
}
i++;
}

Crearea unui vector


Declararea vectorului
Tip[] numeVector; sau
Tip numeVector[];
Ex: int[] intregi;
String adrese[];
Instantierea
Se realizeaza prin intermediul operatorului new si are ca efect alocarea memoriei pentru
vector, mai precis specificarea numarului maxim de elemente pe care îl va avea vectorul;
numeVector = new Tip[dimensiune];
Ex: v = new int[10]; //se aloca spatiu pentru 10 intregi
adrese = new String[100];
Obs: declararea si instantierea unui vector pot fi facute simultan astfel:
Tip[] numeVector = new Tip[dimensiune];
Initializarea (optional)
Dupa declararea unui vector, acesta poate fi initializat, adica elementele sale pot primi niste
valori initiale, evident daca este cazul pentru asa ceva. In acest caz instantierea lipseste,
alocarea memoriei facâu-se automat În functie de numarul de elemente cu care se
initializeaza vectorul.
Ex: String culori[] = {"Rosu", "Galben", "Verde"};
int []factorial = {1, 1, 2, 6, 24, 120};
Observatii:
Primul indice al unui vector este 0, deci pozitiile unui vector cu n elemente vor fi cuprinse
re 0 si n-1
Nu sunt permise constructii de genul Tip numeVector[dimensiune], alocarea memoriei
fac⮤u-se doar prin intermediul opearatorului new.
Ex: int v[10]; //ilegal
int v[] = new int[10]; //corect
Dimensiunea unui vector
Cu ajutorul cuvâului cheie length se poate afla dimensiunea unui vector.
int []a = new int[5];
a.length are valoarea 5 este o proprietate a obiectului
int m = new int[5][10];
m[0].length are valoarea 10
Copierea vectorilor
Copierea unui vector în alt vector se face cu ajutorul metodei System.arraycopy:
int x[] = {1, 2, 3, 4};
int y[] = new int[4];
System.arraycopy(x,0,y,0,x.length);
Vectori cu dimensiune variabila
Implementarea vectorilor cu numar variabil de elemente este oferita de clasa Vector din
pachetul java.util. Un obiect de tip Vector contine numai elemente de tip Object.
In Java, un sir de caractere poate fi reprezentat printr-un vector format din elemente de tip
char, un obiect de tip String sau un obiect de tip StringBuffer.
System.out.print("Vectorul v are" + v.length + " elemente")
java NumeAplicatie [arg1 arg2 . . . argn]
dacă paramtrul conţine sp, se pune între „
public static void main ( String args[])
numarArgumente = args.length ;

Spre deosebire ce C/C++ vectorul primit de metoda main nu


contine pe prima pozitie numele aplicatiei

public class Echo {


public static void main (String[] args) {
for (int i = 0; i < args.length; i++)
System.out.println(args[i]);
}
}
Argumente numerice la linia de comanda
Argumentele de la linia de comanda sunt primite sub forma unui vector de siruri (obiecte de
tip String). In cazul în care unele dintre acestea reprezinta valori numerice ele vor trebui
convertite din siruri în numere. Acest lucru se realizeaza cu metode de tipul parseXXX
aflate în clasa corespunzatoare tipului în care vrem sa facem conversia: Integer, Float,
Double, etc.
Sa consideram, de exemplu, ca aplicatia Power ridica un numar real la o putere reaga,
argumentele fiind trimise de la linia de comanda:
java Power "12.1" "3" //ridica 12.1 la puterea 3
Conversia celor doua argumente în numere se va face astfel:
double numar;
int putere;
numar = Double.parseDouble(args[0]);
putere = Integer.parseInt(args[1]);
Metodele de tipul parseXXX pot produce exceptii (erori) de tipul NumberFormatException
în cazul în care sirul primit ca parametru nu reprezinta un numar de tipul respectiv.

Rectangle patrat = new Rectangle(0, 0, 100, 200);

Alocarea este obligatorie şi se face prin new.


args.length
System.out.println("N");
System.exit(-1);

System.out.println("Rezultat=" + Math.pow(numar, putere));

Tipurile noi de date se introduc prin =


 Clase
 Interfeţe
Declararea unei clase respec㢠următorul format general:
[public][abstract][final]class NumeClasa
[extends NumeSuperclasa]
[implements Interfata1 [, Interfata2 ... ]]
{
// Corpul clasei
}

class B extends A {...}


// A este superclasa clasei B
// B este o subclasa a clasei A
Implementarea metodelor unei clase trebuie să se facă obligatoriu în corpul clasei.

class Exemplu {
double x;
protected static int n;
public String s = "abcd";
private Point p = new Point(10, 10);
final static long MAX = 100000L;
}

Variabilă static = variabila nu de instanţă, ci de clasă


Variabilă final = constant. Ea poate fi definită şi ulterior, dar apoi nu mai poate fi
modificată.
Variabilă transient = nu participă la serializarea ob
Variabilă volatile = nu participă la unele optimizări la compilare

This = referinţă la obiectul current. Sunt în clasa AAA şi mă refer la variabila x. În loc de
AAA.x pot scrie this.x
Super = referinţă la obiectul părinte

class A { int x; A() {


this(0);
}
A(int x) {
this.x = x;
}
void metoda() {
x ++;
}
}

class B extends A {
B() {
this(0);
}
B(int x) {
super(x); System.out.println(x);
}

void metoda() {
super.metoda();
System.out.println(x);
}
[modificatori] TipReturnat numeMetoda ( [argumente] )
[throws TipExceptie1, TipExceptie2, ...]
{
// Corpul metodei
}
O metoda abstracta este o metoda care nu are implementare si trebuie obligatoriu sa faca
parte dintr-o clasa abstracta.

native
In cazul îın care avem o librarie importantă de funcţii scrise în alt limbaj de programare,
cum ar fi C, C++ si limbajul de asamblare, acestea pot fi refolosite din programele
Java. Tehnologia care permite acest lucru se numeşste JNI (Java Native Interface)¸ si
permite asocierea dintre metode Java declarate cu native¸ si metode native scrise în
limbajele de programare menţtionate.
synchronized
Este folosit în cazul în care se lucrează cu mai multe fire de execuţie iar metoda respectivă
gestionează resurse comune. Are ca efect construirea unui monitor care nu permite
executarea metodei, la un moment dat, decât unui singur fir de execuţie.
Metodele care nu returnează nimic au tipul void. Obligatoriu se scrie el.

Dacă o metodă trebuie să returneze o valoare acest lucru se realizează prin intermediul
instrucţiunii return, care trebuie să apară în toate situaţiile de terminare a funcţiei.

double radical(double x) {
if (x >= 0)
return Math.sqrt(x);
else {
System.out.println("Argument negativ !");
// Eroare la compilare
// Lipseste return pe aceasta ramura
}
}

Pentru a afla starea obiectului transmiterea prin valoare nu este bună. Se foloseşte o clasă:
// Varianta corecta class Param {
public int x, y, raza;
}

class Cerc {
private int x, y, raza;
public void aflaParametri(Param param) {
param.x = x; param.y = y; param.raza = raza;
}
}
Altă metodă:
Se află valorile cu funcţia şi se setează cu this.
class Cerc {
private int x, y, raza; public int getX() { return x;
}
public void setX(int x) {
this.x = x;
}
...
}

Nu există variabile globale. Se folosesc variabile de clasă (nu de instanţă, care ar trebui tot
timpul realocate).
funcţia sqrt care extrage radicalul unui număr şi care se găseşte în clasa Math. Dacă
nu ar fi fost funcţie de clasă, apelul ei ar fi trebuit făcut astfel (incorect, de altfel):

// Incorect !
Math obj = new Math();
double rad = obj.sqrt(121);

ceea ce ar fi fost extrem de neplăcut... Fiind însă metodă statică ea poate fi apelată prin:
Math.sqrt(121) .

LASĂ ÎMBRICATĂ:
class ClasaDeAcoperire{
class ClasaImbricata1 {
// Clasa membru
}
void metoda() {
class ClasaImbricata2 {
// Clasa locala metodei
}
}
Clase şi metode abstracte. Am Graphiscs. O serie de operaţii sunt comune: schimbarea culorii,
poziţia, etc. Altele sunt specfice, cum este desenarea figurii, care variază de la desen la desen:
cerc, pătrat. Declar desenarea ca abstract şi pun toate metodele neabstracte şi abstracte într-o cl
absteactă. Ea este superclasă pe baza căreia construiesc clasele cerc, pătrat, unde defines modul
de desenare.

Fluxuri import java.io.*;


import java.io.*;
Listing 4.1: Copierea unui fisier
public class Copiere {
public static void main(String[] args) {

try {
FileReader = ne FileReader("in.txt
FileWriter = ne FileWriter("out.tx
out w t");
w h i l e ( ( c = i innt . rc e; a d ( ) ) ! = -1)
out.write(c);

in.close();
out.close();

} catch(IOException e) {
System.err.println("Eroare la operatiile cu fisiere!");
e.printStackTrace();
}
}
}

Listing 4.2: Concatenarea a două fişiere


/* Concatenarea a doua fisiere
ale caror nume sunt primite de la linia de comanda.
Rezultatul concatenarii este afisat pe ecran.
*/
import java.io.*;
public class Concatenare {
public static void main(String args[]) {
i f ( a r g s . l e n g t h <= 1 ) {
S y s tem . o u t. p r in t ln ( "Ar g u m en te i n su f i cie n te! " ) ;
System.exit(-1);
}
try {
FileInputStream f1 = new FileInputStream(args[0]);
FileInputStream f2 = new FileInputStream(args[1]);
S e q u e n c e I n p u t S t r e a m s = n e w S e q u e n c e I n p u t S t r e a m ( f1 , f 2
)
;
int c;
w h i l e ( ( c = s . r e a d ( ) ) ! = -1) S y s t e m . o u t . p r i n t ( ( c h a r ) c ) ;
s.close();
//f1 si f2 sunt inchise automat
} catch (IOException e) {
e.printStackTrace();
}
}
}

Clasa File se referă la fişiere şi directoare.

Listing 4.6: Listarea conţinutului unui director


/* Programul listeaza fisierele si subdirectoarele unui
director.
Pentru fiecare din ele vor fi afisate diverse informatii.
Numele directorului este primit ca argument de la
linia de comanda, sau este directorul curent.
*/

import java.io.*;
120 CAPITOLUL 4. INTRĂRI SI IEŞIRI

import java.util.*;
public class ListareDirector {

private static void info(File f) {


/ /Af i se a z a i n f o r m a t i i d e s p r e u n fisier sau director
String nume = f.getName();
if(f.isFile())
System.out.println("Fisier: " + nume);
else
if(f.isDirectory())
System.out.println("Director: " + nume);

System.out.println(
"Ca le absolut a: " + f.getAbsolutePath() +
"\n Poate citi: " + f.canRead() +
"\n Poate scrie: " + f.canWrite() +
"\n Parinte: " + f.getParent() +"\n Cale: " + f.getPath() +
"\n Lungime: " + f.length() +
"\n Data ultimei modificari: " +
n e w D a t e ( f . l a s t M o d i f i e d () ) ) ;
System.out.println("--------------");
}

public static void main(String[] args) {


String nume;
if (args.length == 0)
nume = "."; //directorul curent
else
nume = args[0];

try {
File director = new File(nume);
File[] continut = director.listFiles();

for(int i = 0; i < continut.length; i++)


info(continut[i]);

} catch(Exception e) {
e.printStackTrace();
}
}
}

Inbterfaţă = colecţie de metode fără implementare şi declaraţii de constante. O clasă


abstract poate conţine şi metode definite, aici nu este definită niciuna.
Utilitatea interfeţelor

După cum am văzut, o interfaţă defineşte un protocol ce poate fi implementat


de orice clasă, indiferent de ierarhia de clase din care face parte. Interfeţele sunt utile
pentru:
• definirea unor similaritati între clase independente fără a forţa artificial
o legatură între ele;
• asigură că toate clasele care implementează o interfaţă pun la dipoziţie metodele
specificate în interfaţă - de aici rezultă posibilitatea imple- mentării unor clase prin mai
multe modalităţi şi folosirea lor într-o manieră unitară;
• definirea unor grupuri de constante;
• transmiterea metodelor ca parametri;

PACHET = COLECŢIE DE CLASE ŞI INTERFEŢE. BIBLIOTECI.


• java.lang - clasele de bază ale limbajului Java

• java.io - intrări/ieşiri, lucrul cu fişiere

• java.util - clase şi interfeţe utile

• java.applet - dezvoltarea de appleturi

145
• java.awt - interfaţa grafică cu utilizatorul

• java.awt.event - mecanismele de tratare e evenimentelor generate de utilizator

• java.beans - scrierea de componente reutilizabile

• java.net - programare de reţea

• java.sql - lucrul cu baze de date

• java.rmi - execuţie la distanţă Remote Message Interface

• java.security - mecanisme de securitate: criptare, autentificare

• java.math - operaţii matematice cu numere mari

• java.text - lucrul cu texte, date şi numere independent de limbă

• java.lang.reflect - introspecţie

• javax.swing - interfaţa grafică cu utilizatorul, mult îmbogăţită faţă de


AWT.

Pentru a folosi o clasă:


Putem să o prefixăm cu numele pachetului de fiecare dată când o folosim
Putem să importăm pachetul, apoi putem să scriem doar numele pachetului
import java.awt.*;

Proiecte:
Numele fişierului .java este numele clasei.
Poate exista numai o clasă public pe pachet
Clasele dintr-un pachet sunt în directoare cu numele pachetelor

6.2.2 Organizarea unităţilor de compilare (.class)

In urma compilării fişierelor sursă vor fi generate unităţi de compilare pentru fiecare clasă
şi interfaţă din fişierele sursă. După cum ştim acestea au extensia
.class şi numele scurt al clasei sau interfeţei respective.
Spre deosebire de organizarea surselor, un fişier .class trebuie să se
gaseasca într-o ierarhie de directoare care să reflecte numele pachetului din care face parte
clasa respectivă.
Implicit, în urma compilării fişierele sursă şi unităţile de compilare se
găsesc în acelaşi director, însă ele pot fi apoi organizate separat. Este recomandat însă ca
această separare să fie făcută automat la compilare.
Revenind la exemplul de mai sus, vom avea următoarea organizare:

/matematica
/clase
/geometrie
/plan Poligon.class Cerc.class
/spatiu
Poliedru.class
Sfera.class
/algebra
Grup.class
/analiza
Functie.class

Matematica.class

Crearea acestei structuri ierarhice este facută automat de către compilator.


In directorul aplicatiei (matematica) creăm subdirectorul clase şi dăm co- manda:

javac -sourcepath surse surse/Matematica.java -d clase sau


javac -classpath surse surse/Matematica.java -d clase

Opţiunea -d specifică directorul rădăcină al ierarhiei de clase. In lipsa lui, fiecare unitate de
compilare va fi plasată în acelaşi director cu fişierul său sursă.
Deoarece compilăm clasa principală a plicaţiei, vor fi compilate în cascadă
toate clasele referite de aceasta, dar numai acestea. In cazul în care dorim să
compilăm explicit toate fişierele java dintr-un anumit director, de exemplu
surse/geometrie/plan, putem folosi expresia:

javac surse/geometrie/plan/*.java -d clase

In concluzie, o organizare eficientă a fişierelor aplicaţiei ar arăta astfel:

/matematica
/surse
/clase compile.bat
(javac -sourcepath surse surse/Matematica.java -d clase)
run.bat
(java -classpath clase Matematica)

Serializare = transformare obiect în şir octeţi nu salvează doar imaginea unui obiect ci şi
toate referinţele la alte obiecte pe care acesta le conţine.

Un fir de execuţie trebuie să ruleze în cadrul unui process.


Care ar fi însă deosebirile între un fir de execuţie şi un proces ? In primul, rând deosebirea
majoră constă în faptul că firele de execuţie nu pot rula decât
în cadrul unui proces. O altă deosebire rezultă din faptul că fiecare proces are propria sa
memorie (propriul său spaţiu de adrese) iar la crearea unui nou proces (fork) este realizată o
copie exactă a procesului părinte: cod şi date, în timp ce la crearea unui fir nu este copiat
decât codul procesului părinte, toate firele de execuţie având acces la aceleaşi date, datele
procesului original. Aşadar, un fir mai poate fi privit şi ca un context de execuţie în cadrul
unui proces.
getCodeBase – dă URL-ul directorului unde este applet-ul
getDocumentBase – HTML-ul

Point []vector = new Point[10]; Class c = vector.getClass();


System.out.println(c.getComponentType());
// Va afisa: class java.awt.Point

Program applet preluare date din HTML


import java.awt.*;
import java.applet.*;
public class BarChart extends Applet
{
int n=0;
String label[];
int value[];
public void init()
{
try
{
n=Integer.parseInt(getParameter("columns"));
label=new String[n];
value=new int[n];
label[0]=getParameter("label1");
label[1]=getParameter("label2");
label[2]=getParameter("label3");
label[3]=getParameter("label4");
value[0]=Integer.parseInt(getParameter("c1"));
value[1]=Integer.parseInt(getParameter("c2"));
value[2]=Integer.parseInt(getParameter("c3"));
value[3]=Integer.parseInt(getParameter("c4"));
}catch(NumberFormatException e){}
}

<HTML>
<APPLET
CODE=BarChart.class
WIDTH=300
HEIGHT=250>
<PARAM NAME="columns" VALUE="4">
<PARAM NAME="c1" VALUE="110">
<PARAM NAME="c2" VALUE="150">
<PARAM NAME="c3" VALUE="100">
<PARAM NAME="c4" VALUE="170">
<PARAM NAME="label1" VALUE=“2000">
<PARAM NAME="label2" VALUE=" 2001">
<PARAM NAME="label3" VALUE=" 2002">
<PARAM NAME="label4" VALUE=" 2003">
</APPLET>
</HTML>

Pain Laborator5_CreareaUneiAnimatii.doc
import java.awt.*;
import java.applet.*;

public class Scroll extends Applet implements Runnable


{ // declaratie clasa Scroll
private int Xm, Ym, x, y, lit, i=0; // coordonate
private String s, ts[] = new String[3]; // siruri de caractere
Thread t=null; // declarare fir de executie

public void start(){ // metoda start


t=new Thread(this); // instantiere fir de executie
t.start(); // pornire
}
void get_size(){ // preluare dimensiuni applet
Ym=size().height; // inaltime
Xm=size().width; // latime
}
public void init(){ // metoda init()
get_size(); // preluare dimensiuni applet
x=Xm; // setare latime
y=(Ym+lit)/2; // inaltime
lit=28; // setare dimensiune carctere

}
public void run(){ // metoda run()
while(true){ // bucla infinita
repaint(); // reapelare paint(). Obligatoriu, altfel nu se misca
x=x+10; // pas de avans
if(x>(Xm-100)){ // testare pozitie
x=0; // fata de capatul cursei
i=(i+1)%3; // rotatie mesaje
}
try{ // testare situatie de exceptie
Thread.sleep(100); // pauza intre doua afisari. Cere
obligatoriu try catch
}catch(InterruptedException e){ // tratare exceptie
}
}
}
public void paint(Graphics g){ // metoda paint()
get_size(); // preluare dimensiuni applet
this.setBackground(Color.black); // setare culoare fond
this.setForeground(Color.yellow); // setare culoare scris
g.setColor(Color.orange);
Font f=new Font("Timesn",Font.BOLD,lit); // definire caractere
g.setFont(f); // setare scris
g.drawString("Move",x,y-5); // scriere mesaje protected
ecran
Font f1=new Font("Arial", Font.BOLD, 9);
g.setColor(Color.orange);
g.fillRect(x, y, 70, 70);
g.setColor(Color.white);
g.setFont(f1);
g.drawString("TM", x+58, y+64);
}
}

Pain laboratorul 1
Apelul metodelor statice si nestatice

class ExpSwitch {
static void numara(int i) {
switch (i) {
case 1 : IO.write("unu ");
case 2 : IO.write("doi ");
case 3 : IO.writeln("trei");
}
}

public static void main (String[] args) {


numara(3); numara(2); numara(1);
/* ExpSwitch s=new ExpSwitch();
s.numara(3); s.numara(2); s.numara(1);*/
}
}

va produce la ieşire:
trei
doi trei
unu doi trei

Obs: metodele clasei apelate direct în main trebuie sa fie statice (cu modificatorul static).
Altfel trebuia creat un obiect de tip ExpSwitch pentru a putea apela metoda numara a
acestui obiect, aşa cum se arată în partea de program comentată

class DreptunghiMain{
public static void main(String arg[]){
//cream un dreptunghi
Dreptunghi d;
double a;
d=new Dreptunghi(3,5);
System.out.print("Dreptunghi initial: ");
d.afisare();
a=d.arie();
System.out.println("arie="+a);

//cream un nou dreptunghi, de dimensiuni citite de la tastatura


double x,y ;
System.out.println("Introduceti lungimea si latimea noului dreptunghi");
x=IO.read();
y=IO.read();
Dreptunghi d2=new Dreptunghi(x,y);
System.out.print("Noul dreptunghi: ");
d2.afisare();
System.out.println("arie="+d2.arie());

if (d.maiMare(d2))
System.out.println("Noul dreptunghi e mai mare");
else
System.out.println("Dreptunghiul initial e mai mare");

d2=new Dreptunghi(); //se va apela constructorul fara argumente


System.out.print("Dreptunghi unitate: ");
d2.afisare();

}
}

Tablourile multidimensionale trebuie gândite ca tablouri unidimensionale ale căror


elemente sunt tablouri unidimensionale etc. De aceea referirea la un element al unui tablou
multidimensional a se face prin:
a[indice1]...[indicen].
Este suficient să reducem discuţia la tablouri bidimensionale, generalizarea fiind
imediată. Să considerăm următorul exemplu:
int[][] a = new int[3][];
a[0] = new int[3];
a[1] = new int[4];
a[2] = new int[2];
Ia naştere astfel un tablou de forma:
ceea ce arată că în Java tablourile nu sunt neapărat dreptunghiulare; aceasta conduce
desigur la economie de spaţiu.
Evident, a[1].length=4.
La aceeaşi structură se poate ajunge şi printr-o iniţializare efectivă:
int[][] a = { {0,1,2}, {1,2,3,4}, {2,3} };
care în plus atribuie valori elementelor tabloului.
Applet/ul are deja un set de metode cu nume prederfinite, la fel ca evenimentele din Visual
vBasic
System.out.println("start");
Afi;eay[ ]n fereastra consola (si nu in fereastra applet-ului. Trebuie cautata).
Metodele se pot defini numai in interiorul claselor.

Exemplu complet de program şi setări proiect în IDE


Clasa = camp, metode, constructori
Lansare program
New project/Java/Java application
Project name doi
Jos el numeşte clasa principală Main, aşa că aşa o numesc şi eu. Dacă schimb numele jos, o
pot folosi cu noul nume: unu.unu. Daca schimb ulterior poate nu merge, asa ca de la inceput
pun corect jos: <nume pachet>.<nume clasa>
package unu;
import java.io.*; // Nu este folosit şi în IDE apare o sferă portocalie ca să arate aceasta
public class Main {
public static void main(String[] args){
System.out.println("Sunt "+args.length+" argumente:");
for(int i=0; i<args.length; i++)
System.out.println(args[i]);
}
}
Un fişier Java poate avea numai 1 clasă publică
Pentru a adauga paremetri la run, în căsuţa de sus centru <default config> selectez
customize.
Compilare F9
Rulare CTRL-SHIFT-F5
Fişierul care conţine programul poate fi editat în Notepad şi are extensia .JAVA
Fişierul compilat are extensia .CLASS
Litere mari <> litere mici
Compilare în linia de comandă: javac unu.java. Javac se găseşte în C:\Program
Files\Java\jdk1.6.0_11, nu în JavaBeans
Rulare în linia de comandă: java <clasă fără extensia class> <lista argumente>
Java unu Ion Maria Popescu
Dacă argumntele conţin spaţii, se pun între ghilimele java unu “Mircea Tirziu”
Conversia în numere: Integer.parseInt(sir), Double.parseDouble(sir)
Radical: x = Math.sqrt(25);

Obiectele sunt referinţe


Tipuri de date: byte (1), short (2), int (4), long (8), float (4), double (8), Boolean (true,
false), char (2, Unicode)
Constantă long: 123L
Conform standardului IEEE 754, sunt incluşi şi literali pentru "nu este un număr"
(împărţire cu zero) , - şi +. Double.NaN, Double.NEGATIVE_INFINITY şi
Double.POSITIVE_INFINITY
(pentru aritmetica pe 8 octeţi), Float.NaN, Float.NEGATIVE_INFINITY şi
Float.POSITIVE_INFINITY (pentru aritmetica pe 4 octeţi).
\uxxxx character Unicode
Variabilele claselor rimesc valori implicite: o, false, null
Se admite cast (tip dată) variabilă
Operator Obiect instanceof clasa
Acces la metode şi variabile: private, protected, Friendly (implicit), public
Variabilă:
Static aparţine clasei, exiastă şi dacă nu s-a făcut nici o inst
Volatile, poate să nu rămână, ea poate fi modif asincr
Final, constant

Acest ex arată că pot modifica un şir declarat cu String:


package salut;
public class Main {
static String strUtilizator = "Ion";

public static void main(String args[]) {


String strMesaj = "Buna ziua";
if(args.length >0) {
strUtilizator = args[0];
}
strMesaj+=" "+strUtilizator+"!";
System.out.println(strMesaj);
}
}

Schimb de mesaje = comunicare dintre obiecte

Public constructor – nu returnează nimic


Exemplu
/**
* Clasa Persoana descrie datele si comportamentul unei persoane
*/
public class Persoana {
/* Atributele clasei */
String nume; // numele de familie
String prenume; // prenumele persoanei
int varsta; // varsta in ani impliniti
double inaltimea; // inaltimea persoanei in cm
char sex; // sexul persoanei. Valori posibile 'F' sau 'M'
/* Metodele clasei */
/** Constructor al clasei Persoana - cu toate datele
* @param numePers numele persoanei
* @param prenumePers prenumele persoanei
* @param varstaPers varsta persoanei
* @param inaltimaPers inaltimea persoanei
* @param sexPers sexul persoanei
*/
public Persoana( String numePers, String prenumePers,
int varstaPers, double inaltimeaPers, char sexPers) {
nume = numePers;
prenume = prenumePers;
varsta = varstaPers;
inaltimea = inaltimeaPers;
sex = Character.toUpperCase(sexPers);
if (sex!='F' && sex!='M')
sex = 'F';
}
/** Constructor al clasei Persoana - doar numele
* @param numePers numele persoanei
* @param prenumePers prenumele persoanei
*/
public Persoana( String numePers, String prenumePers ) {
nume = numePers;
prenume = prenumePers;
varsta = 0;
inaltimea = 0;
sex = 'F';
}
/** Metoda afiseazaInformatii - afiseaza pe consola informatiile despre persoana
*/
void afiseazaInformatii() {
System.out.println("- Date despre persoana -");
System.out.println("Numele: " + nume + " "+prenume);
System.out.println("Varsta: " + varsta);
System.out.println("Inaltimea: " + inaltimea);
System.out.println("Sexul: " + ((sex=='F') ? "feminin" : "masculin"));
}
}
Atributele se declară de obicei private şi metodele se declară publice

Clasa Object este clasa care generea[ toate celelalte clase.


Declaraţiile de mai jos sunt echivalente:
class Exemplu {}
class Exemplu extends Object {}

try {
// Instructiuni care pot genera exceptii
}
catch (
TipExceptie1 variabila) {
// Tratarea exceptiilor de tipul 1
}
catch (TipExceptie2 variabila) {
// Tratarea exceptiilor de tipul 2
}
...
finally {
// Cod care se executa indiferent
// daca apar sau nu exceptii
}

Program de citire a unui fişier şi de afişare pe monitor cu prinderea şi aruncarea excepţiilor


Fişierul se afla in folderol în care pune proiectul.
package citirefisier;
import java.io.*;
public class CitireFisier {
public static void citesteFisier ( String fis) {
FileReader f = null ;
try {
// Deschidem fisierul
System.out.println ("Deschidem fisierul " + fis);
f = new FileReader (fis );
// Citim si afisam fisierul caracter cu caracter
int c;
while ( (c=f.read ()) != -1)
System.out.print ((char)c);
} catch ( FileNotFoundException e) {
// Tratam un tip de exceptie
System.err.println ("Fisierul nu a fost gasit !");
System.err.println ("Exceptie : " + e. getMessage ());
System.exit (1);
} catch ( IOException e) {
// Tratam alt tip de exceptie
System.out.println ("Eroare la citirea din fisier !");
e. printStackTrace ();
} finally {
if (f != null ) {
// Inchidem fisierul
System.out.println ("\nInchidem fisierul .");
try {
f. close ();
} catch ( IOException e) {
System.err.println ("Fisierul nu poate fi inchis !");
e. printStackTrace ();
}
}
}
}

public static void main ( String args []) {


if ( args.length > 0)
citesteFisier ( args [0]) ;
else
System.out.println (" Lipseste numele fisierului !");
}
}

package copierefisier;
import java.io.*;
public class CopiereFisier {
public static void main(String[] args) {
try {
FileReader in = new FileReader ("aaa.txt ");
FileWriter out = new FileWriter ("aab.txt ");
int c;
while ((c = in. read ()) != -1)
out.write (c);
in.close ();
out.close ();
} catch ( IOException e) {
System.err.println (" Eroare la operatiile cu fisiere !");
e.printStackTrace ();
}
}
}

Fir decexecuţie = ca un process, dar datele sunt commune cu celelalte fire de execuţie.

The syntax of the <APPLET> tag is shown below; the order of the parameters does
not matter:
<APPLET
[ALIGN = alignment]
[ALT = alternate-text]
CODE = applet-filename or OBJECT = serialized-applet
[CODEBASE = applet-directory-url]
[ARCHIVE = filename.zip/filename.jar]
HEIGHT = applet-pixel-height
[HSPACE = horizontal-pixel-margin]
[MAYSCRIPT = true/false]
[NAME = applet-name]
[VSPACE = vertical-pixel-margin]
WIDTH = applet-pixel-width
>
<PARAM NAME=parameter1 VALUE=value1>
<PARAM NAME=parameter2 VALUE=value2>
<PARAM NAME=parameter3 VALUE=value3>
...
[alternate-html]
</APPLET>

D
Image Loading
In this appendix:
• How Images are
Loaded
• A Brief Tour of
sun.awt.image
D.1 How Images are Loaded
You have seen how easy it is to display an image on screen and have probably
guessed that there’s more going on behind the scenes. The getImage() and draw-
Image() methods trigger a series of events that result in the image being available
for display on the ImageObserver. The image is fetched asynchronously in another
thread. The entire process* goes as follows:
1. The call to getImage() triggers Toolkit to call createImage() for the image’s
InputStreamImageSource (which is a URLImageSource in this case; it would be
a FileImageSource if we were loading the image from a local file).
2. The Toolkit registers the image as being “desired.” Desired just means that
something will eventually want the image loaded. The system then waits until
an ImageObserver registers its interest in the image.
3. The drawImage() method (use of MediaTracker or prepareImage()) registers
an ImageObserver as interested.
4. Registering an ImageObserver kicks the image’s ImageRepresentation into
action; this is the start of the loading process, although image data isn’t actually
transferred until step 9. ImageRepresentation implements the ImageConsumer
inter face.
5. The start of production registers the image source (ImageProducer URLImage-
Source) with the ImageFetcher and also registers the ImageRepresentation as
an ImageConsumer for the image.
* This summary covers Sun’s implementation ( JDK). Implementations that don’t derive from the JDK
may behave completely differently.
1017
1018 APPENDIX D: IMAGE LOADING
6. The ImageFetcher creates a thread to get the image from its source.
7. The ImageFetcher reads data and passes it along to the InputStreamImage-
Source, which is a URLImageSource.
8. The URLImageSource determines that JPEGImageDecoder is the proper
ImageDecoder for converting the input stream into an Image. (Other ImageDecoders
are used for other image types, like GIF.)
9. The ImageProducer starts reading the image data from the source; it calls the
ImageConsumer (i.e., the ImageRepresentation) as it processes the image. The
most important method in the ImageConsumer inter face is setPixels(), which
delivers pixel data to the consumer for rendering onscreen.
10. As the ImageConsumer (i.e., the ImageRepresentation) gets additional information,
it notifies the ImageObserver via imageUpdate() calls.
11. When the image is fully acquired across the network, the thread started by the
ImageFetcher stops.
As you see, there are a lot of unfamiliar moving pieces. Many of them are from the
java.awt.image package and are discussed in Chapter 12, Image Processing. Others
are from the sun.awt.image package; they are hidden in that you don’t need to
know anything about them to do image processing in Java. However, if you’re curious,
we’ll briefly summarize these classes in the next section.
D.2 A Brief Tour of sun.awt.image
The classes in sun.awt.image do the behind-the-scenes work for rendering an
image from a file or across the network. This information is purely for the curious;
you should never have to work with these classes yourself.
Image
The Image class in this package represents a concrete Image instance. It contains
the basis for the Image class that is actually used on the run-time platform,
which exists in the package for the specific environment. For instance,
the sun.awt.win32 package includes the W32Image ( Java 1.0), the
sun.awt.windows package includes WImage ( Java 1.1), while the
sun.awt.motif package includes the X11Image, and the sun.awt.macos package
includes the MacImage.
ImageRepresentation
The ImageRepresentation is the ImageConsumer that watches the creation of
the image and notifies the ImageObserver when it is time to update the display.
It plays an important part in the overall control of the Image production
process.
Image sources
A Java image can come from three different sources: memory (through createImage()),
local disk, or the network (through getImage()).
• OffScreenImageSource implements ImageProducer for a single framed
image in memory. When an Image created from an OffScreenImageSource
is drawn with drawImage(), the ImageObserver parameter can be null
since all the image information is already in memory and there is no need
for periodic updating as more is retrieved from disk. You can get the
graphics context of OffScreenImageSource images and use the context to
draw on the image area. This is how double buffering works.
• InputStreamImageSource implements ImageProducer for an image that
comes from disk or across the network. When an Image created from an
InputStreamImageSource is drawn with drawImage(), the ImageObserver
parameter should be the component being drawn on (usually this) since
the image information will be loaded periodically with the help of the
ImageObserver inter face). This class determines how to decode the image
type and initializes the ImageDecoder to one of GifImageDecoder, JPEGImageDecoder,
or XbmImageDecoder, although that can be overridden by a
subclass. It can use a ContentHandler to work with unknown image types.
• FileImageSource is a subclass of InputStreamImageSource for images that
come from the filesystem. It uses the filename to determine the type of
image to decode and checks the security manager to ensure that access is
allowed.
• URLImageSource is a subclass of InputStreamImageSource for images that
are specified by a URL.
• ByteArrayImageSource ( Java 1.1 only) is a subclass of InputStreamImage-
Source for images that are created by calling Toolkit.createImage(
byte[]).
Image decoders
An ImageDecoder is utilized to convert the image source to an image object. If
there is no decoder for an image type, it can be read in with the help of a
ContentHandler
or your own class that implements ImageProducer, like the
PPMImageDecoder shown in Chapter 12.
• GifImageDecoder reads in an image file in the GIF format.
• JPEGImageDecoder reads in an image file in the JPEG format.
D.2 A BRIEF TOUR OF SUN.AWT.IMAGE 1019
1020 APPENDIX D: IMAGE LOADING
• XbmImageDecoder reads in an image file in the XBM format. Although
XBM support is not required by the language specification, support is provided
with Netscape Navigator, Internet Explorer, HotJava, and the Java
Developer’s Kit from Sun.
ImageFetcher
The ImageFetcher class fetches the actual image from its source. This class creates
a separate daemon thread to fetch each image. The thread is run at a
higher priority than the default but not at the maximum priority.

Chapter 2 Simple Graphics.pdf


Chapter 4 Events.pdf

Example 4–2: Differentiating Mouse Buttons in Java 1.0


import java.awt.*;
import java.applet.*;
public class mouseEvent extends Applet {
String theString = "Press a Mouse Key";
public synchronized void setString (String s) {
theString = s;
}
public synchronized String getString () {
return theString;
}
public synchronized void paint (Graphics g) {
g.drawString (theString, 20, 20);
}
public boolean mouseDown (Event e, int x, int y) {
if (e.modifiers == Event.META_MASK) {
Example 4–2: Differentiating Mouse Buttons in Java 1.0 (continued)
setString ("Right Button Pressed");
} else if (e.modifiers == Event.ALT_MASK) {
setString ("Middle Button Pressed");
} else {
setString ("Left Button Pressed");
}
repaint ();
return true;
}
public boolean mouseUp (Event e, int x, int y) {
setString ("Press a Mouse Key");
repaint ();
return true;
}
}
Example 5–1: Button Event Handling
import java.awt.*;
import java.applet.*;
class TheButton extends Button {
TheButton (String s) {
super (s);
}
public boolean action (Event e, Object o) {
if ("One".equals(o)) {
System.out.println ("Do something for One");
} else if ("Two".equals(o)) {
System.out.println ("Ignore Two");
} else if ("Three".equals(o)) {
System.out.println ("Reverse Three");
} else if ("Four".equals(o)) {
System.out.println ("Four is the one");
} else {
return false;
}
return true;
}

Math.random()

Cristian_Frasinaru-Curs_practic_de_Java
System.exit(-1); //termina aplicatia
System.out.println("Salut " + nume + " " + prenume);
double numar = Double.parseDouble(args[0]);
Metodele de tipul parseTipNumeric pot produce except¸ii (erori) de
tipul
NumberFormatException

Rectangle r1, r2;


r1 = new Rectangle();
r2 = new Rectangle(0, 0, 100, 200);

Fiecare clas˘a are un set de constructori

Rectangle patrat = new Rectangle(0, 0, 100, 100);

Obiect anonom = creat doar pentru a iniţializa alt obiect


Rectangle patrat = new Rectangle(new Point(0,0),
new Dimension(100, 100));

metode de accesare = metode setter-getter


În OOP se preferă a în locul variabilelor să se folosească metode
(care citesc sau setează valorile variabilelor şi, adesea, le verifică).
patrat.width = -100; //stare inconsistenta
patrat.setSize(-100, -200); //metoda setter

Distrugerea obiectelor. Se face automat de un garbage collector gc


Obiectele se distrug când nu mai există referinţe la ele.
O variabilă se distruge când
 Se iese din domeniul de vizibilitate
 =NULL
Înainte de distrugerea claselor se apelează metoda finalize() care face
ordine.

Nu confundati metoda finalize din Java cu destructorii din C++. Metoda


finalize nu are rolul de a distruge obiectul ci este apelat˘a automat
ˆınainte de
eliminarea obiectului respectiv din memorie.

[public][abstract][final]class NumeClasa
[extends NumeSuperclasa]
[implements Interfata1 [, Interfata2 ... ]]
{
// Corpul clasei
}

• abstract
Declar˘a o clas˘a abstract˘a (¸sablon). O clas˘a abstract˘a nu poate fi
instant¸iat˘a, fiind folosit˘a doar pentru a crea un model comun pentru o
serie de subclase. (vezi ”Clase ¸si metode abstracte”)

Spre deosebire de alte limbaje de programare orientate-obiect, Java


permite
doar mo¸stenirea simpl˘a, ceea ce ˆıneamn˘a c˘a o clas˘a poate avea
un singur
p˘arinte (superclas˘a). Evident, o clas˘a poate avea oricˆati mo¸stenitori
(subclase),
de unde rezult˘a c˘a mult¸imea tuturor claselor definite ˆın Java poate fi
vazut˘a ca un arbore, r˘ad˘acina acestuia fiind clasa Object. A¸sadar,
Object
este singura clas˘a care nu are p˘arinte, fiind foarte important˘a ˆın
modul de
lucru cu obiecte si structuri de date ˆın Java.

class B extends A {...}


// A este superclasa clasei B
// B este o subclasa a clasei A
O subclas˘a mo¸stene¸ste de la p˘arintele s˘au toate variabilele ¸si
metodele
care nu sunt private.

Implementarea metodelor unei clase trebuie s˘a se fac˘a obligatoriu ˆın


corpul clasei.

Constructor = metodă care nu returmează nimic şi are numele clasei


Apelare explicită cu this(parametri).

Dintr-o subclas˘a putem apela explicit constructorii superclasei cu


expresia
super( argumente ).
Apelul explcit al unui constructor nu poate ap˘area decˆat ˆıntr-un alt
constructor
si trebuie s˘a fie prima instruct¸iune din constructorul respectiv.

Constructorii unei clase pot avea urm˘atorii modificatori de acces:


public, protected, private ¸si cel implicit.
• public
In orice alt˘a clas˘a se pot crea instant¸e ale clasei respective.
• protected
Doar ˆın subclase pot fi create obiecte de tipul clasei respective.
• private
In nici o alt˘a clas˘a nu se pot instant¸ia obiecte ale acestei clase. O
astfel
de clas˘a poate cont¸ine metode publice (numite ”factory methods”)
care s˘a fie responsabile cu crearea obiectelor, controlˆand ˆın felul
acesta
diverse aspecte legate de instant¸ierea clasei respective.
• implicit
Doar ˆın clasele din acela¸si pachet se pot crea instant¸e ale clasei
respective.

[modificatori] TipReturnat numeMetoda ( [argumente] )


[throws TipExceptie1, TipExceptie2, ...]
{
// Corpul metodei
}
specificator de acces : public, protected, private
static, abstract, final, native, synchronized

abstract
Permite declararea metodelor abstracte. O metod˘a abstract˘a este o
metod˘a care nu are implementare ¸si trebuie obligatoriu s˘a fac˘a parte
dintr-o clas˘a abstract˘a. (vezi ”Clase ¸si metode abstracte”)

• native
In cazul ˆın care avem o libr˘arie important˘a de funct¸ii scrise ˆın alt
limbaj
de programare, cum ar fi C, C++ ¸si limbajul de asamblare, acestea
pot fi refolosite din programele Java. Tehnologia care permite acest
lucru se nume¸ste JNI (Java Native Interface) ¸si permite asocierea dintre
metode Java declarate cu native ¸si metode native scrise ˆın limbajele
de programare ment¸ionate.

În metode argumentele se trimit doar prin valoare. Dacă tipul de dată


este primitiv, valoarea nu se schimbă. Dacă este obiect, se pot modifica
variabilele lui.

Metode cu numar varoiabil de argumente


[modificatori] TipReturnat metoda(TipArgumente ... args)

Polimorfism =
se refera la:
• supraıncarcare (overloading) : ın cadrul unei clase pot exista metode
cu acela¸si nume cu condit¸ia ca signaturile lor s˘a fie diferite (lista de
argumente primite s˘a difere fie prin num˘arul argumentelor, fie prin
tipul lor) astfel ˆıncˆat la apelul funct¸iei cu acel nume s˘a se poat˘a
stabili
ˆın mod unic care dintre ele se execut˘a.
• supradefinire (overriding): o subclasa poate rescrie o metoda a clasei
parinte prin implementarea unei metode cu acelasi nume si aceeasi
signatur˘a ca ale superclasei.

In Java nu este posibila supraıncarcarea operatorilor.


Număr variabil de argumente

[modificatori] TipReturnat metoda(TipArgumente ... args)


args reprezinta˘ un vector avaˆnd tipul specificat ¸si instan¸tiat cu un numa˘r
variabil de argumente, ˆın func¸tie de apelul metodei. Tipul argumentelor
poate fi referin¸ta˘ sau primitiv. Metoda de mai jos afi¸seaza˘ argumentele prim- ite,
care pot fi de orice tip:
void metoda(Object ... args) { for(int i=0;
i<args.length; i++)
System.out.println(args[i]);
}
... metoda("Hello");
metoda("Hello", "Java", 1.5);
Modificatori de acces
Modificatorii de acces sunt cuvinte rezervate ce accesul celor-
controleaza˘
late clase la membrii unei clase. Specificatorii de acces pentru
variabilele
¸si metodele unei clase sunt: public, protected, private ¸si cel implicit (la
nivel de pachet), iar nivelul lor de acces este dat ˆın tabelul de mai jos:

Specificator Clasa Subclasa Pachet Oriunde


private X
protected X X* X
public X X X X
implicit X X
La protejat se poate accesa şi din afara pachetului dacă se face dintr-una din subclasele lui.

Variabile de instanţă şi de clasă


De instanţă = se creează câte o variabilă separată pentru fiecare obiect
De clasă = există o singură variabilă, indiferent de numărul obiectelor. Se foloseşte static şi
se referă cu numele clasei: clasa.alfa.

Metode de instanţă şi clasă.


De instanţă = lucrează şi cu variabile de clasă, şi cu variabile de instanţă
De clasă = lucrează numai cu variabile de clasă.

Cu p variabilă de clasă putem număra câte obiecte au fost create din acea clasă:
class Exemplu {
static long nrInstante = 0;
Exemplu() {
// Constructorul este apelat la fiecare instantiere
nrInstante ++;
}
}

Variabilele globale se implementează cu metode statice, de clasă.

Citire fişier character cu character, try, catch, finally


import java.io.*;

public class CitireFisier {


public static void citesteFisier(String f
is) {
FileReader f = null;
try {
// Deschidem fisierul
System.out.println("Deschidem fisieru
l " + fis);
f = new FileReader(fis);
// Citim si afisam fisierul caracter cu
caracter
int c;
w h i l e ( ( c = f . r e a d ( ) ) ! = -1)
System.out.print((char)c);

} catch (FileNotFoundException e) {
//Tratam un tip de exceptie
System.err.println("Fisierul nu a fost
gasit !");
System.err.println("Exceptie: " + e.ge
tMessage());
System.exit(1);

} catch (IOException e) {
//Tratam alt tip de exceptie
System.out.println("Eroare la citirea
din fisier!");
e.printStackTrace();

} finally {
if (f != null) {
// Inchidem fisierul
System.out.println("\nInchidem fisie
rul.");
try {
f.close();
} catch (IOException e) {
System.err.println("Fisierul nu poa
te fi inchis!");
e.printStackTrace();
}
}
}
}

public static void main(String args[]) {


if (args.length > 0)
citesteFisier(args[0]);
else
System.out.println("Lipseste numele fisie
rului!");
}
}

Excepţii

1) Secvenţa care poate genera excepţii este în clauza try


2) Fiecare tip de excepţie este tratat cu catch
3) Tratarea este obligatorie, mai puţin runtime: împărţire cu 0, valoare NULL şi
depăşirea indicilor vectorilor, care sunt facultative
4) Dacă o metodă nu le tratează, trebuie să le arunce la supercloase cu throw.

Impa˘r¸tirea la 0 va genera o excep¸tie doar daca˘ tipul numerelor


ˆımpa˘r¸tite este aritmetic ˆıntreg. In cazul tipurilor reale (float ¸si
double) nu va fi generata˘ nici o excep¸tie, ci va fi furnizat ca rezultat o
constanta˘ care poate
fi, func¸tie de operatie, Infinity, -Infinity, sau Nan. Nan – 0 / 0

Fluxuri
import java.io.*;

Un flux este un canal de comunica¸tie unidirec¸tional ˆıntre doua˘ procese.


Fluxurile sunt canale de comunica¸tie seriale pe 8 sau 16 bi¸ti.
Clasele ra˘da˘cina˘ pentru ierarhiile ce reprezinta˘ fluxuri de caractere (pe 16 biţi)
sunt:

• Reader- pentru fluxuri de intrare ¸si

• Writer- pentru fluxuri de ie¸sire.

Acestea sunt superclase abstracte pentru toate clasele ce implementeaza˘


fluxuri specializate pentru citirea/scrierea datelor pe 16 bi¸ti ¸si vor
con¸tine metodele comune tuturor.
Ca o generala˘, toate clasele din aceste ierarhii vor avea termina¸tia
regula˘
Reader sau Writer ˆın func¸tie de tipul lor, cum ar fi ˆın exemplele: FileReader,
BufferedReader, FileWriter, BufferedWriter, etc. De asemenea, se ob-
serva ca o regula generala˘, faptul unui flux de intrare XReader ˆıi
˘ alta˘ ˘ ca˘
corespunde uzual un flux de ie¸sire XWriter, ˆınsa˘ acest lucru nu este
obliga- toriu.
Clasele radacina˘ pentru ierarhia fluxurilor de octe¸ti sunt:

• InputStream- pentru fluxuri de intrare ¸si

• OutputStream- pentru fluxuri de ie¸sire.

Acestea sunt superclase abstracte pentru clase ce implementeaza˘ fluxuri


specializate pentru citirea/scrierea datelor pe 8 bi¸ti. Ca ¸si ˆın cazul
flux- urilor pe caractere denumirile claselor vor avea termina¸tia
superclasei lor: FileInputStream, BufferedInputStream,
FileOutputStream, BufferedOutputStream, etc., fieca˘rui flux de intrare
XInputStream core- spunzaˆndu-i uzual un flux de ie¸sire XOutputStream,
fa˘ra˘ ca acest lucru sa˘
fie obligatoriu.

Reader InputStream
int read() int read()
int read(char buf[]) int read(byte buf[])
... ...

Reader InputStream
void write(int c) void write(int c)
void write(char buf[]) void write(byte buf[])
void write(String str) -
... ...
Cred că este Writter şi OutputStream

• Fi¸sier
FileReader, FileWriter
FileInputStream, FileOutputStream
Numite ¸si fluxuri fi¸sier, acestea sunt folosite pentru citirea
datelor dintr-un fi¸sier, respectiv scrierea datelor ˆıntr-un fi¸sier ¸si vor fi
analizate
ˆıntr-o sec¸tiune separata˘ (vezi ”Fluxuri pentru lucrul cu fi¸siere”).

• Memorie
CharArrayReader, CharArrayWriter
ByteArrayInputStream, ByteArrayOutputStream
Aceste fluxuri folosesc pentru scrierea/citirea informa¸tiilor ˆın/din
mem- orie ¸si sunt create pe un vector existent deja. Cu alte cuvinte,
permit tratarea vectorilor ca sursa˘/destina¸tie pentru crearea unor
fluxuri de intrare/ie¸sire.

StringReader, StringWriter
Permit tratarea ¸sirurilor de caractere aflate ˆın memorie ca
sursa˘/destina¸tie pentru crearea de fluxuri.
• Pipe
PipedReader, PipedWriter
PipedInputStream, PipedOutputStream
Implementeaza componentele de intrare/ie¸sire ale unei conducte de
˘
date (pipe). Pipe-urile sunt folosite pentru a canaliza ie¸sirea unui pro-
gram sau fir de execu¸tie ca˘tre intrarea altui program sau fir de
execu¸tie.

//crearea unui flux de intrare pe caractere


FileReader in = new FileReader("fisier.txt");

//crearea unui flux de iesire pe caractere


FileWriter out = new FileWriter("fisier.txt");

//crearea unui flux de intrare pe octeti


FileInputStream in = new FileInputStream("fisier.dat");

//crearea unui flux de iesire pe octeti


FileOutputStrem out = new FileOutputStream("fisier.dat");

Flux de procesare
//crearea unui flux de intrare printr-un buffer
BufferedReader in = new BufferedReader(
new FileReader("fisier.txt"));
//echivalent cu
FileReader fr = new FileReader("fisier.txt");
BufferedReader in = new BufferedReader(fr);

//crearea unui flux de iesire printr-un buffer


BufferedWriter out = new BufferedWriter(
new FileWriter("fisier.txt")));
//echivalent cu
FileWriter fo = new FileWriter("fisier.txt");
BufferedWriter out = new BufferedWriter(fo);

Constructorii clasei FileReader sunt:

public FileReader(String fileName)


throws FileNotFoundException
public FileReader(File file)
throws FileNotFoundException
public FileReader(FileDescriptor fd)

Constructorii clasei FileWriter:

public FileWriter(String fileName)


throws IOException
public FileWriter(File file)
throws IOException
public FileWriter(FileDescriptor fd)
public FileWriter(String fileName, boolean append)
throws IOException
Listing 4.1: Copierea unui fisier

import java.io
.*;
Copiere fişier
public class Copiere {
public static void main(String[] args) {

try {
FileReader = new FileReader("in.tx
ii
F nleWriter = new F ti"l)e
;Writer("out.t
out xt");
int c;
w h i l e ( ( c = i n . r e a d ( ) ) ! = -1)
out.write(c);

in.close();
out.close();

} catch(IOException e) {
System.err.println("Eroare la operatiile cu fi
siere!");
e.printStackTrace();
}
}
}

Pentru append (adăugare) la sfârşitul fişierului FileWriter out = new


FileWriter("out.txt", true);

Citire-scriere cu buffer.- Se scrie când este umplut. Implicit are 512 octeţi.
BufferedOutputStream out = new BufferedOutputStream(
new FileOutputStream("out.dat"), 1024)
//1024 este dimensiunea bufferului

Constructorii cei mai folosi¸ti ai acestor clase sunt urma˘torii:

BufferedReader(Reader in)
BufferedReader(Reader in, int dim_buffer)
BufferedWriter(Writer out)

BufferedWriter(Writer out, int dim_buffer)


BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in, int dim_buffer)
BufferedOutputStream(OutputStream out)
BufferedOutputStream(OutputStream out, int dim_buffer)

out.flush();
//bufferul este golit, datele se scriu in fisier

BufferedReader br = new BufferedReader(new FileReader("in"))


String linie;
while ((linie = br.readLine()) != null) {
...
//proceseaza linie
}
br.close();
}

Listing 4.2: Concatenarea a doua˘ fi¸siere


/* Concatenarea a doua fisiere
ale caror nume sunt primite de la linia de comanda.
Rezultatul concatenarii este afisat pe ecran.
*/
import java.io.*;
public class Concatenare {
public static void main(String args[]) {
i f ( a r g s . l e n g t h <= 1 ) {
System.out.println("Argumente insuficiente!");
System.exit(-1);
}
try {
FileInputStream f1 = new FileInputStream(args[0]);
FileInputStream f2 = new FileInputStream(args[1]);
S e q u e n c e I n p u t S t r e a m s = n e w S e q u e n c e I n p u t S t r e a m ( f1 ,
f2)
;
int c;
while ((c = s.read()) !
= -1) S y s t e m . o u t . p r i n t
((char)c);
s.close();
//f1 si f2 sunt inchise automat
} catch (IOException e) {
e.printStackTrace();
}
}
}

Java de pe telefon Learn Android and Java android cu cravata si


roti dintate

Am pus PATH
C:\Program Files\Java\jdk1.8.0_102\bin;%JAVA_HOME%\bin;C:\ProgramData\Oracle\Java\javapath;
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT
%\System32\WindowsPowerShell\v1.0\;C:\Program Files\7-Zip

Compilare javac test.java

Rulare java test

Parent = se foloseşte când se invocă constructorul părintelui sau o metodă a părintelui care are
acelaşi nume în fiu.

Method overloading = aceeaşi funcţie ccu număr sau tip de parametri diferiţi
Method Overriding = clasa child suprascrie metoda clasei părinte
Înaintea redefinirii se pune @override
@Override
public int compareTo(Student s) {
if (avg > s.avg )…

Upcasting. În general nefolosită

In this example, we are creating two classes Bike and Splendar. Splendar class extends Bike
class and overrides its run() method. We are calling the run method by the reference variable of
Parent class. Since it refers to the subclass object and subclass method overrides the Parent class
method, subclass method is invoked at runtime.

Since method invocation is determined by the JVM not compiler, it is known as runtime
polymorphism.

class Bike{
void run(){System.out.println("running");}
}
class Splender extends Bike{
void run(){System.out.println("running safely with 60km");}

public static void main(String args[]){


Bike b = new Splender();//upcasting
b.run();
}
}
Observ că am găsit upcasting la declararea unor fişiere.
Am impresia că aşa unific toate subclasele. De exemplu, dacă am clasa rădăcină geometrie şi
fii pe pătrat şi cerc, ele vor fi geometrie.
Am avut dreptate: pot avea clasa abstract Shape pe care o extend la Triangle şi Rectangle.
Pot face Shape s1 = new Rectangle(), apoi

s1 = new Triangle()

There are 2 classes one is parent class (Demo1) second is its subclass (Demo).

1. If Method run1 does not have parameters then the output of method will be same.
There is no use of Upcasting.
2. class Demo1{
3.
4. void run1(){
5. System.out.println("hello");
6. }
7. }
8.
9. class Demo extends Demo1 {
10.
11. void run1(){
12. System.out.println("hello1");
13. }
14.
15. public static void main(String args[]){
16.
17. Demo d = new Demo();
18. d.run1();
19.
20. Demo1 d1 = new Demo();
21. d1.run1();
22.
23. }
}

Output for d.run1(); and d1.run1(); will be same.

output: hello1
2. If we uses Parameterised overloading then the use of upcasting can be seen
clearly. There is the sense for Upcasting.
3. class Demo1{
4.
5. void run1(int a){
6.
7. System.out.println(a);
8. }
9. }
10.
11. class Demo extends Demo1 {
12.
13. void run1(String b){
14.
15. System.out.println(b);
16. }
17.
18. public static void main(String args[]){
19.
20. Demo d = new Demo();
21. d.run1("b");
22.
23. Demo1 d1 = new Demo();
24. d1.run1(2);
25.
26. }
}
În acest exemplu s-a executat metoda din părinte sau din fiu funcţie de tipul
parametrului.
Up-casting is casting to a supertype, while downcasting is casting to a subtype. Supercasting is
always allowed, but subcasting involves a type check and can throw a ClassCastException

IS-A = o clasă este un urmaş al altei clase


Dog IS-A Animal

Math.PI

Construcţie de forma import java.util.* înseamnă package

Copiere ctablou: System.arraycopy(sursa, de unde, destinaţia, unde, lungimea)


Unde am nevoie de un obiect folosesc new
System.ot.println(new String(tablou de caractere));

Obiectul Scanner: Pentru citirea de întregi, float, linii text


http://javatutorialhq.com/java/util/scanner-class-tutorial/
1) Inport java.util.*
2) Scanner in = new Scanner(System.in)
3) Nr=in.nextInt

Când folosesc @override


Avantaje:
1) Pentru a detecta erori. Cred că override o metodă, dar am greşit la nume
sau la parametri şi în realitate este o altă metodă Am avut opneFile() şi
cred că o suprascriu cu OpenFile(). Compilatorul arată că nu suprascriu
nimic.
2) Evidenţiere supapuneri.

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