O prima varianta de program, SalutPrimulArgument.java, utilizeaza
un argument dat programului de catre utilizator, la lansare (pentru a pasa
programului numele care trebuie salutat), si
o variabila locala.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/** * Exemplifica constructii de baza ale
limbajului Java. Clasa principala. */ public class SalutPrimulArgument { /** * Afiseaza un salut catre utilizator. Metoda
principala. * @param
args Lista argumentelor programului. */ public static void main (String[] args)
{ // Variabila locala String variabilaLocala = "Salut "; // Utilizarea unui argument si al unei variabile locale // Concatenare de siruri de caractere System.out.println(variabilaLocala + args[0]); } } |
Argumentele sunt furnizate de catre utilizator la lansarea programelor in executie din linia de comanda, sub forma:
directorcurent> java <NumeClasa> <argumente program java>
Argumentele sunt despartite prin spatii, si sunt
accesate in interiorul programului sub forma de siruri de caractere (obiecte
ale clasei String). Daca se doreste ca mai multe cuvinte sa
formeze un singur argument, acestea sunt plasate intre ghilimele. In cazul
clasei SalutPrimulArgument, primul argument (args[0], elementul de index 0 al tabloului argumentelor) va fi numele
utilizatorului, programul urmand sa il salute pe utilizator.
Daca utilizatorul foloseste comanda:
directorcurent> java SalutPrimulArgument Nick
efectul este:
Salut Nick
Acelasi efect se
obtine daca utilizatorul foloseste comanda:
directorcurent> java SalutPrimulArgument Nick Name
Pentru a se obtine efectul:
Salut Nick Name
utilizatorul trebuie sa foloseasca comanda:
directorcurent> java SalutPrimulArgument
"Nick Name"
Programul foloseste o variabila locala (numita variabilaLocala) pentru stocarea unei parti din mesajul catre utilizator ("Salut ").
Variabilele locale sunt acele variabile declarate in interiorul blocurilor de cod (cuprinse intre acolade),
sunt create in momentul declararii lor si
sunt accesibile din locul declararii si
pana la sfarsitul blocului de cod in care au fost declarate (pentru
variabilele referinta in momentul declararii este creata doar referinta,
obiectul referit fiind creat dinamic cu new).
Concatenarea sirurilor de caractere variabilaLocala si args[0] este realizata cu ajutorul operatorului "+".
O alta varianta de program, SalutUtilizator1.java, obtine
numele caruia i se adreseaza salutul prin intermediul consolei standard de
intrare (din fereastra de comanda)
si utilizeaza un atribut.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
/** * Importul
pachetului de clase de intrare-iesire (IO). */ import
java.io.*; /** * Exemplifica constructii de baza ale
limbajului Java. Clasa principala. */ public class SalutUtilizator1 { /** * Numele utilizatorului. Atribut global (static), * partajat
de clasa si de toate obiectele clasei. */ public static String atribut; /** * Afiseaza un salut catre utilizator. Metoda principala. */ public static void main(String[] args) throws
IOException { BufferedReader intrareConsola = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Introduceti-va
numele: "); atribut
= intrareConsola.readLine(); System.out.println("Buna
ziua " + atribut +
"!"); } } |
Citirea consolei standard de intrare se face prin intermediul
unui flux de intrare pentru caractere (in Java, caracterele sunt codate UNICODE
pe 2 octeti), declarat in
linia 20, conectat la fluxul standard de
intrare (care ofera datele de la tastatura sub forma de octeti simpli) prin
intermediul unui flux de intrare care face conversia octet-caracter (linia
21).
Dupa lansare, programul afiseaza mesajul "Introduceti-va numele:
", iar daca
utilizatorul introduce numele Nick urmat de <Enter>, efectul este urmatorul:
directorcurent>
java SalutUtilizator1
Introduceti-va numele: Nick
Buna ziua Nick !
Atributul (numit si variabila membru a clasei) este o variabila declarata la acelasi nivel cu metodele clasei (functiile ei membru), este creata in momentul crearii clasei (daca este declarata static) sau in momentul crearii obiectului (daca nu este declarata static), si este accesibila in interiorul clasei, si inainte si dupa locul declararii ei (ba chiar si in exteriorul clasei, in functie de specificatorul de acces folosit).
Atributul folosit aici, numit atribut, este declarat static (este global,
fiind o locatie unica la nivelul clasei) si public (este accesibil de catre orice alta clasa Java).
Daca ar fi fost declarat fara static (local, fiind creata o locatie separata pentru fiecare obiect) programul ar fi trebui modificat pentru a putea functiona (se poate verifica efectul indepartarii cuvantului cheie static). Pentru a functiona fara static, in locul liniilor 22 si 23 ar fi trebuit scris:
22 23 24 |
SalutUtilizator1
salut = new SalutUtilizator1(); salut.atribut
= intrareConsola.readLine(); System.out.println("Buna
ziua " + salut.atribut +
"!"); |
O alta varianta de program, SalutUtilizator2.java, obtine
numele caruia i se adreseaza salutul prin intermediul unei fereastre de
dialog (Swing).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
/** * Clasa
importata din pachetul de clase grafice avansate (swing). */ import
javax.swing.JOptionPane; /** * Exemplifica constructii de baza ale
limbajului Java. Clasa principala. */ public class SalutUtilizator2 { /** * Numele utilizatorului. * Atribut
local (non-static), la nivel de obiect, cu acces public. */ public String nume; /** *
Initializeaza atributul
obiectului curent. Constructor. */ public SalutUtilizator2() { // Obtinerea numelui utilizatorului prin
fereastra de dialog nume
= JOptionPane.showInputDialog("Introduceti-va numele:"); } /** * Afiseaza un salut. Metoda utilitara. */ public void salutaNume() { // Concatenare de siruri de caractere System.out.println("Hello
" + nume + "!"); } /** * Afiseaza un salut catre utilizator. Metoda principala. */ public static void main(String[] args) { //
Variabila locala initializata cu un nou obiect afisor SalutUtilizator2 afisor = new SalutUtilizator2(); // Apelul metodei de afisare a numelui afisor.salutaNume(); } } |
Fereastra de dialog este cel mai simplu si elegant mod de obtinere a unei intrari de la
utilizator atunci cand este nevoie. Pentru a fi utilizata este necesara
declaratia de import din linia 4 si
apelul din linia 19.
Metodei showInputDialog() i se ofera ca parametru mesajul catre utilizator,
iar metoda returneaza intrarea de la utilizator sub forma de sir de caractere
(obiect ale clasei String).
Atributul non-static nume impune crearea unui obiect al clasei SalutUtilizator2 (linia 33) pentru a putea fi utilizat.
Constructorii sunt metode care au acelasi nume cu al clasei, nu
returneaza valori, sunt apelate in
momentul crearii obiectelor (dupa operatorul new) si sunt folosite in general
la initializarea atributelor non-statice.
Constructorul fara parametri SalutUtilizator2() initializeaza atributul nume.
Constructorul este un caz particular de delegare a functionalitatii, in acest caz fiind delegata initializarea atributelor si a altor resurse in momentul crearii obiectelor.
Metodele (functiile
membru) sunt singurele forme in care pot fi
declarate functiile in Java. Ele pot fi cu sau fara parametri,
si pot returna sau nu valori (in
acest ultim caz, tipul valorii returnate este void). Metoda salutaNume() nu are parametri si afiseaza un mesaj care contine
atributul nume.
Metodele sunt cazul cel mai simplu si mai des intalnit de
delegare a functionalitatii. Separarea codului in functii (metode)
serveste gestiunii mai simple a codului, modularizarii codului la nivel de
secventa de instructiuni, reutilizarii codului la nivel de functie.
In general functia
principala main() deleaga anumite sarcini catre alte functii, acestea la randul lor catre altele, s.a.m.d.
O forma mai complexa si mai avansata de delegare a functionalitatii este separarea
codului in mai multe clase si obiecte (fiecare la randul ei separata
functional).
In acest caz metoda
principala din clasa principala deleaga anumite sarcini catre alte metode
ale clasei principale (mai rar) si catre metode ale altor clase. Acestea la randul lor pot delega sarcini catre
alte metode ale acelorasi clase sau catre metode ale altor clase, s.a.m.d.
O alta varianta de program, SalutUtilizator3.java, utilizeaza :
- delegarea
functionalitatilor de obtinere a informatiilor catre o noua clasa, utilitara,
numita Obtinere, si
- delegarea functionalitatilor de afisare a informatiilor catre o noua
clasa, utilitara, numita Afisare.
Clasa SalutUtilizator3 are
rolul de dispecer de sarcini, metoda
ei principala continand scenariul
principal (citirea prenumelui de la consola, afisarea unui salut in
consola, citirea numelui prin fereastra grafica, afisarea unui salut in
fereastra grafica).
Ambele clase utilitare ofera atat varianta
consolei standard cat si cea a ferestrelor de dialog. Metodele lor sunt de tip static.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import
javax.swing.JOptionPane; /** * Exemplifica constructii de baza ale
limbajului Java. Clasa utilitara. */ public class Afisare { /** * Afiseaza un text in consola. Metoda utilitara. * @param text Textul de afisat. */ public static void textInConsola(String
text) { System.out.println(text); } /** * Afiseaza un text in fereastra de dialog. Metoda utilitara. * @param text Textul de afisat. */ public static void textInFereastra(String
text) { JOptionPane.showMessageDialog(null,
text); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import
javax.swing.JOptionPane; /** * Importul pachetului de clase de
intrare-iesire (IO). */ import
java.io.*; /** * Exemplifica constructii de baza ale
limbajului Java. Clasa utilitara. */ public class Obtinere { /** * Obtine un text prin consola. Metoda
utilitara. *
@param mesaj Mesajul catre utilizator. *
@return Textul obtinut. */ public static String textDinConsola(String
mesaj) throws IOException { BufferedReader inConsola = new
BufferedReader(new InputStreamReader(System.in)); System.out.print(mesaj); String text = inConsola.readLine(); return (text); } /** *
Obtine un text printr-o fereastra grafica. Metoda utilitara. *
@param mesaj Mesajul catre utilizator. *
@return Textul obtinut. */ public static String textDinFereastra(String mesaj) { String text = JOptionPane.showInputDialog(mesaj); return (text); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
/** * Clasa importata din pachetul de clase
grafice avansate (swing). */ import
javax.swing.JOptionPane; /** * Importul pachetului de clase de
intrare-iesire (IO). */ import
java.io.*; /** * Exemplifica constructii de baza ale
limbajului Java. Clasa principala. */ public class SalutUtilizator3 { /** * Afiseaza un salut catre utilizator. Metoda
principala. *
@param args Lista argumentelor programului. */ public static void main(String[] args) throws IOException { // Variabila locala String prenume = Obtinere.textDinConsola("Introduceti-va
prenumele:"); // Apelul
metodei de afisare a numelui Afisare.textInConsola("Buna ziua,
" + prenume + "!"); //
Variabila locala String nume = Obtinere.textDinFereastra("Introduceti-va
numele:"); // Apelul
metodei de afisare a numelui intreg Afisare.textInFereastra("Buna
ziua, " + prenume + "
" + nume + "!"); } } |
De reflectat:
1. Cum ar arata programul SalutUtilizator3 daca metodele claselor
Obtinere si Afisare ar fi non-statice?
2. Cum trebuie modificat
programul SalutUtilizator3 pentru a putea executa in mod repetat scenariul anterior (citire prenume, afisare salut in consola,
citire nume, afisare salut in fereastra)?