0% au considerat acest document util (0 voturi)
15 vizualizări10 pagini

L04 - Clase. Metode. Stringuri

Documentul oferă o introducere în conceptele fundamentale ale programării orientate pe obiect în Java, inclusiv crearea și utilizarea claselor, specificatorii de acces, metodele și manipularea șirurilor de caractere. Se discută despre clase, metode, clase interioare, clase abstracte și clase speciale precum String, StringBuffer și StringBuilder. De asemenea, sunt incluse exemple practice și exerciții pentru consolidarea cunoștințelor dobândite.

Încărcat de

Iulia Chira
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 PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
15 vizualizări10 pagini

L04 - Clase. Metode. Stringuri

Documentul oferă o introducere în conceptele fundamentale ale programării orientate pe obiect în Java, inclusiv crearea și utilizarea claselor, specificatorii de acces, metodele și manipularea șirurilor de caractere. Se discută despre clase, metode, clase interioare, clase abstracte și clase speciale precum String, StringBuffer și StringBuilder. De asemenea, sunt incluse exemple practice și exerciții pentru consolidarea cunoștințelor dobândite.

Încărcat de

Iulia Chira
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 PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 10

Inginerie Software

Lucrarea 4. Clase Java, metode, specificatori de acces. Clase


pentru șiruri de caractere.

Obiective O1.​Crearea și utilizarea claselor Java, incluzând definirea atributelor și metodelor,


precum și instanțierea obiectelor pentru a implementa funcționalități de bază.
O2.​Aplicarea specificatorilor de acces (public, private, protected) pentru controlul
accesului la atributele și metodele unei clase, în scopul de a asigura
incapsularea corectă a datelor.
O3.​Utilizarea clasei String și a metodelor acesteia pentru manipularea și
procesarea șirurilor de caractere (ex: concatenare, comparare, căutare,
modificare).

A. Clase Java

O clasă Java se declară folosind cuvântul cheie class urmat de numele clasei (CamelCase notation). O clasă
poate conţine variabile/atribute şi metode (implementate). Acestea poartă numele de membri ai clasei. Atât
clasa cât şi membrii săi pot fi marcați folosind specificatorii de acces/vizibilitate.

Sintaxa:
[specificatori_de_acces] class NumeClasa {
// Implementarea clasei
}

Specificatori de acces la clase:

●​ default (nespecificat)
●​ public
●​ abstract
●​ final

Clasele interioare pot avea și alți specificatori de acces.

Specificatori de acces pentru membrii claselor:

●​ default (nespecificat)
●​ public
●​ abstract
●​ final
●​ private
●​ protected
●​ static

Notă:

●​ Dacă o clasă este declarată ca fiind public, fişierul în care este stocată trebuie să poarte acelaşi
nume cu numele clasei.
●​ Dacă clasa nu este public, nu există restricții asupra numelui fişierului sursă.

© Adriana Stan, Cosmin Strilețchi, Ligia Chiorean, Mircea Vaida ​ Inginerie Software ​ 1
B. Specificatori de acces/vizibilitate

Java prevede următorii specificatori de acces/vizibilitate aplicabili claselor, metodelor sau variabilelor:

●​ final: Poate fi aplicat claselor, metodelor și variabilelor.


●​ abstract: Poate fi aplicat claselor și metodelor.
●​ static: Poate fi aplicat variabilelor, metodelor și blocurilor de cod. Un membru static este asociat
clasei, nu instanței.
●​ native: Poate fi aplicat doar metodelor.
●​ transient: Se aplică doar variabilelor.
●​ synchronized: Controlează accesul mai multor fire de execuție la resursele comune.
●​ volatile: Poate fi aplicat variabilelor, indicând că pot fi modificate asincron.
●​ public: Vizibil de oriunde din exteriorul clasei.
●​ protected: Accesibil în același pachet și de subclasele din alte pachete.
●​ default: Vizibil doar în cadrul pachetului.
●​ private: Cel mai restrictiv, accesibil doar din clasa proprie.

C. Metode (funcții) Java

O metodă Java este o entitate care conține instrucțiuni şi poate returna o valoare sau nu.

Sintaxa:
[specificatori_de_acces] tip_returnat numeMetoda (lista_de_parametri) {
// Implementare metoda
}

●​ tip_returnat poate fi void sau orice alt tip de date.


●​ numeMetoda respectă CamelCase notation.
●​ lista_de_parametri este o înșiruire de tipuri și nume de variabile separate prin virgulă.

Metode speciale:

●​ Setter (mutator):

​ public void setNumeVariabila(tip_variabila numeVariabila);

●​ Getter (accesor):

​ public tip_variabila getNumeVariabila();

Metodele constructor / destructor

Java nu are destructori, dar permite suprascrierea metodei finalize() din clasa Object:

public void finalize() {


// Cod executat la distrugerea obiectului
}

Pentru apelare:

© Adriana Stan, Cosmin Strilețchi, Ligia Chiorean, Mircea Vaida ​ Inginerie Software ​ 2
System.gc();
System.runFinalization();

Metoda main( )

Prototipuri posibile:
public static void main(String[] args) {
// Implementare
}
public static void main(String args[]) {
// Implementare
}
public static void main(String... args) {
// Implementare
}

Metode statice

●​ O metodă statică nu poate accesa alți membri nestatici ai clasei.


●​ Metodele statice nu au acces la variabila implicită this.

D. Clase interioare

Java permite definirea de clase în cadrul altor clase.

Sintaxa:
class ClasaExterioara {
class ClasaInterioara {
// Implementare
}
}

Pentru instanțiere:

ClasaExterioara obiect_exterior = new ClasaExterioara();


ClasaExterioara.ClasaInterioara obiect_interior = obiect_exterior.new
ClasaInterioara();

Clasele interioare pot fi marcate static şi accesate astfel:

ClasaExterioara.ClasaInterioara.metoda();

Instanțiere:

© Adriana Stan, Cosmin Strilețchi, Ligia Chiorean, Mircea Vaida ​ Inginerie Software ​ 3
ClasaExterioara.ClasaInterioara obiect_interior = new
ClasaExterioara.ClasaInterioara();

E. Clase abstracte

Dacă o clasă Java conține cel puțin o metodă abstractă, trebuie marcată cu abstract.

Sintaxa:
abstract class NumeClasa {
public abstract void metodaAbstracta();
public void metodaNormala() {
// Implementare
}
}

●​ Clasele abstracte nu pot fi instanțiate.


●​ Clasele abstracte pot fi doar moştenite.

F. Clase speciale

Clasa String
https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/lang/String.html
=> permite tratarea unitară a şirurilor de caractere; toate variabilele literale Java care conţin o secvenţă de
caractere pot fi prelucrate prin intermediul acestei clase.

Clasa StringBuffer
https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/lang/StringBuffer.html
! Spre deosebire de o variabilă de tip String, un obiect de tip StringBuffer poate fi modificat pe parcursul
existenţei sale.

Clasa StringBuilder
https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/lang/StringBuilder.html
=> se doreşte a fi un înlocuitor al clasei StringBuffer. Mecanismele, funcţionalităţile şi metodele pe care le
oferă sunt foarte asemănătoare cu cele ale clasei mai sus amintite.

Clasa StringTokenizer
https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/util/StringTokenizer.html
=> permite separarea unui obiect de tip String în subsecţiuni (porțiuni), pe baza unor anumiţi separatori.

Toate clasele de tip String suportă lucrul cu expresii regulare (regular expressions)

© Adriana Stan, Cosmin Strilețchi, Ligia Chiorean, Mircea Vaida ​ Inginerie Software ​ 4
http://www.regexr.com
https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/util/regex/Pattern.html

EXEMPLE

1. Metode Java

class Methods_01 {
​ void m1(int... sir){
​ ​ for(int crt_val : sir){
​ ​ ​ System.out.print(crt_val+" ");
​ ​ }
​ ​ System.out.println();​
​ }
​ void m2(int sir[]){
​ ​ for(int i=0; i<sir.length; i++){
​ ​ ​ System.out.print(sir[i]+" ");
​ ​ }
​ ​ System.out.println();
​ }
​ void m3(int sir[]){
​ ​ sir[0] = -777;
​ }
​ int[] m4(){
​ ​ int sir[] = {8, 88, 888};
​ ​ return sir;
​ }
​ /*
​ void m5(int x=7){ // nu exista functii cu parametri impliciti
​ ​ System.out.println(x);
​ }
​ */
​ static void m6(){
​ ​ System.out.println("Metoda statica recomandat a fi apelata
fara obiect");
​ }
}

© Adriana Stan, Cosmin Strilețchi, Ligia Chiorean, Mircea Vaida ​ Inginerie Software ​ 5
public class Test{
​ public static void main(String... args) {
​ ​ int sir[] = {5, 3, 777};
​ ​ Methods_01 ob1 = new Methods_01();

​ ​ ob1.m1(sir); //parametru de tip tablou


​ ​ ob1.m1(10); //o singura variabila
​ ​ ob1.m1(100, 101, 102); //variabile enumerate
​ ​ ob1.m1(); //nici un parametru
​ ​ ob1.m2(sir);
​ ​ ob1.m3(sir);
​ ​ ob1.m2(sir); //-777, 3, 777
​ ​ sir = ob1.m4(); //8, 88, 888
​ ​ ob1.m1(sir);
​ ​ Methods_01.m6(); // apel metoda statica
​ }
}

2. Clase interioare

class InnerClass_01 {
​ static int i1 = 1;
​ int i2 = 2;
​ void m1(){
​ ​ int i3 = 3;
​ ​ class Inner1{
​ ​ ​ public void m1Inner(){
​ ​ ​ ​ System.out.println(i1);
​ ​ ​ ​ System.out.println(i2);
​ ​ ​ ​ System.out.println(i3);
​ ​ ​ }
​ ​ }
​ ​ Inner1 ob1 = new Inner1();
​ ​ ob1.m1Inner();
​ }
​ class Inner2{
​ ​ public void m2Inner(){
​ ​ ​ System.out.println(i1);
​ ​ ​ System.out.println(i2);
© Adriana Stan, Cosmin Strilețchi, Ligia Chiorean, Mircea Vaida ​ Inginerie Software ​ 6
​ ​ }
​ }
}
public class Test{
​ public static void main(String... args) {
​ ​ InnerClass_01 ob1 = new InnerClass_01();
​ ​ ob1.m1();
//InnerClass_01.Inner1 ob2 = new InnerClass_01().new Inner1();
// clasa Inner1 invizibila in ext, fiind interioara metodei m1()
​ ​ //ob2.m1Inner();​
​ ​ InnerClass_01.Inner2 ob3 = new InnerClass_01().new Inner2();
​ ​ ob3.m2Inner();​
​ }
}

3. StringTokenizer

import java.util.StringTokenizer;
class StringTokenizer_01 {
​ public static void main(String[] args) {
​ ​ String tags = "pizza pepperoni food cheese";
​ ​ // convert each tag to a token
​ ​ StringTokenizer st = new StringTokenizer(tags," ");
​ ​ while ( st.hasMoreTokens() ){
​ ​ String token = (String)st.nextToken();
​ ​ System.out.println(token);
​ ​ }
​ }
}

4. StringBuffer

import java.lang.*;
public class Test{
​ public static void main(String[] args) {
​​ System.out.println("Test StringBuffer!");
​ ​ StringBuffer sb = new StringBuffer(0);
​​ //inserarea la prima pozitie
​​ System.out.println(sb.insert(0, "început"));
​​ //determinarea lungimii

© Adriana Stan, Cosmin Strilețchi, Ligia Chiorean, Mircea Vaida ​ Inginerie Software ​ 7
​ ​ int len = sb.length();
​ ​ //inserarea la sfarsit
​ ​ System.out.println(sb.insert(len, "sfarsit"));
​​ //inserarea la o pozitie intermediara a unei instante anonime
Integer
​ ​ System.out.println(sb.insert(7, String.valueOf(777)));
​ ​ //inserarea la sfarsit a unei variabile de tipul elementar int
​​ System.out.println(sb.append(888));
​ }
}

Lucru individual
Complexitate *

1. Scrieți o clasă Methods în care să aveți 3 metode:

●​ o metodă cu număr variabil de parametri de tip întreg, care returnează media aritmetică a
parametrilor;
●​ o altă metodă în care să definiți un tablou unidimensional de n numere de tip double (n fiind
parametrul metodei și care va fi citit în main() de la tastatură); elementele acestuia vor primi valori
generate aleator, iar metoda va returna acest tablou;
●​ o metodă statică ce primește ca parametru un tablou de caractere, convertește caracterele
respective în majuscule și formează din acest șir un obiect String, pe care îl returnează.

Din metoda main(), definită într-o altă clasă, apelați metodele clasei Methods și afișați rezultatele pe
ecran (valorile de apel pentru prima metodă și șirul de caractere cu care se apelează a treia metodă se vor
defini în main()).

2. Definiți o clasă X care va avea ca atribute un șir de caractere privat, un obiect de tip String cu
specificatorul protected și un întreg fără specificator de acces. Clasa va conține un constructor explicit cu
parametri, care va inițializa atributele, metode accesor și mutator pentru câmpurile care nu pot fi accesate
din afara clasei și va redefini metoda finalize() moștenită din clasa Object, care va afișa un mesaj
corespunzător.

În metoda main(), plasată în altă clasă, creați un obiect din clasa X, afișați valorile atributelor, apoi pregătiți
obiectul pentru a fi eliminat de garbage collector. Creați apoi un nou obiect X, modificați valorile atributelor și
afișați pe ecran valorile acestora.

3. Scrieți o clasă Java care modelează o matrice de valori întregi. Atât dimensiunile matricii, cât și tabloul
bidimensional de elemente sunt atribute private în clasă, accesate prin intermediul unor metode publice
setter și getter. Includeți în clasă metode de afișare a matricii, de calcul și retur a numărului de grupuri
de elemente (9 valori învecinate), care nu diferă cu mai mult de 5% față de un anumit prag.

4. Scrieți o clasă Java numită Persoană cu atributele private:

●​ nume (String),
●​ latitudine și longitudine (float).

© Adriana Stan, Cosmin Strilețchi, Ligia Chiorean, Mircea Vaida ​ Inginerie Software ​ 8
Clasa conține un constructor explicit fără parametri, care inițializează nume cu null și latitudinea și
longitudinea cu 0.​
Metoda finalize() va fi implementată pentru a afișa un mesaj la distrugerea obiectelor.

Atributele clasei se pot modifica prin metodele mutator specifice setNume(), setLatitudine() și
setLongitudine(). Atributele vor fi returnate prin metode accesor specifice.

Instanțiați n obiecte, citiți și setați valorile atributelor, apoi afișați datele tuturor obiectelor.

5. Definiți un șir unidimensional de valori de tip char, având numărul mai mic sau cel mult egal cu un n citit
de la tastatură.​
Fiecare valoare conține valori alfanumerice generate aleator.

Transformați șirul de caractere într-un obiect de tip String.​


Afișați valoarea inițială și apoi valoarea obținută prin înlocuirea fiecărui caracter numeric cu *.

Complexitate **

7. Scrieți o aplicație care definește o clasă denumită Copil. Definiți metodele și variabilele membre ale
acestei clase pentru următoarele acțiuni/caracteristici:

●​ numele copilului,
●​ data nașterii,
●​ copilul știe să se prezinte: „Salut, numele meu este ...”,
●​ copilul știe să spună câți ani are,
●​ copilul știe să adune două numere mai mici decât 10 și să returneze rezultatul sub forma: „Suma lui
X și Y este Z”,
●​ copilul poate să spună alfabetul în formă directă, cât și inversă,
●​ copilul știe să spună „La revedere”,
●​ copilul știe să coloreze o tablă de șah de dimensiune dată, folosind culori alternative (pentru culori

●​
folosiți simbolurile 1 și 0),
copilul știe să joace X-0 singur 😊 (!!! Folosiți aplicația realizată în tema anterioară).

Precizări:

●​ numele copilului și data sa de naștere nu pot fi accesate din afara clasei.


●​ Toate informațiile despre un Copil vor fi completate cu ajutorul unui obiect de tip Copil, prin
intermediul variabilelor și metodelor corespunzătoare acestui obiect.
●​ Interacțiunea cu un copil se va face tot prin intermediul unui obiect instanțiat în main().

8. Scrieți o aplicație Java care definește o cheie de autentificare de tipul: XXXXX-XXXXX-XXXXX-XXXXX,


unde X reprezintă un caracter ce poate fi cifră sau literă.

Scrieți un program care verifică dacă această cheie are exact 4 grupuri de caractere a câte 5 caractere
fiecare, separate prin caracterul -. De asemenea, calculați numărul de cifre și litere din cheia de
autentificare.

Numărul de cifre trebuie să fie mai mare decât numărul de litere, iar numărul de litere nu poate să fie 0.

În cazul în care nu este îndeplinită cel puțin o condiție din cele menționate anterior, afișați mesajul: „Cheie
de autentificare incorectă!”

9, Să se definească o clasă numită Student, cu atributele private nume, nr_tel și media (constructori,
metode setter și getter).

© Adriana Stan, Cosmin Strilețchi, Ligia Chiorean, Mircea Vaida ​ Inginerie Software ​ 9
În metoda main() (inclusă într-o altă clasă), se creează un tablou unidimensional de obiecte de tip
Student, cu lungimea specificată de către utilizator.

Citirea datelor fiecărui student se face în formatul:

nume^^^nr_tel^^^media

Dacă informația specifică numărului de telefon nu este validă (10 caractere numerice, cu sau fără caractere
speciale de tip spațiu, - sau .), se cere reintroducerea întregului șir de caractere.

Să se ordoneze și să se afișeze studenții după nume și după media.

10. Să se implementeze o clasă numită Cerc cu atributele private:

●​ culoare (int),
●​ rază (float),

●​ poziție în plan (2 coordonate întregi).

Se definesc constructorii și metodele mutator și accesor specifice.

Valoarea culorii este împărțită în 4 octeți, reprezentând transparența, apoi cantitățile de R, G și B.

În metoda main() (inclusă într-o altă clasă), se citesc de la tastatură datele aferente unui șir de n obiecte
de tip Cerc.

Să se implementeze metodele care primesc ca parametru șirul de obiecte și afișează:

●​ datele cercurilor al căror centru este inclus într-unul din cele 4 cadrane,
●​ datele cercurilor care sunt incluse în întregime într-unul din cele 4 cadrane,
●​ datele cercurilor care au centrele pe aceeași dreaptă orizontală sau verticală,
●​ datele cercurilor care au cantitatea de R, G sau B într-un anumit interval specificat.

© Adriana Stan, Cosmin Strilețchi, Ligia Chiorean, Mircea Vaida ​ Inginerie Software 1
​0

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