Introduction to Java Programming Java is a popular high-level programming language used to create robust and dynamic applications. It comes in the form of either a JDK or JDE. What is Java? Java Runtime Environment (JDE) is the environment necessary to run programs written in Java. It contains (compiled) bytecode of standard classes as well as a virtual machine (JVM) and tools enabling program execution. Java Development Kit (JDK) is a necessary environment for programming in Java. It contains JRE, and in addition everything that is required to be able to write a program in Java: source code of standard classes and support tools (compiler, archiver, debugger etc.). Let's write our first program Before that: Make sure you have the JDK installed and added to the ENV_PATH of the system and user. https://www.youtube.com/watch? v=TksJc5O3wz4 Have an IDE set up on your local machine. https://www.jetbrains.com/idea/download/ Make sure you have Maven installed as well. Download from the official link then follow either this step-by-step guide or this video for the installation process. Apache Maven Ensure the following are the same as in the image: Name JDK Catalog Archetype Creating a project Create a new project as shown in the image. Basic Java Syntax Write the below code in a new java class file public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } Basic Java Syntax The provided syntax is a basic example of a Java program. Let's break it down step by step: 1. public class HelloWorld: This line declares a public class named "HelloWorld." In Java, every program starts with a class definition, and the class name must match the file name (in this case, HelloWorld.java). The public keyword means that the class is accessible from other classes. 2. {: The opening curly brace marks the beginning of the class's body. It encapsulates all the statements and declarations within the class. 3. public static void main(String[] args) {: This line declares a method called main within the class. It is a special method that serves as the entry point of the program. The public keyword indicates that the method can be accessed from other classes. The static keyword means the method belongs to the class itself, not to an instance of the class. The void keyword specifies that the method does not return any value. The method accepts a single parameter, an array of strings named args, which can be used to pass command-line arguments to the program. 4. System.out.println("Hello world!");: This line is a statement within the main method. It uses the System.out.println method to print the string "Hello world!" to the console. The println method adds a newline character after printing the string. 5. }: The closing curly brace marks the end of the main method. 6. }: The closing curly brace marks the end of the class body. Overall, this Java program defines a class called HelloWorld with a main method that prints "Hello world!" to the console when executed. How does a method that returns something, looks like? Variabile Variabilele sunt aliasuri pentru a defini niste valori. Odata definite ele pot fi refolosite ulterior in cadrul codului oriunde este necesar. Mai departe vom vorbi de tipurile lor dar si despre conventii. Variabile Tipuri Java este un strongly typed language ceea ce inseamna ca fiecare variabila va fi scrisa cu un scop precis in minte si va fi folosita intr-un scenariu unde acel tip de variabila este necesar. Logica variabilelor este de a specifica tipul variabilei, apoi sa denumim variabila. Desi nu obligatoriu, de obicei dupa definirea tipului si numelui variabilei ii adaugam valoarea, aceasta fiind precedata de un semn de egal. Exemplu teoretic: variableType variableName Exemplu practic: int unNumeDeVariabila Variabilele sunt declarate initial: int variabilaMea; Apoi ele sunt initializate cand li se confera prima valoare: variabilaMea = 8; Daca ulterior ele sunt manipulate si li se schimba valoarea, atunci lor le sunt atribuite alte valori variabilaMea = 10 Majoritatea variabilelor vor fi declarate si initializate in aceeasi linie de cod: int numarBujiiInlocuire= 10 Variabilele pot fi simple (int, float) sau complexe (string sau clase create de noi). Clasele de tip wrapper se infasoara (to wrap) in jurul tipurilor simple. Acestea sunt obiecte ale limbajului de programare si vor ocupa mai mult spatiu decat cele simple. Wrapperele le vom folosi de fel cand definim argumente sau initializam variabile cu scope extins. Scope extins inseamna ca se folosesc in cadrul mai multor clase din acelasi test. Variabile Reguli de scriere 1. Camel Case: Variable names should be written in camel case, starting with a lowercase letter and capitalizing the first letter of each subsequent concatenated word. For example: firstName numOfStudents totalAmount 2. Meaningful Names: Variable names should be descriptive and reflect the purpose or content of the variable. Avoid using single-letter names or cryptic abbreviations that may be difficult to understand. For example: customerName instead of cn numberOfItems instead of noi isAvailable instead of ia 3. Use of lowercase: Variable names should be in lowercase, except for constants, which are typically written in uppercase with underscores between words. For example: final int MAX_VALUE = 100; final double PI = 3.14; 4. Avoid Reserved Keywords: Do not use reserved keywords as variable names, as they have predefined meanings in Java. Examples of reserved keywords include int, boolean, class, if, for, etc. 5. Class and Interface Names: Class and interface names should follow similar conventions as variable names, but with the first letter capitalized. For example: Student Person PaymentProcessor 6. Instance Variables: Instance variables (variables defined within a class) should begin with a prefix of this. to distinguish them from local variables. For example: private int age; private String name; 7. Constant Variables: Constants should be declared using the final keyword, and their names should be in uppercase with underscores between words. For example: final int MAX_LENGTH = 100; final String ERROR_MESSAGE = "An error occurred."; These conventions help make your code more readable, understandable, and maintainable by yourself and others who may read or work on your code. It's important to follow these conventions to promote consistency and improve code quality. Bonus: Variables can contain numbers in their names. Example: var123 = 5 Variables can not start with numbers. Example: 123Var = 5 Another naming convention is the snake case where variables are written in all lower case and each subsequent word is separated by an underscore. Example: this_is_snake_case. The camel case naming convention and snake convention can be merged. Example: this_Is_Both_Camel_Case_And_Snake_Case Bonus 2: Constants are like variables but they have usually one predetermined goal. Once they are defined they will not be changed throughout the project, no matter what. It is always written with uppercase letters and each word separated by an underscore. final constantType CONSTANT_NAME; Operators Operatorii sunt simboluri utilizate pentru a putea manipula valori si variabile. In urmatoarele slide-uri vom discuta cei mai utilizati operatori dar si tipurile lor. Cei mai frecventi operatori intalniti vor fi cei de : aditie substractie incrementare decrementare Operatori aritmetici Exemple utilizare operatori Operatori comparativi Cei mai frecventi operatori intalniti vor fi cei de : Equal to == Not equal != Exemple utilizare operatori Assignment operators Cei mai frecventi operatori intalniti vor fi cei ce : Asigneaza valoarea expresiei din dreapta la variabila din stanga x = y Fac aditia inainte de asignare x+=y sau altfel spus x = x + y Fac substractia inainte de asignare x-=y sau altfel spus x = x - y Exemple utilizare operatori Toti operatorii sunt des folositi. Exemple utilizare operatori Logical operators Cel mai frecvent operator intalnit aici va fi cel ternar / ternary operator. Exemple utilizare operatori Alti operatori String este o clasa pe care limbajul Java o contine implicit in cod. Este folosita pentru a pastra texte in variabile. Clasa contine multiple metode , descrise mai jos, metode ce permit programatorului sa lucreze cu texte. String Class Metoda Descriere Exemplu isEmpty() Intoarce un raspuns de tip boolean in functie de string. Daca string-ul este gol returneaza true daca string-ul are minim un caracter atunci intoarce false. String myVar = new String("Hello world!"); System.out.println(myVar.isEmpty()); // false equals() Verifica continutul variabilei sa fie acelasi, nu il intereseaza daca face referinta la aceeasi locatie din memorie alocata variabilei, ergo nu il intereseaza ce instantiere (new String sau String) este. In JavaScript in loc de aceasta metoda, se inlocuieste cu ==, iar functionalitatea == este inlocuita cu === String myVar = new String("Hello world! What a world."); String str = "Hello world! What a world."; System.out.println(myVar.equals(str)); // true System.out.println(myVar == str); // false split() Imparte un obiect in mai multe elemente. Scopul este fie sa testam fiecare element in parte ori ca sa testam doar anumite elemente, in functie de caz. Elementele de obicei le salvam in array-uri. (ex. Verificam ca butoanele de tip Read more... functioneaza fiecare in mod corect.) String myVar = new String("Hello world!"); String[] elements = myVar.split(" "); // split an object in little piecese System.out.println(elements[0]); // Hello System.out.println(elements[1]); // world! substring() Daca argumentul este singular atunci cauta indexul conform argumentului si returneaza string-ul ramas care incepe de la acel index. Daca sunt doua argumente atunci returneaza string-ul care incepe cu primul index dar nu include si caracterul de la cel de-al doilea index. String myVar = new String("Hello world! What a world."); System.out.println(myVar.substring(13)); // What a world. System.out.println(myVar.substring(13, 16)); // Wha contains() Verifica daca string-ul folosit ca argument se regaseste in cadrul variabilei (stringului mama). Daca argumentul se regaseste in string-ul mare atunci intoarce raspuns boolean true altfel intoarce false. String myVar = new String("Hello world!"); System.out.println(myVar.contains("wor")); // true concat() Aceasta metoda inseamna concatenare adica alipirea unui string la un alt string. Se poate alipi un alt tip de date (ex. int) daca e transformat in string (ex. (string)123 ). Nu suporta diferite tipuri de date in argumente, nu suporta null si creeaza un nou obiect chiar daca e gol. String str1 = "Hello"; String str2 = " "; String str3 = "World"; String result = str1.concat(str2).concat(str3); System.out.println(result); join() String.join(String delim, String arg1, ..., String argN); Metoda accepta n numar de parametrii/argumente dar este chemata numai la clasa String nu la variabila precum celelalte metode de pana acum. Putem inlocui metoda concat() cu operatorul + , acesta concateneaza si alte tipuri de date (ex. int), nu arunca eroare la null si creeaza intotdeauna un nou obiect. Ex: myVar = myVar + " We meet again..."; String myVar = new String("Hello world!"); System.out.println(String.join(" ", myVar, "We meet", "again...")); // Hello world! We meet again... String este o clasa pe care limbajul Java o contine implicit in cod. Este folosita pentru a pastra texte in variabile. Clasa contine multiple metode , descrise mai jos, metode ce permit programatorului sa lucreze cu texte. String Class Metoda Descriere Exemplu length() Metoda care intoarce lungimea uni string, mai exact intoarce numarul de caractere din string. String myVar = new String("Hello world!"); System.out.println("Your string is " + myVar.length() + " character(s) long."); // Your string is 12 character(s) long. indexOf() Metoda intoarce primul index pe care il intalneste in cadrul stringului unde argumentul este prezent. Indexii se numara de la 0. Daca nu gaseste index pentru argument, intoarce valoarea -1. String myVar = new String("Hello world! What a world."); System.out.println(myVar.indexOf("wor")); // 6 replace() Inlocuieste toate instantele celui de-al doilea argument cu primul argument din cadrul variabilei atasate metodei. myVar.replace(char oldChar, char newChar); myVar.replace(String oldChar, String newChar); // in fact the method accepts CharSequence type parameters, but we can easily use String toUpperCase() Schimba componenta string-ului in acelasi string dar scris cu majuscule. String myVar = new String("H.e.l.l.o world!"); System.out.println(myVar.replace('.', '-')); // H-e-l-l-o world! myVar = new String("H.e...l.l...o world!"); System.out.println(myVar.replace("...", "->")); // H.e->l.l->o world! String myVar = new String("Hello world!"); System.out.println(myVar.toUpperCase()); // HELLO WORLD! toLowerCase() Schimba componenta string-ului in acelasi string dar scris cu minuscule. String myVar = new String("Hello world!"); System.out.println(myVar.toLowerCase()); // hello world! lastIndexOf() Mentioneaza ultimul index unde se regaseste argumentul dat metodei, fie ca vorbim de un caracter sau un grupaj de caractere. String myVar = new String("Hello world! What a world."); System.out.println(myVar.lastIndexOf("wor")); // 20 Printarea se face in cadrul terminalului, intotdeauna dar exista metode aditionale care sa permita salvarea unui print ca string si utilizarea sa ulterioara. In aceasta pagina vom vorbi despre cum putem altera un string in functie de variabilele primite. print() Modalitati de printare Bonus Primul fel de a printa ceva in terminal este sa ne folosim de clasa System System.out.print(param); A doua metoda este de a printa parametrul si a spune terminalului sa treaca pe urmatoarea linie (ca si cum ar apasa Enter) System.out.println(param); \n inseamna new-line asadar: System.out.print(param+"\n"); e acelasi lucru cu System.out.println(param); Metoda printf() este cea mai avansata. Ea permite sa oferim drept parametrii alte variabile in cadrul unui string. Extrem de util cand folosim date dinamice (ex. vezi codurile din url-uri care se modifica in functie de instanta deschisa). In stanga putem vedea coduri pentru inlocuirea in cadrul string-ului a variilor cuvinte ce vor veni din cadrul variabilelor. String catName = "Fluffy"; int catAge = 8; System.out.printf("My cat, %s, is %d years old.%n", catName, catAge); // My cat, Fluffy, is 8 years old. Totusi, ne vom trezi in situatia in care nu vom dori sa printam ci sa salvam un string a carui componenta este atat text dar si variabile, fie in cazul datelor dinamice ce se schimba des, fie in cazul testarii cu mai multi parametrii. In cazul acela folosim metoda format() aceasta putand fi apelata doar de catre clasa String. Asadar vom crea o variabila de tip string si vom chema String.format int age = 25; double height = 1.75; String name = "John"; String formattedString = String.format("My name is %s, I am %d years old, and my height is %.2f meters.", name, age, height); System.out.println(formattedString); Exista o diferenta intre un string gol (empty string) si conceptul de null. Gandeste-te la diferenta dintre aer si vidul din cosmos, ambele par goale dar una dintre ele totusi contine ceva. La fel, un string gol, este un obiect real, existent pentru care codul pune deoparte memorie. Putem folosi metode asupra unui string gol String emptyString = ""; System.out.println(emptyString.length()); // 0 In cazul null avem o variabila declarata dar fara memorie alocata pentru ea. Aceasta nu este un obiect si daca incercam sa folosim metoda pe ea, vom intampina erori ce au cuvantul Null in componenta lor. String nullString = null;//nullString = ""; // if we assign any String to our variable, the next line will work correctly System.out.println(nullString.length()); // throws an exception: java.lang.NullPointerException Conditional Statements Scopul lor este de a executa un anumit cod intr-o anumita situatie iar daca situatia impune o alta rezolvare, sa execute un alt cod. Declaratii conditionale: if, else if, else si switch. IF STATEMENT IF Cea mai des declaratia conditionala utilizata pentru a executa o parte de cod, este declaratia IF. Sintaxa contine conditia IF urmata de un parametru intre paranteze ce mentioneaza conditia in care codul va rula, iar apoi doua acolade inauntrul carora va fi scris codul ce va executa DACA CONDITIA DINTRE PARANTEZE ESTE TRUE Scopul lui IF este deobicei de a compara variabile folosind operatori comparativi fie solitari fie in combinatie cu operatori logici. ELSE IF, ELSE STATEMENTS Conditia IF poate fi extinsa cu un ELSE sau cu mai multe ELSE IF-uri, dupa cum putem vedea in exemplul din partea dreapta. Inainte de asta, ar fi util sa intelegem sintaxa si motivul pentru aplicarea acesteia. ELSE IF, ELSE 01 04 Recapitulare: daca conditia IF nu este indeplinita atunci codul menit sa fie executat va fi omis/ignorat. Verificarea continua pana se indeplineste una dintre conditii sau nu mai exista conditii de verificat. 02 05 Daca IF nu este indeplinit, va fi verificata conditia ELSE IF In momentul in care una dintre conditii a fost validata, programul se opreste iar restul conditiilor nu se mai verifica. 03 Bonus Daca se intoarce TRUE conditia de la punctul 02, atunci codul este executat si programul se opreste. Daca returneaza FALSE , codul cauta urmatorul ELSE IF pentru a verifica conditia. Putem folosi doar ELSE in caz cazul in care dorim sa executam un cod ca rezultat al lipsei satisfacerii conditiei IF. Daca niciuna dintre conditii din cadrul unui block de ELSE IF nu este satisfacuta, atunci codul va fi ignorat si aplicatia va rula in continuare de parca nici nu a existat bucata de cod IF-ELSEIF. SWITCH STATEMENT SWITCH STEATEMENT Logica Default JAVA 14+ Expresia switch incepe prin folosirea cuvantului switch apoi continua cu un parametru intre paranteze. In functie de parametru, se decide care code-block va fi executat. Code-block-ul este declarat prin cuvantul case urmat de o valoare. Aceasta valoarea este comparata cu parametrul si se stabileste daca va fi rulat acel case sau daca se cauta altul. La finalul unui case se incheie rularea codului prin break. Odata gasit un case compatibil cu parametrul, restul case-urilor nu mai sunt verificate. Exista optiunea de a adauga un caz default care va rula automat daca cazurile definite sunt incompatibile cu parametrul definit. Acest caz default este optional. In cazul in care toate cazurile sunt incompatibile si nu exista cazul default, tot code-block-ul switchului va fi ignorat. In ultimele iteratii ale JAVA a fostr introdusa sintaxa -> Folosindu-ne de ea, putem evita ca case-urile sa fie iterate in numar constant pana la final in cazul lipsei unui break. Iar codul va fi mai clar, scurt si usor de citit. Vezi pagina urmatoare pentru exemple. SWITCH STATEMENT MORE ABOUT SWITCHES: HTTPS://NIPAFX.DEV/JAVA-SWITCH/ EXEMPLE VS STUDIO SHODWE Loops & Arrays F O R L O O P W H I L E L O O P D O W H I L E L O O P A R R A Y S A R R A Y S A N D L O O P S M U L T I D I M E N S I O N A L F O R E A C H L O O P A R R A Y S LOOPS For LOOP Cand avem bucati de cod care s-ar repeta de multiple ori, folosim loops. FOR se foloseste atunci cand stim exact cate repetitii vrem sa existe. Sintaxa contine 3 expresii si functioneaza in urmatorul fel: expresia1 ruleaza o singura data la inceputul codului. Aici avem o declaratie sau initializare a unei variabile deja declarate expresia2 ruleaza la inceputul fiecarei iteratii a codului, ea are scope boolean adica daca este TRUE , loop-ul ruleaza in continuare, daca devine FALSE atunci loop-ul inceteaza. expresia3 este executata la finalul fiecarui loop si este folosita drept punct de reper pentru expresia2 Cu alte cuvinte, un loop functioneaza in felul urmator: expresia 1 este notata, expresia doi vede daca conform codului este TRUE sau FALSE, daca expresia 2 este true, se executa codul din loop, apoi expresia 3 este executata, apoi iar expresia 2, iar se verifica aceasta si daca este FALSE atunci codul nu mai este executat. LOOPS În acest exemplu, avem o listă listaProduse care conține unele produse. În bucla for, verificăm indexul fiecărui element. Dacă indexul este 2, utilizăm instrucțiunea continue pentru a sări peste afișarea acestui element și pentru a continua cu următorul element. For LOOP Example În acest exemplu, avem un ArrayList numit cartItems care stochează elementele din coșul de cumpărături. Bucla FOR iterează prin elementele listei cartItems utilizând variabila de loop i, care reprezintă indexul fiecărui element. Bucla continuă atât timp cât i este mai mic decât dimensiunea listei (cartItems.size()). În interiorul buclei, fiecare element este preluat folosind cartItems.get(i) și afișat cu un prefix de puncte. Dacă indexul este 4, utilizăm instrucțiunea break pentru a ieși din buclă și a opri afișarea celorlalte elemente. Astfel, vom afișa doar primele două produse din listă. Exemplul ilustrează cum putem utiliza instrucțiunile continue și break pentru a controla fluxul unei bucle for, în funcție de anumite condiții sau criterii. Acest exemplu demonstrează cum un FOR loop poate fi utilizat într-un scenariu real pentru a itera printr-o colecție de produse, cum ar fi afișarea conținutului unui coș de cumpărături pe un site de comerț electronic. LOOPS while loop While loop se foloseste atunci cand nu suntem siguri cate iteratii vom avea pentru repetitia codului. Sintaxa contine o singura conditie, ea este validata la inceputul fiecarei iteratii si returneaza o valoarea de tip boolean (TRUE sau FALSE). Daca este true atunci continua codul, daca este false atunci codul nu mai ruleaza. Exemplu simplu STUDIO SHODWE While loop Exemplu În acest exemplu, clasa FileProcessing conține metoda main care demonstrează procesarea unui fișier utilizând un ciclu while. Inițializăm variabila currentLine cu valoarea 1 pentru a indica linia curentă din fișier, iar variabila booleană fileContinues este setată inițial pe true pentru a indica că procesarea fișierului continuă. În cadrul ciclului while, se citește o linie din fișier utilizând metoda readLineFromFile care primește ca argument numărul liniei. Dacă linia returnată este null, înseamnă că am ajuns la sfârșitul fișierului, deci setăm fileContinues pe false pentru a ieși din ciclu. Dacă linia conține textul "important text", apelăm metoda processLine pentru a procesa acea linie. În caz contrar, trecem la linia următoare prin incrementarea valorii variabilei currentLine și utilizând instrucțiunea continue pentru a sări la următoarea iterație a ciclului. După fiecare iterație a ciclului, incrementăm currentLine pentru a trece la următoarea linie din fișier. Metoda readLineFromFile este responsabilă cu citirea unei linii din fișier pe baza numărului de linie primit ca argument și returnează conținutul liniei sau null în cazul în care am ajuns la sfârșitul fișierului. Metoda processLine este folosită pentru a procesa o linie din fișier și conține codul specific de procesare. Prin utilizarea acestui ciclu while, putem parcurge un fișier linie cu linie și efectua anumite acțiuni în funcție de conținutul fiecărei linii. LOOPS Do While Conditia pentru do - while, este verificata la finalul fiecarei iteratii. Ea returneaza o valoare de tip boolean, daca este TRUE atunci se executa urmatoarea iteratie , daca este FALSE atunci loop-ul se opreste. LOOPS Exemplu DO WHILE Acest exemplu simulează interacțiunea cu utilizatorul pentru a citi un număr între 1 și 10. Programul va solicita în mod repetat introducerea unui număr până când utilizatorul furnizează un număr valid. Loop-ul do-while se asigură că cererea de introducere a numărului este afișată cel puțin o dată, indiferent de validitatea inițială a introducerii. Apoi, în interiorul buclei, programul verifică dacă numărul introdus se află în intervalul specificat (1-10). Dacă este valid, variabila validInput devine true, iar bucla se oprește. În caz contrar, variabila rămâne false, iar utilizatorul este solicitat să reintroducă un număr valid. La finalul programului, se afișează un mesaj de încheiere și se închide obiectul Scanner pentru eliberarea resurselor. Acest exemplu ilustrează utilizarea buclei do-while pentru a obține și valida introducerile de la utilizator într-un scenariu real. ARRAYS Un array în Java este o structură de date care poate stoca o colecție de elemente de același tip. Aceste elemente sunt accesate utilizând un index bazat pe zero, care reprezintă poziția fiecărui element în array. Pentru a crea un array, specificăm tipul elementelor și numărul de elemente pe care dorim să le stocăm. Iată un exemplu de creare a unui array de întregi: Array În acest exemplu, am asignat valoarea 10 primului element (numbers[0]). Pentru a obține valoarea celui de-al treilea element (numbers[2]), am folosit indexul 2. De asemenea, am asignat al cincilea element ca suma celui de-al doilea și celui de-al patrulea element (numbers[4] = numbers[1] + numbers[3]). De asemenea, putem itera prin toate elementele array-ului folosind o buclă for sau o buclă foreach. Iată un exemplu de utilizare a unei bucle for pentru a afișa toate elementele array-ului numbers: În acest exemplu, am creat un array numit numbers care poate stoca 5 valori întregi. Prin utilizarea expresiei new int[5], alocăm spațiu în memorie pentru array și specificăm că acesta va conține 5 elemente de tip întreg. Putem accesa și modifica elementele array-ului utilizând indexul lor. Indexul începe de la 0 pentru primul element și se termină la lungimea array-ului minus 1. Iată cum putem accesa și modifica elementele array-ului numbers: În acest exemplu, numbers.length returnează lungimea array-ului, iar bucla for iterează de la indexul 0 până la lungimea array-ului minus 1. Astfel, putem afișa fiecare element al array-ului utilizând indexul i. Arrays în Java oferă o modalitate eficientă de a stoca și manipula colecții de elemente de același tip. Utilizând indexul, putem accesa și modifica elementele individual, precum și itera prin întregul array pentru a le procesa sau afișa. LOOPS AND ARRAYS În acest exemplu, se simulează o aplicație de vânzare a mașinilor. Am creat o clasă Car pentru a reprezenta un obiect de tip mașină, cu atributele de marcă (make), model (model) și an de fabricație (year). Am creat, de asemenea, un array de mașini (inventory) pentru a stoca inventarul mașinilor disponibile în dealer. Fiecare element din array reprezintă un obiect de tip Car, care este creat și adăugat la inventar utilizând constructorul clasei Car. for loop Ulterior, am afișat inventarul de mașini utilizând o buclă for-each. Pentru fiecare mașină din inventar, am afișat informațiile despre marcă, model și anul mașinii. Pe scurt Acest exemplu ilustrează modul în care un array poate fi utilizat pentru a stoca și accesa diferite obiecte în cadrul unei aplicații de vânzare a mașinilor. DAR NOI TESTĂM Aici mai trebuia un import: import App/path/catre/locatia/unde/e/definit/CarDealership.java În acest exemplu, am creat o clasă de test CarDealershipTest folosind framework-ul JUnit. Am definit o metodă de test testCarInventory() care testează funcționalitatea inventarului de mașini din clasa CarDealership. În interiorul metodei de test, am creat un array de obiecte Car pentru a simula un inventar de mașini. Apoi, am creat o instanță a clasei CarDealership și am furnizat inventarul de mașini ca argument la construcție. Am definit un array expectedCarInfo care conține informațiile despre mașinile așteptate în inventarul de mașini. Apoi, am apelat metoda getCarInventory() din clasa CarDealership pentru a obține informațiile reale despre mașini. Folosind aserțiunea assertArrayEquals(), am comparat array-ul așteptat expectedCarInfo cu array-ul actual actualCarInfo pentru a verifica dacă inventarul de mașini returnat de clasa CarDealership este corect. Un astfel de test automatizat ar verifica dacă clasa CarDealership funcționează corect în ceea ce privește stocarea și returnarea informațiilor despre mașinile din inventar. FUNDAMENTALS OF OBJECT ORIENTED PROGRAMMING OBJECT ORIENTED PROGRAMMING (OOP) Ce este OOP? Object oriented programming este o paradigma adica un tipar a felului in care vedeam lumea din jurul nostru. Ne folosim de obiectele din viata noastra de zi cu zi si le transpunem in cuvinte. Cuvintele in programare sunt abstracte asadar nu folosim propozitii ca in viata de zi cu zi ci abstractizari ale conceptelor. NEXT CLASS Ce este o clasă? Clasa prezintă definiția unui obiect. Când spunem definiția unui obiect, ne referim la caracteristicile lui, mai specific la ce date îl vor reprezenta pe acel obiect. Vom discuta despre o celebră analogie folosită în cadrul învățării programării. Vom discuta despre clasa Măr, acesta are culoare și mărime drept proprietăți și ajunge să putrezească. Putrezirea este o metodă fiindcă reprezintă un proces. CLASS Vă aduceți aminte primul program pe care l-am scris la începutul cursului? Cel cu Hello World?! Acela era un program compus dintr-o clasă și o metodă OBIECTE Ce este un obiect? Exemplu concret Obiectul este o instanțiere a clasei. Pentru un măr vom avea un obiect de Acesta nu are reguli generale ci tipul roșu și de mărimea 3. Acest specifice. În cadrul lui, dăm valori obiect poate folosi/chema metoda proprietăților din clasă. putrezire. Dacă va fi folosită, metoda va fi aplicată doar acestui obiect. Cum creăm un obiect mai exact? Ca să putem crea un obiect pe baza unei clase, o vom instanția chemând clasa. Evident plecăm de la premisa că avem deja creată clasa. PROPRIETĂȚI / FIELD Field-ul este o proprietate a unei clase ce definește schema pentru obiecte sau a o variabilă prezentă într-un obiect. Object state Setul de proprietăți din cadrul unei clase se numesc object state, fiindcă oferă o stare default/standard pe care obiectele create din clasa respectivă o vor avea La ce sunt bune proprietățile? Proprietățile sunt utilizate pentru a reține starea (state) unui obiect și sunt accesibile în cadrul metodelor din aceeași clasă. Acestea pot fi inițializate cu valori implicite sau pot fi atribuite valori personalizate în constructor sau în alte metode. Tipul returnat După ce rulează metoda, aceasta întoarce o valoare (variabilă sau alt obiect). Gândește-te la valoarea putrezit pentru măr. Constructor Constructorul este cazul specific al metodei care va rula automat atunci când este creat un obiect. Constructor parametrizat Ca să evităm să dăm valori în constructor putem stabili parametrii sub forma de variabile care pot fi definite ulterior la crearea unui obiect. Getter-i și setter-i METODE Metoda este o bucată de cod asociată cu o clasă și menită să facă o sarcină anume. Putem să o definim drept o funcție dedicată obiectelor unei clase. Prin aceste metode putem defini comportamentul unui obiect. Fiindcă este de evitat ca o clasă să fie parametrizată cu valori, putem crea metode de a aduce o valoare dintr-un obiect dar și pentru a o seta Chemare metode Metodele pot instanția un obiect nou (new Măr) sau pot modifica comportamentul prin a pune un punct după obiect iar apoi numele metodei (măr.putrezire) Returned type and parameters METODE EXPLICAȚIE EXTINSĂ Tipul returnat Mai jos avem o metodă care acceptă parametrii, și a cărui scop este să simuleze procesul de putrezire a unui măr. Analizează și înțelege parametrii metodei dar și cum se va termina. Când termină de alterat obiectul, metoda poate returna o valoare. Până acum am văzut cuvântul void care specifică faptul că nu se returnează ceva iar obiectul este pur și simplu alterat și salvat cu modificările în cauză. Tipul de returnare al unei metode poate fi și o valoare precum un string sau un int. Parametrii sunt variabilele unei metode, aceste variabile vor primii valori când este chemată metoda. Toți parametrii trebuie să dețină valori când este chemată metoda. Returned type and parameters Cum apelăm metoda? Folosind următorii pași: 1. Apelăm clasa Apple (clasă în care metoda este definită) și o instanțiem Iată fragmentul complet de cod: 3. Capturăm valoarea returnată de metoda. În acest caz, metoda returnează un String, deci poți asigna valoarea returnată unei variabile de tip String: 2. Invocăm metoda rot pe instanța Acest cod va invoca metoda rot pe apple și furnizăm argumentele necesare, rotTime și rotColour În acest exemplu, apelăm metoda rot cu rotTime setat la 5 și rotColour setat la "maro". obiectul Apple, va simula procesul de Poți folosi apoi variabila message pentru putrezire, va actualiza culoarea mărului și a efectua orice operații dorite, cum ar fi în cele din urmă va afișa mesajul "Marul afișarea sa în consolă sau utilizarea sa în este putrezit." în consolă. alte calcule. CONSTRUCTOR Detaliere Constructorul este cel ce definește un comportament default al unei clase și implicit a unui obiect creat pe baza clasei în cauză. Constructorul va iniția parametrii predeterminați pentru un obiect, acesta din urmă moștenind parametrii din constructor. În exemplul alăturat, orice măr nou va avea o anumită culoare și o anumită mărime. Poți spune ce mărime va avea o instanțiere a unui măr nou? Dar culoarea? Detaliere Constructor parametrizat Dacă ați sesizat, pe parcursul acestei lecturi, am evitat să scriem constructori de orice fel pe cât posibil. Motivul În acest cod, clasa Apple are două variabile de instanță este fiindcă ei au o valoare defaul în funcție de tipul definit private: colour de tip String și size de tip int. al parametrului (ex. String gol pentru string sau 0 pentru int). Clasa are, de asemenea, un constructor Apple care primește doi parametri: param1 de tip int și param2 de tip String. În interiorul constructorului, valorile parametrilor sunt atribuite variabilelor de instanță. Valoarea lui param1 este atribuită variabilei size, iar valoarea lui param2 este atribuită variabilei colour. Acest constructor permite crearea unui obiect Apple și inițializarea proprietăților size și colour cu valori specifice. De exemplu: În acest exemplu, se creează un obiect de tip Apple cu un size de 5 și o colour de "rosu". Getter-i Este indicat ca field-urile/parametrii clasei să Detaliere nu fie utilizați direct pe obiect. Pentru asta, putem folosi două metode getter și setter. Setter-i Detaliere Getter-ul este o metodă ce nu Setter-ul nu are un return type iar are parametri dar are un return parametrii săi sunt preluați din clasă type. Acesta din urmă trebuie să pentru a li se putea da noi valori. fie aibe același nume cu variabila definită în clasă fiindcă întoarce Când avem setteri, ni se permite să acea variabilă drept răspuns. modificăm doar o valoare a unei variabile dintr-un obiect, permițând o Totodată, getter-ul va fi de maleabilitate mai mare. același tip precum tipul variabilei definite în clasă. În exemplul alăturat metodele setColour(String newColour) și În exemplul alăturat metodele setSize(int newSize) sunt exemple de getColour() și getSize() sunt metode setters. Ele permit modificarea exemple de metode getters. Ele valorilor variabilelor private colour și returnează valorile actuale ale variabilelor private colour și size. Exemplu aplicabilitate size prin primirea unor noi valori ca argumente. Chemare metode / Utilizarea metodelor Detaliere Primul tip de metodă chemată este atunci când folosim cuvântul cheie: new, această metodă fiind contructorul. Ex 1. new Apple1() Ex 2. new Apple2(2, "verde") În primul exemplu chemăm metoda neparametrizată (cu valori default) iar în al doilea exemplu parametrizăm constructorul. Al doilea tip de metodă este cea chemată asupra obiectelor, unde prima oară scriem numele, a doua oară punem punct, a treia oară scriem numele metodei și ulterior oferim sintaxa de parametrizare adică parantezele. Popularea parametrilor este opțională. Ex A. Apple1.rot() Ex B. Apple1.rot(2, "maro") Al treilea tip de chemare a unei metode este asemănătoare cu cea anterioară din punct de vedere al sintaxei dar față de chemarea unei metode asupra unor obiecte unde se modifică multiple valori, aceasta modifică la nivel singular una dintre valorile constructului. Ex. String ceCuloareEraCaAmUitat = Apple1.getColour(); Apple1.setColour("mov"); this.assertIsSame(apple1.getColour(), ceCuloareEraCaAmUitat); Access Modifiers/ Modificatori de permisiune Modificatorii sunt cuvinte cheie care determină gradul de vizibilitate al unui element. Acel element poate fi o clasa, un parametru/field sau o metodă. ACCESS MODIFIER Sunt întotdeauna puși primii înainte de crearea sau instanțierea elementului. Tipuri Tipurile de acces sunt: public - orice alt element din aplicație poate folosi elementul public protected - doar elementele din pachetul respectiv pot folosi elementul privat. Util pentru a-l apela prin subclase și a limita accesul la el. private - element valabil doar în clasa în care este declarat dacă nu punem unul dintre cele trei modificatoare anterior menționate (întotdeauna punem la clase, omitem de fel la metode și parametrii), elementul va fi valabil în pachetul din care face parte pentru orice clasă, ergo un fel de protected În acest fragment de cod, avem o clasă publică numită Apple. Câmpul colour este EXEMPLU declarat ca fiind private, ceea ce înseamnă că este accesibil doar în interiorul clasei în sine. Clasa Apple are, de asemenea, un constructor public, permițând crearea de instanțe Apple din afara clasei. Metoda getColour() este declarată ca fiind publică, ceea ce o face accesibilă din orice parte a programului. Această metodă este un getter care returnează valoarea câmpului colour. În cele din urmă, există o metodă numită someMethod(), care nu are niciun modificator de acces specificat. În acest caz, aceasta are o vizibilitate packageprivate, ceea ce înseamnă că este accesibilă doar în cadrul aceluiași pachet. Acești modificatori de acces au un rol crucial în controlul vizibilității și accesibilității membrilor unei clase, asigurând o încapsulare corectă și gestionarea interacțiunii între diferitele părți ale programului. TABEL ACCES O simplificare ale aspectelor discutate în legătură cu modificatorii de acces discutați până acum, pusă în formă de tabelă. Ce reprezintă un pachet? PACKAGE IMPORT Pachetul / Package este o grupare de clase. Toate clasele dintr-un pachet (folder de tip pachet) pot interacționa unele cu celelalte în cazul unui acces de tip protejat (protected). Așa cum într-un folder putem crea altul, la fel în pachete putem crea sub-pachete. Întotdeauna un fișier al cărui scop este execuția unui cod va avea definit pachetul și sub-pachetele în care se află la începutul fișierului pe prima linie. (ex. package my; SAU package my.apple;) Pachetele deservesc atunci când vrem să utilizăm funcționalități utile programului/codului nostru fără a le rescrie. Pentru asta folosim funcționalitatea importurilor, sintaxa importurilor fiind cuvântul import urmat de spațiu, apoi de numele pachetului principal, apoi un punct, apoi subdirectorul următor apoi iar punct și tot așa până la fișierul unde este clasa/metoda pe care vrem să o importăm. Ex. import my.pack.apple; TRECEM LA EXERCIȚII https://tester.en.sdacademy.pro/exercises/programming_fundamentals/prework/ Thank you for joining me on this journey into the world of Java programming!