duminică, 14 ianuarie 2024

Constructori în limbajul JAVA

Constructorii unei clase sunt metode speciale care au același nume ca și clasa, nu returnează nici o valoare și sunt folosiți pentru inițializarea obiectelor acelei clase în momentul instanțierii acestora.

Rețineți!
  • De fiecare dată când este creat un obiect este apelat un constructor;
Elev elev1 = new Elev();
  • Corpul constructorului este format din instrucțiuni care se execută la crearea unui nou obiect al clasei respective;
  • Fiecare clasă Java are cel puțin un constructor;
  • Dacă nu există declarați în mod explicit alți constructori atunci compilatorul va oferi un constructor implicit cu 0 argumente, care va avea forma:
public numeClasa(){
}
  • Constructorii au același nume (case-sensitive) ca și clasa acestuia;
  • Constructorii NU au tip de return. Putem avea definite metode cu același nume ca și clasa însă NU sunt constructori, de exemplu:
class Masina{
   int nrUsi;
   void Masina(int x){
        nrUsi = x;
    }}
public class Main{
    public static void main(String[] args) {
        Masina m = new Masina(); //constructor implicit
        m.Masina(4);
        System.out.println("Masina are"+ m.nrUsi + " usi!");
}}
  • Constructorii pot avea orice nume de argumente şi o clasă poate avea orice număr de constructori;
  • Dacă specificăm explicit un constructor atunci compilatorul va anula constructorul implicit, nu îl va mai genera, de aceea va trebui și pe acesta să îl definim;
  • Constructorul NU poate fi static, final sau abstract;
  • Pentru a apela un constructor al superclasei se folosi cuvântul cheie super.
  • Constructorii NU pot fi moșteniți.
În Java, există mai multe tipuri de constructori, în funcție de modul în care aceștia sunt declarați și folosiți:

a) Constructor implicit – este generat automat de compilator în cazul în care programatorul nu a definit un constructor. Acesta nu conține cod în interior. Așa tip de constructor nu îl veți găsi în cod deoarece acesta este creat în momentul compilării și inclus în fișierul cu extensia
.class:

De exemplu:

class Masina{
    int nrUsi;
}
public class Main{
 public static void main(String[] args) {
   Masina m = new Masina(); //constructor implicit
    m.nrUsi = 4;
System.out.println("Masina are "+ m.nrUsi + " usi!");
}}
Notă! În cazul în care veți declara un constructor, constructorul default NU va fi generat.
class Masina{
    int nrUsi;
    Masina(int x){
        nrUsi = x;
    }
}
public class Main{
    public static void main(String[] args) {
        Masina m = new Masina(); //eroare
        m.nrUsi = 4;
        System.out.println("Masina: culoare "+ m.nrUsi + " usi!");
}}
b) Constructor fără parametri – este scris de către programator și nu conține argumente, mai este numit constructor no-arg. Semnătura este aceeași cu cea a constructorului implicit, însă corpul poate avea orice cod, spre deosebire de constructorul implicit, unde corpul constructorului este gol.
class Masina{
    int nrUsi;
    Masina(){ System.out.println("Acesta NU este constructor implicit!");
    }
}
public class Main{
    public static void main(String[] args) {
        Masina m = new Masina();
        m.nrUsi = 4;
        System.out.println("Masina are"+ m.nrUsi + " usi!");
 }}
c) Constructor parametrizat – este scris de programator și poate conține orice număr de parametri sau argumente. Se utilizează pentru a inițializa datele unui obiect.

class Masina{
  int nrUsi;
  Masina(int x){
    nrUsi = x;
    }
}
public class Main{
  public static void main(String[] args) {
    Masina m = new Masina(4);
    System.out.println("Masina are " + m.nrUsi + " usi!");
  }}
Este posibil ca în interiorul clasei să fie folosită variabila predefinită this care face referire la obiectul curent al clasei, mai jos vom explica și alte aspecte legate de această variabilă. Dar în contextul exemplului de mai sus observăm că argumentul costructorului are un identificator diferit de atributul clasei, dar sunt cazuri în care acestea pot avea același identificator.
Pentru a diferenția atributul clasei de argumentul constructorului se folosește this, ca în exemplul de mai jos:

class Masina{
    int nrUsi;
    Masina(int nrUsi){
        this.nrUsi = nrUsi;
    }
}
public class Main{
    public static void main(String[] args) {
        Masina m = new Masina(4);
        System.out.println("Masina are " + m.nrUsi + " usi!");
  }}
Deci, la atributul clasei i se atribuie argumentul constructorului, și nu invers!!!!


În cadrul unei clase pot fi definiți constructori cu listă diferită de parametri.
De exemplu:
class Masina{
int nrUsi;
String culoare;
String marca;
Masina(){
}
Masina(int nrUsi){
this.nrUsi = nrUsi;
}
Masina(String culoare){
this.culoare = culoare;
}
Masina(int nrUsi, String culoare,String marca){
this.nrUsi = nrUsi;
this.culoare = culoare;
this.marca = marca;
}
}
public class Main{
public static void main(String[] args) {
Masina m1 = new Masina(4);
System.out.println("Masina 1 are " + m1.nrUsi + " usi si culoare "+ m1.culoare);
Masina m2 = new Masina("rosie");
System.out.println("Masina 2 are " + m2.nrUsi + " usi si culoare "+ m2.culoare);
Masina m3 = new Masina(2,"rosie","BMW");
System.out.println("Masina 3 are " + m3.nrUsi + " usi si culoare "+ m3.culoare +
" marca"+m3.marca);
}}
  
Așa tip de constructori se numesc supraîncărcați. Fiți atenți în utilizarea acestor constructori, fiecare are destinația sa, primul va inițializa doar numărul de uși restul atributelor clasei vor fi inițializate cu valori default după cum urmează: atributele de tip String vor fi inițializate cu valoarea null, cele de tip întreg cu valoarea 0, cele boolean cu valoarea false, iar cele reale cu valoarea 0.0.

Variabila predefinită this are în linii generale trei utilizări în cadrul clasei și anume:

a) în interiorul constructorului, pentru a face diferență dintre variabilele instanță și cele locale (de metodă) dacă acestea au aceeași denumire sau pentru a referi obiectul construit.

De exemplu:




b) atunci când o referință la obiectul receptor trebuie transmisă ca parametru la apelul unei alte metode. 
De exemplu:


c) pentru a apela un constructor din interiorul aceleiași clase:







sâmbătă, 13 ianuarie 2024

Clase și obiecte. Tabel comparativ

 










Bibliografie

Emanuela Cerchez, Marinel Șerban, Programarea în limbajul C/C++ pentru liceu, Programarea Orientată spre Obiecte și programarea generică cu STL, Polirom, 2013  

D.Danciu, G.Mardale - Arta programării în JAVA (Vol. I), Editura Albastra 2004

C. Frăsinaru, Curs practic de Java, București, Ed. Matrix Rom, București 2000

B. Eckel, Thinking in Java, Prentice Hall (4-th Edition), 2006

Y. Daniel Liang, Introduction.To.Java.Programming.10th.Edition 

joi, 11 ianuarie 2024

Clase și obiecte. Concepte generale

După cum am menționat în postările anterioare programarea orientată pe obiecte (POO) este o modalitate de a scrie programe în care totul este organizat în jurul unor obiecte. Fiecare obiect descrie caracteristici (cum este) și operații (ce poate face), iar aceste obiecte pot comunica și colabora între ele pentru a rezolva o problemă concretă.

Aceste caracteristici și proprietăți sunt definite într-o clasă, adică clasa este un șablon sau un prototip după care se creează obiectele. Ea definește ce proprietăți (atribute, caracteristici, variabile, date, câmpuri) și ce acțiuni (metode, funcționalitate) vor avea obiectele realizate în baza ei.

De exemplu:

Să presupunem că dorim să dezvoltăm un soft pentru gestionarea închirierii de mașini. În cadrul acestui sistem, mașinile BMW de diferite culori – roșu, verde și galben – reprezintă doar câteva dintre vehiculele concrete, reale, disponibile pentru închiriere. De asemenea, persoane precum Ecaterina, Ion și Mihai sunt exemple de clienți care pot închiria aceste mașini.

În soft, atât mașinile, cât și clienții sunt reprezentate ca obiecte. Structura generală a unei mașini este definită într-o clasă, de exemplu Mașină, iar structura unui client este definită într-o clasă separată, de exemplu Client. Fiecare mașină concretă (BMW roșu, verde sau galben) este un obiect creat pe baza clasei Mașină, iar fiecare persoană este un obiect creat pe baza clasei Client.

Important! Atunci când creăm de fapt un obiect în baza unei clase, corect spunem, instanțiem clasa. 

Obiectele de tip Client interacționează cu obiectele de tip Mașină, deoarece un client poate închiria o mașină. Această interacțiune dintre obiecte ilustrează principiul de bază al programării orientate pe obiecte, unde sistemul este construit din obiecte care colaborează între ele.

Într-o programare mai avansată, atunci când dorim să creăm interfețe grafice, cum este de exemplu fereastra ilustrată.

....surpriză....și aici vom avea la fel de a face cu obiecte și clase. De exemplu ori de câte ori apare necesitatea creării unui obiect de tip buton, cum este cel din fereastră Adauga in lista sau Calculeaza bursa va fi necesar să instanțiem clasa JButton care este prototipul unui buton. După creare, fiecărui obiect de tip JButton i se atribuie caracteristici concrete, cum ar fi textul afișat, dimensiunea, culoarea și acțiunea executată la apăsare.

În mod similar, pentru câmpurile de introducere a datelor (Nume, Prenume, Media), este necesară instanțierea clasei JTextField. Aceste obiecte permit introducerea și preluarea datelor de la utilizator.

Aceste obiecte cooperează între ele, butonul are nevoie de datele introduse în câmpurile de editare pentru a putea calcula bursa sau pentru a adăuga informațiile într-o listă.  

Datele din cutiile de editare ca să poată fi adăugate în listă este nevoie de un obiect, de exemplu de tip Elev.

Clase ca JButton sau JTextField sunt clase predefinite din pachetul Swing al limbajului Java, iar clasa Elev este una definită de programator.

Este necesar să menționăm că în limbajul Java, toate clasele fac parte dintr-o ierarhie de clase, iar părintele tuturor claselor Java este clasa Object.

Mai jos este un exemplu de ierarhie de clase predefinite în limbajul Java:

Excepţiile reprezintă mecanismul java folosit pentru tratarea erorilor ce  apar în timpul execuţiei programelor

Nu ne oprim momentan la ele, dar vom reveni la termenul de ierarhie când vom studia principiul moștenirii. 😉

În cele ce urmează vom studia cum să definim propriile clase în limbajul Java și cum să le instanțiem.

Mai țineți minte care este sinonimul cuvântului a instanția? A crea o instanță (obiect) pentru o clasă.

Succes!
❤️

miercuri, 10 ianuarie 2024

Exerciții practice. Controlul execuției. Tablouri unidimensionale


1. Calculul costului călătoriei 
Scrieți un program în Java care citește de la tastatură distanța parcursă în kilometri și calculează costul călătoriei. Programul va afișa atât tariful calculat, cât și costul final după eventuale reduceri. Regulile de stabilire a reducerii sunt următoarele:
  • Dacă distanța este mai mare de 30 km, costul pe km este 12 lei și se aplică o reducere de 10% din total.
  • Dacă distanța este între 15 și 30 km, costul pe km este 15 lei și fără reducere.
  • Dacă distanța este mai mică de 15 km, costul pe km este 20 lei și fără reducere.

2. Suma cifrelor și divizibilitatea cu 3
Scrieți un program în Java care citește de la tastatură un număr întreg, după care calculează suma cifrelor numărului folosind o buclă while. Programul va afișa care este suma cifrelor și dacă aceasta este un număr divizibil cu 3 sau nu.

Algoritm de urmat:


Exemplu:



3. Monitorizarea temperaturilor dintr-un laborator


O instituție monitorizează temperaturile dintr-un laborator pentru n camere. Scrieți un program în Java care:
  • citește de la tastatură numărul n și apoi cele n valori reale care reprezintă temperatura (°C) în fiecare cameră, stocate într-un vector;
  • determină temperatura medie a laboratorului;
  • găsește temperatura maximă înregistrată, constanta Double.NEGATIVE_INFINITY;
  • determină câte camere au temperaturi sub 18°C;
  • determină câte camere au temperaturi peste 25°C.
Date de ieșire:
  • pe prima linie: temperatura medie (număr real)
  • pe a doua linie: temperatura maximă (număr real)
  • pe a treia linie: numărul camerelor cu temperaturi sub 18°C (număr întreg)
  • pe a patra linie: numărul camerelor cu temperaturi peste 25°C (număr întreg)
4. Analiza notelor elevilor

Elaborați un program Java care va permite unui profesor să analizeze notele obținute de elevi la un test. Programul va permite citirea numărului de elevi (n) și nota (de la 1 la 10) fiecărui elev și le stochează în vector. Programul va calcula și:
  • afișa media generală a clasei;
  • afișa nota maximă și nota minimă, folosind Integer.MIN_VALUE și Integer.MAX_VALUE;
  • afișa numărul de elevi care au trecut testul (nota ≥ 5) și câți nu au susținut testul (nota < 5).
5. Dublarea elementelor impare

De la tastatură se introduce dimensiunea și elementele unui vector. Programul va afișa vectorul introdus, va înlocui elementele impare din vector cu dublul lor, după care va afișa vectorul modificat.

6. Media și elementele sub media aritmetică

De la tastatură se introduce dimensiunea unui vector și elementele acestuia. Programul va afișa vectorul introdus, va calcula media aritmetică a elementelor și va determina numărul de elemente mai mici decât media aritmetică, afișând rezultatele obținute.

7. Eliminarea unui număr din vector

De la tastatură se introduce dimensiunea unui vector și elementele acestuia, precum și un număr natural x. Programul va afișa vectorul introdus, va elimina toate aparițiile numărului x din vector, va afișa vectorul rezultat și noua sa lungime.

8. Verificarea elementelor pozitive

De la tastatură se introduce dimensiunea unui vector și elementele acestuia. Programul va afișa vectorul introdus, va verifica dacă toate elementele vectorului sunt numere pozitive și va afișa rezultatul verificării.

Succes!
❤️