6.1 INTRODUCERE ÎN JAVA

Topic
Materials

Ce este Java?

Este un limbaj de programare. El acceptă instrucțiuni în limba engleză care mai apoi sunt transformate în bytecode care la rândul lui este transformat de interpretorul Java în limbaj mașină.Limbajul mașină este citit de către calculator care îndeplinește task-urile comandate.

Curs - Programare JAVA

    Programarea are aplicații nelimitate.Java este folosit pentru a creea aplicații care rulează pe sistemul de operare Android.Deasemenea Java este folosit pentru a creea aplicații Desktop.

    Despre JAVA

 

    Java este o tehnologie inovatoare lansată de compania Sun Microsystems în 1995, care a avut un impact remarcabil asupra întregii comunități a dezvoltatorilor de software, impunându-se prin calități deosebite cum ar fi: simplitate, robustețe și nu în ultimul rând portabilitate. Denumită inițial OAK, tehnologia Java este formată dintr-un limbaj de programare de nivel înalt pe baza căruia sunt construite o serie de platforme destinate implementării de aplicații pentru toate segmentele industriei software.

    Limbajul de programare Java

    Înainte de a prezenta în detaliu aspectele tehnice ale limbajului Java, să amintim caracteristicile sale principale, care l-au transformat într-un interval de timp atât de scurt într-una din cele mai populare opțiuni pentru dezvoltarea de aplicații, indiferent de domeniu sau de complexitatea lor. 

 

  • Simplitate - elimină supraîncarcarea operatorilor, moștenirea multiplă și toate ”facilitațile” ce pot provoca scrierea unui cod confuz. 

 

  • Ușurința - în crearea de aplicații complexe ce folosesc programarea în rețea, fire de execuție, interfața grafică, baze de date, etc. 

 

  • Robustețe - elimină sursele frecvente de erori ce apar în programare prin renunțarea la pointeri, administrarea automată a memoriei și eliminarea pierderilor de memorie printr-o procedura de colectare a obiectelor care nu mai sunt referite, ce rulează în fundal (”garbage collector”).

 

  • Complet orientat pe obiecte - elimină complet stilul de programare procedural. 

 

  • Securitate - este un limbaj de programare foarte sigur, furnizând mecanisme stricte de securitate a programelor concretizate prin: verificarea dinamică a codului pentru detectarea secvențelor periculoase, impunerea unor reguli stricte pentru rularea proceselor la distanță, etc. 

 

  • Neutralitate arhitecturală - comportamentul unei aplicații Java nu depinde de arhitectura fizică a mașinii pe care rulează. 

 

  • Portabililtate - Java este un limbaj independent de platforma de lucru, aceași aplicație rulând fără nici o modificare și fără a necesita recompilarea ei pe sisteme de operare diferite cum ar fi Windows, Linux, Mac OS, Solaris, etc. lucru care aduce economii substanțiale firmelor dezvoltatoare de aplicații. 

 

  • Este compilat si interpretat, aceasta fiind soluția eficienta pentru obținerea portabilității. 

 

  • Performanța - deși mai lent decât limbajele de programare care generează executabile native pentru o anumită platforma de lucru, compilatorul Java asigură o performanță ridicată a codului de octeți, astfel încât viteza de lucru puțin mai scăzută nu va fi un impediment în dezvoltarea de aplicații oricât de complexe, inclusiv grafica 3D, animație, etc. 

 

  • Este modelat dupa C si C++, trecerea de la C, C++ la Java făcându-se foarte ușor.

 

    Este un stil particular de programare care implică o modalitate specială de proiectare a soluțiilor în probleme particulare. Cele mai moderne limbaje de programare, inclusiv Java, susțin această paradigmă.

    OOP- Object Oriented Programming

 

    OOP este un stil particular de programare care implică un mod special de proiectare a soluțiilor probleme particulare. Majoritatea limbajelor de programare moderne, inclusiv Java, susțin această paradigmă. Când vorbim despre OOP, vorbim despre:

  • Moștenire
  • Modularitatea
  • Polimorfism
  • Încapsulare(codul obligatoriu și datele sale)

În funcție de modul de execuție a aplicațiilor, limbajele de programare se împart în două categorii: 

 

  • Interpretate: instrucțiunile sunt citite linie cu linie de un program numit interpretor, și traduse în instrucțiuni mașina. Avantajul acestei soluții este simplitatea și faptul că fiind interpretată direct sursa programului obținem portabilitatea. Dezavantajul evident este viteza de execuție redusă. Probabil cel mai cunoscute limbaj interpretat este limbajul Basic. 

 

  • Compilate: codul sursă al programelor este transformat de compilator într-un cod ce poate fi executat direct de procesor, numit cod mașină. Avantajul este execuția extrem de rapidă, dezavantajul fiind lipsa portabilității, codul compilat într-un format de nivel scăzut nu poate fi rulat decât pe platforma de lucru pe care a fost compilat. 

 

Limbajul Java combină soluțiile amintite mai sus, programele Java fiind atât interpretate cât și compilate. Așadar vom avea la dispoziție un compilator responsabil cu transformarea surselor programului în așa numitul cod de octeți, precum și un interpretor ce va executa respectivul cod de octeți.

The Java Development Kit – JDK 

 

 Pentru a începe programul  Java, trebuie să obțineți o copie recentă a Java JDK. Aceasta poate fi descărcată gratuit de pe site-ul Sun Microsystems, http://java.sun.com/. După ce l-ați descărcat și instalat sunteți gata să începeți. Aveți nevoie de un IDE care se potriveste precum - Android Studio, Eclipse.

 

Primul program Java

 

Primul program va fi creat pentru a il saluta pe unul dintre cei care au lucrat la realizarea acestei carti, Vasi. 

Deschideți editorul de text și introduceți următoarele rânduri de cod:

 

public class Basic { 

 

    public static void main(String[] args) {

       

        System.out.print("Hello Vasi");

 

    }

 

}

 

Salvați fișierul ca Basic.java. Rețineți că Java este case-sensitive.Este o bună practică sa introduceți comentarii la începutul unui program pentru a vă ajuta să descrieți programul creat. Acest lucru se face prin tastarea /* la începutul comentariului și  */   la finalul comentariului.

 

Programul va afișa textul:

Hello Vasile

Folosind un IDE

Aici este o listă a câtorva dintre IDE-urile disponibile:

 

BlueJ - www.bluej.org (freeware)

NetBeans - www.netbeans.org (freeware / open-source)

JCreator - www.jcreator.com (versiunea freeware disponibilă, este necesară achiziția versiunii pro)

Eclipse - www.eclipse.org (freeware / open-source)

IntelliJ IDEA - www.jetbrains.com (încercare / cumpărare necesară)

JBuilder - www.borland.com (încercare / cumpărare necesară)

 

Începătorii ar putea să se bucure de BlueJ și apoi să se mute pe alte IDE-uri ca JCreator, NetBeans, etc. Din nou este doar o chestiune de gusturile utilizatorului și zona de dezvoltare a software-ului.

Variabile si tipuri de date 

 

Variabile

 

O variabilă este un loc în care programul stochează datele temporar. Asa cum numele indică, valorile stocate într-o astfel de locație pot fi modificate în timp ce un program se execută.

 

public class Exemplu1 {

   

public static void main (String args []) {

             

        int var1; // aceasta declară o variabilă

        int var2; // aceasta declară o altă variabilă

          

        var1 = 1024; // aceasta atribuie 1024 lui var1

              

    System.out.println ("var1 conține " + var1);

       //afiseaza acel text si var1 la care adauga valoarea lui var 2

 

        var2 = var1 / 2;

      //instructiune care atribuie lui var2 jumatatea valorii lui var1

              

    System.out.println ("var2 conține " + var1 / 2);

                                         //afiseaza acel text plus valoarea lui var 2 ca fiind jumatate din var1

 

    System.out.println (var2);

     //afiseaza var 2

          }

}

Afisare:

 

var1 conține 1024

var2 conține 512

512

Programul de mai sus utilizează două variabile, var1 și var2. var1 este atribuită o valoare directă în timp ce var2 este umplut cu rezultatul împărțirii var1 la  2, adică var2 = var1 / 2. Cuvintele int se referă la un anumit tipul de date, adică întreg (numere întregi).

Operatori matematici

 

Așa cum am văzut în exemplul precedent, există simboluri speciale folosite pentru a reprezenta operatorii în efectuarea calculelor:

 

Sa spunem ca avem 2 variabile int a si b:

int a;

int b;

a = 15;

b = 6;

 

            Operator                         Descriere                  Exemplu   

 

+

Suma

a  + b va returna 21

-

Scaderea

a  - b va retuna 9

*

Inmultirea

a  * b va returna 90

/

Impartirea

a  / b va returna 2

%

Modul 

a %  b va returna 3(restul)

Exercitiu 1 

 

Aşa cum am văzut mai sus, am folosit  /  pentru a calcula împărţirea lui var1 la 2. Ştiind că + ar calcula suma,  -  scăderea şi  *  înmulţirea, scrie un program care să calculeze suma dintre doua variabile de tip int a şi b.

Operatori logici

 

Acești operatori sunt utilizați pentru a evalua o expresie și în funcție de operatorul utilizat, a se obține o ieșire specifică. În acest caz, operanzii trebuie să fie tipuri de date booleene, iar rezultatul este de asemenea, boolean. Următorul tabel prezintă operatorii logici disponibili:

                Operator                                                     Descriere

 

&

ŞI

SAU

^

SAU EXCLUSIV

&& 

ŞI 

||

SAU

!

NOT

Operatori de comparare

 

     Operator                           Descriere

 

<

Mai mic ca 

>

Mai mare ca

<=

Mai mic sau egal cu 

>=

Mai mare sau egacl cu 

==

Este egal cu 

!=

Diferit

Tipuri de date

 

Următoarea este o listă de tipuri primitive de date Java:

 

int

Intreg

32 bits  - variind de la -2.147.483.648 până la 2.147.483.648

byte

Intreg

8 bits  - variind de la -128 la 127

short 

Intreg

16 bits  - variind de la -32,768 la 32,768

long

Intreg

64 bits - variind -9,223,372,036,854,775,808 la -9,223,372,036,854,775,808

float

Float

32 bits - o singura precizie

double

Float

16 bits - cu precizie dubla

char

Caractere

16 bits - unsigned - variind de la 0 la 65 536 (Unicode)

boolean

Boolean

poate fi adevarat sau fals 

Instructiuni de decizie 

 

Instructiunea if

 

if (condition) statement; 

 

else statement;

 

Note:

  •  else de altfel este opțională
  •  obiectivele ambelor instrucţiuni if şi else pot fi blocuri de decizie

 

Forma generală  este:

 

if (condiție){

secvență 1

}

else {

secvență 2

}

 

 

 

Exercitiu  - Major? 

 

Creaza un program in care sa verfice daca cineva are peste 18 si sa afiseze “Sunteti major, iar in caz contrar “Sunteti minor”, folosind instructiunea de decizie if.

 

import java.util.Scanner;

public class Conditie {

 

    public static void main(String[] args) {

       

        int a;

        Scanner s =new Scanner(System.in);

        a=s.nextInt();

    

        if(a>=18) System.out.print("Sunteti major");

        else      System.out.print("Sunteti minor");

    }                            

}

Nested if 

Principalul lucru de reținut despre nested if este ca în Java o instrucțiune else se leaga întotdeauna la cea mai apropiată instrucțiune if care se află în același bloc ca și altul și nu este deja asociat cu altceva. Iată un exemplu: 

 

if(i == 10) {

 

if(j < 20) a = b; 

 

if(k > 100) c = d; 

 

else a = c; 

// this else refers to if(k > 100)

 } else {

a = d; 

// this else refers to if(i == 10)

}

 

if-else 

 

if(condition) 

 

statement; 

 

else if(condition) 

 

statement; 

 

else if(condition)

 

statement;

 ... 

else 

statement;

 

Expresiile condiționale sunt evaluate de sus în jos. Imediat ce este o condiție adevărată găsită, declarația asociată cu aceasta este executată, iar restul scării este ocolită. Dacă niciuna dintre condiții este adevărata, se va executa declarația finală. Ultimul else acționează adesea ca implicit condiție; adică, dacă toate celelalte teste condiționale eșuează, se execută ultima data  declarația din else. Dacă nu există nici pentru else și toate celelalte condiții sunt false, nu va avea loc nicio acțiune.

 

Structura repetitiva for 

 

Structurile repetitive sunt structuri folosite pentru a face programul să repete una sau mai multe instrucțiuni pentru 'n' ori cum e specificat în declarația repetitiva.

For este o funcție de parcurgere cu ajutorul căreia putem verifica o anumită condiție dintr-un șir de caracter și multe altele.

Aici avem un exemplu de parcurgere și afișare:

While

While este o structură nu doar a limbajului de programare Java ci și a altor limbaje precum C/C++,Python,Ruby etc.

Atât timp cât codiția din while se respectă programul va executa liniile de cod din interiorul corpului acesteia.

Aici avem un exemplu de program:

 

Pe lângă while mai avem și perechea do;while.Această pereche acționează în următorul fel.

Întăi sunt executate liniile de cod din interiorul corpului după care este verificată condiția.

Aici avem un exemplu:

Vectori

Ca și în orice alt limbaj de programare, vectorii sunt niște șiruri de numere întregi.

Aici avem un exemplu:

Funcții exterioare 

Funcțiile exterioare main-ului sunt foarte ajutătoare deoarece ne putem folosi de ele de n ori acestea fiind scrise doar o singură dată. Acest lucru nu doar că diminuează capacitate de stocare a programului dar și face programul mai ușor de înțeles și cu mai puține linii de cod.

Aici avem un exemplu

Objected Oriented Programming(Programarea Orientată pe Obiecte)

     Obiectele în Java putem spune că sunt asemenea obiectelor din viața reală.

METODE

 De exemplu un bec are două funcții,cea de a se aprinde și cea de a se stinge, doar că pentru a putea accesa aceste funcții trebuie să le apelăm, în cazul de față folosind întrerupătorul.Funcțiile membre ale unei clase sunt numite metode.

 Creăm un obiect de tip clasă Suma care are doar o singură funcție aceea de a aduna două numere? Atunci va fi nevoie de apelarea acesteia.

Avem aici un program corespunzător:

Metoda(funcția) scrisă de noi are 2 parametri(a și b). Parametri sunt folosiți pentru a trimite valori în funcție.

O metodă poate fi apelată de oricâte ori dorim.

MODIFICATORI DE ACCES

 

protected
- doar metodele, datele membre și constructorii pot fi declarați protected
- protected ne indică faptul că sunt accesibile doar în cadrul pachetului

  • clasele nu pot fi declarete protected

            private

 

            public

  • entitățile declarate public sunt accesibile peste tot

            default

  •  când nu este specificat niciun modificator de acces atunci avem acces implicit(default)
    Entitățile având specificatorul de acces default sunt accesibile în același pachet

 

CONSTRUCTORI

 

Un constructor este o metodă care are același nume ca și clasa din care face parte.

Fiecare clasă are un constructor. Ei nu sunt considerați membri ai clasei.Dacă o clasă nu are un constructor atunci acesta va fi scris automate de către compilator și va fi inclus in cod in timpul compilarii.

De fiecare dată când este creat un obiect( o instanță a unei clase) se apelează un constructor.Constructorul va furniza valori inițiale pentru datelor membre ale obiectului.Un constructor poate avea sau poate să nu aibă parametri.

 

this

întotdeauna se referă la obiectul curent

Acum vom avea un program care la fel , are introdusă noțiunea de OOP(POO),însă în care apare noțiunea de get-eri și set-eri;

Metoda get returnează valoarea numelui variabilei. 

Metoda setată ia un parametru o atribuie variabilei de nume. Acest cuvânt cheie este folosit pentru a se referi la obiectul current.

Imobiliari si setteri de proprietate

Există două tipuri de proprietăți.

 

Primul tip este proprietățile datelor. Stim deja cum sa lucram cu ei. De fapt, toate proprietățile pe care le-am utilizat până acum erau proprietăți de date.

 

Al doilea tip de proprietăți este ceva nou. Proprietățile accesorilor. Ele sunt în esență funcții care lucrează la obținerea și stabilirea unei valori, dar arată ca proprietăți obișnuite unui cod extern.

Getteri și setteri

 

Proprietățile accesorilor sunt reprezentate de metodele "getter" și "setter". Într-un obiect literal ele sunt notate prin obținerea și setarea lor

Polimorfism

Polimorfismul este abilitatea unui obiect de a prelua mai multe forme. Cea mai obișnuită utilizare a polimorfismului în OOP apare atunci când o referință de clasă părinte este folosită pentru a se referi la un obiect de clasă copil. Orice obiect Java care poate trece mai mult de un test IS-A este considerat a fi polimorfic. În Java, toate obiectele Java sunt polimorfe deoarece orice obiect va trece testul IS-A pentru propriul tip și pentru obiectul de clasă. Este important să știm că singura modalitate posibilă de a accesa un obiect este printr-o variabilă de referință. O variabilă de referință poate fi de un singur tip. Odată declarată, tipul unei variabile de referință nu poate fi modificat. Variabila de referință poate fi realocată altor obiecte, cu condiția să nu fie declarată finală. Tipul variabilei de referință ar determina metodele pe care le poate invoca pe obiect. O variabilă de referință se poate referi la orice obiect al tipului său declarat sau la orice subtip al tipului său declarat. O variabilă de referință poate fi declarată ca tip de clasă sau interfață.

Avem mai multe tipuri de polimorifsm

Suprascrierea(Overwriting)

 

Supraincarcarea si supradefinirea metodelor sunt 2 concepte foarte folosite in programarea orientata obiect. Ele sunt cunoscute si sub numele de polimorfism.

  • supraincarcarea(overloading): in interiorul unei clase pot exista medote cu acelasi nume cu conditia ca semnatura lor sa fie diferita(tipul, sau numarul argumentelor) astfel incat la apelul functiei sa se poata diferentia intre ele.
  • supradefinirea(overriding): o subclasa poate rescrie o metoda a clasei parinte prin folosirea unei metode cu acelasi nume si aceiasi semnatura ca cea din superclasa.

 

Supraîncărcarea(Overcharging)

 

Supraincarcarea si supradefinirea metodelor sunt 2 concepte foarte folosite in programarea orientata obiect. Ele sunt cunoscute si sub numele de polimorfism.

  • supraincarcarea(overloading): in interiorul unei clase pot exista medote cu acelasi nume cu conditia ca semnatura lor sa fie diferita(tipul, sau numarul argumentelor) astfel incat la apelul functiei sa se poata diferentia intre ele.
  • supradefinirea(overriding): o subclasa poate rescrie o metoda a clasei parinte prin folosirea unei metode cu acelasi nume si aceiasi semnatura ca cea din superclasa.

Try Catch Finally 

 

Pe parcursul execuţiei unui program pot apărea evenimente deosebite care îi modifică parcursul normal. Asemenea evenimente pot fi situaţii de eroare (de exemplu încercarea de a accesa un element de tablou aflat dincolo de limitele tabloului) sau pur şi simplu situaţii care necesită o altă abordare decât cea obişnuită (de exemplu, la parcurgerea secvenţială a unui fişier de intrare, la un moment dat se atinge sfârşitul fişierului; acest eveniment, fără a fi o eroare, va schimba cursul de până atunci al programului). Evenimentele de genul celor amintite se mai numesc excepţii. O excepţie este un obiect ce aparţine clasei predefinite Throwable sau unei clase descendente din Throwable. Clasa Throwable este definită în pachetul java.lang. Limbajul Java dispune, de fapt, de o întreagă ierarhie de clase predefinite pentru reprezentarea excepţiilor. Programatorul poate utiliza clasele predefinite sau poate să-şi definească propriile clase de excepţii, cu condiţia ca ele să descindă direct sau indirect din Throwable. Prin convenţie, clasele definite de utilizatori pentru reprezentarea excepţiilor vor fi derivate din clasa Exception. Definirea unui tip de excepţie de către utilizator se justifică de obicei prin: — necesitatea reţinerii de date suplimentare şi/sau mesaje mai detaliate despre excepţie; — necesitatea ca dintr-o clasă mai largă de excepţii să fie captate doar o anumită parte.

Pachete Java

 

Un pachet este o colectie de clase si interfete înrudite. Sunt folosite pentru gasirea si utilizarea mai usoara a claselor, pentru a evita conflictele de nume si pentru a controla accesul la anumite clase. In alte limbaje de programare pachetele se numesc librarii.

 

Construirea unui pachet

 

Pentru a declara un pachet în java se foloseşte cuvântul cheie package urmat de numele pachetului. Cuvântul cheie package se foloseşte ca primă instrucţiune în fişierele sursă java şi specifică numele pachetului din care vor face parte clasele ce urmează să fie definite în acel fişier.

 

package mypakcage;

class Forma{

}

 

Daca nu este specificat un anumit pachet, clasele unui fişier sursa vor face parte din pachetul implicit (care nu are nici un nume). In general, pachetul implicit este format din toate clasele si intefetele directorului curent. 

Este recomandabil ca toate clasele si intefetele sa fie plasate în pachete. Pachetul implicit este folosit doar pentru aplicatii mici sau la începutul dezvoltarii unei aplicaţii.

 

Accesul la clasele dintr-un pachet

 

Pentru a folosi o clasa publica dintr-un pachet sau pentru a apela o metoda publica a unei clase public a unui pachet exista trei solutii:

  • specificarea numelui complet al clasei (ex. folosire java.util.Vector)
  • importul clasei respective (ex. import java.util.Vector)
  • importul întregului pachet în care se gaseste clasa (ex. import java.util.*)

 

Pentru a avea acces la o clasă definită în cadrul unui pachet dintr-o clasă definită în alt pachet se foloseşte cuvântul cheie import urmat de numele pachetului şi de numele clasei care trebuie accesată.

 

import mypackage.Forma;

class Desenator{

}

 

O variantă a instrucţiunii import este următoarea:

 

import mypackage.*;

class Desenator{

}

 

În cazul în care în loc de numele clasei se foloseşte caracterul “*” atunci se va avea acces la toate clasele din cadrul pachetului respectiv.

 

IMPORTANT: O clasă definită în cadrul unui pachet va putea accesa toate celelalte clase din cadrul acelui pachet fără a fi nevoie să se folosească instrucţiunea import.

 

 

Reguli de denumire a pachetelor

 

Deşi este perfect valid un nume de pachet format dintr-un singur cuvânt, în mod uzual în java numele pachetelor sunt formate din două sau mai multe cuvinte separate prin caracterul punct. Aceasta ajută programatorul în crearea de nume unice pentru pachete astfel încât şansele ca două nume de pachete să se suprapună să fie cât mai mici.

 

De exemplu pachetele standard ce sunt accesibile din Java 2 Standard Development Kit au nume de forma:

 

java.lang – conţine clase esenţiale java. Acest pachet este automat importat, şi orice clasă are acces la clasele din cadrul acestui pachet fără a fi nevoie să fie importate în mod explicit;

java.io – conţine clase pentru lucrul cu fluxuri de intrare ieşire;

java.net – conţine clase pentru lucrul cu resurse de retea

java.swing, java.awt, java.awt.event – sunt pachete ce conţin clase pentru construirea de interfeţe grafice;

java.sql – conţine clase pentru lucrul cu baze de date

 

Companiile ce produc software java folosesc uneori numele propriu de domeniu ca şi componentă în cadrul numelui pachetelor. De exemplu:

 

com.mysq.driver. ...

com.sun.util. ...

 

ATENTIE: Numele ierarhice de pachete nu implică nici o relaţie de moştenire sau de includere între clasele aparţinătoare. De exemplu dacă în cadrul unei clase se importă pachetul java.awt, din clasa respectivă nu se va avea acces şi la metodele din pachetul java.awt.event.

 

EXERCITIU: Construiţi în mediul Eclipse un nou proiect Java. Adăugaţi în cadrul proiectului o clasă test ce conţine o funcţie main care să facă parte din pachetul lab2.exercitii.

 

EXERCITIU: Adăugaţi în cadrul proiectului construit în exerciţiul anterior un nou pachet numit lab2.alteexercitii. În cadrul noului pachet adăugaţi o clasă care va importa clasa Test din exerciţiul anterior.

 

Reguli de construire a pachetelor

 

Locaţia fişierelor sursă java este dependentă de numele pachetelor pe care acestea le definesc. Numele pachetului determină şi locaţia fişierului sursă. De exemplu dacă o clasă este declarată ca făcând parte din pachetul exercitii.test atunci aceasta va trebui sa se găsească într-un director de forma .../exercitii/test.

 

Numele pachetului determină aşadar ierarhia de directoare în care trebuie să se găsească fişierele sursă. De asemenea fişierele compilate (fişierele cu extensia .class) trebuie să urmeze aceiaşi regulă. Nu este obligatoriu ca fişierele sursă şi fişierele compilate să se regăsească în aceiaşi ierarhie de directoare dar este obligatoriu ca ierarhiile de directoare să respecte regula prezentată mai sus atât pentru fişierele sursă cât şi pentru fişierele class.

 

Exemplu:

fişier Test.java

 

package exercitii.lab2

class Test{

}

 

Fişierul sursă poate fi salvat într-un director de forma: c:javaprogramexercitiitest.

 

În urma compilării fişierului sursă de mai sus rezultă fişierul cod de octeţi Test.class. Acesta poate fi amplasat fie în acelaşi director cu fişierul sursă Test.java fie într-un alt director care să respecte regula numelui pachetului, de exemplu: d:tempexercitiilab2.

 

 

Accesare pachetelor

 

Pentru a putea accesa clasele din cadrul pachetelor, limbajul java foloseşte o variabilă de mediu numită CLASSPATH. Pentru a putea avea acces la clasele dintr-un pachet directorul rădăcină ce conţine ierarhia de directoare corespunzătoare pachetului va trebui să fie adăugat în cadrul listei de directoare CLASSPATH.

 

De exemplu în cazul în care se doreşte ca dintr-o aplicaţie să fie accesibilă clasa Test.class definită mai sus atunci în CLASSPATH va trebui adăugat directorul c:temp.

 

Directoarele setate în cadrul variabilei de mediu CLASSPATH sunt folosite ca punt de start al căutării fişierelor cu .class.

 

În momentul în care compilatorul întâlneşte o instrucţiune import acesta va căuta pachetul desemnat de acea instrucţiune în toate directoarele definite în CLASSPATH, transformând numele pachetului într-o listă de directoare şi încercând să găsească pachetul prin concatenarea pe rând a directoarelor specificate în CLASSPATH cu ierarhia de directoare generată din numele pachetului.

 

ATENTIE: Dacă două pachete conţin clase cu acelaşi nume şi ambele pachete sunt importate atunci va apărea o coliziune de nume dacă se încearcă folosirea clasei cu nume comun în cele două pachete. Dacă pachetele sunt doar importate şi nu se foloseşte în cadrul aplicaţiei clasa cu nume comun în cele două pachete nu se va raporta nici o eroare.

 

Dacă noi vom apela funcția într-un program care are funcția main Acela va face suma numerelor.

Senzorul de distanță REV

 

Senzorul de distanță 2m de la REV Robotics utilizează modulul de măsurare a laserului ST Microelectronics VL53L0X (ToF) pentru măsurarea distanțelor până la 2 metri cu rezoluție milimetru. Spre deosebire de alți senzori care se bazează pe intensitatea luminii reflectate, acest senzor poate măsura cât timp este nevoie ca lumina să revină înapoi, acest lucru duce la măsurători mult mai precise, care sunt independente de reflexia.

 

Acest senzor ne permite măsurarea distanței în 4 mărimi:

  • Milimetrii(MM);
  • Centimetrii(CM);
  • Inchi(IN)
  • Metri(M)

 

Cum îl putem utiliza în cel mai eficient mod?

 

Cel mai eficient mod în care senzorul de distanță poate fi folosit este în perioada de autonomie. Cu ajutorul acestuia putem măsura distanța față de un obstacol și îl putem evita, robotul neavand nici o daună. Totodată putem să măsurăm distanța față de un obiect și să îndeplinim task-urile din autonomie(mutarea unui obiect,droparea marker-ului etc.)

 

Tips and tricks

 

În milimetrii și în inchi sunt sigur că majoritatea dintre echipele de FTC din România nu lucreaza, așadar cel mai recomandat ar fi în centimetrii(CM) pentru distanțe scurte,pentru a avea precizie în spațiile mici,iar în metrii(M) pentru a avea precizie pe distanțele mai lungi.

 

Cod exemplu

package org.firstinspires.ftc.teamcode;

 

import com.qualcomm.hardware.rev.Rev2mDistanceSensor;

import com.qualcomm.robotcore.eventloop.opmode.Autonomous;

import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode;

import com.qualcomm.robotcore.hardware.DcMotor;

import com.qualcomm.robotcore.hardware.DistanceSensor;

import com.qualcomm.robotcore.util.ElapsedTime;

 

import org.firstinspires.ftc.robotcore.external.navigation.DistanceUnit;

@Autonomous(name="Seznor Distanta", group="Iterative Opmode")

 

//@Disabled

 

public class SenzorDistantaCurs extends LinearOpMode

 

{

 

// Declararea OpMode-urilor

 

   private ElapsedTime runtime = new ElapsedTime();//declararea timpului parcurs

 

   DcMotor leftmotor1;// Declararea motoarelor

   DcMotor leftmotor2;

   DcMotor rightmotor1;

   DcMotor rightmotor2;

 

   private DistanceSensor sensorRange;

 

   double power=0.5; //declararea vitezei

 

   @Override

 

   public void runOpMode() throws InterruptedException{

 

       telemetry.addData("Status", "Initialized");

 

       telemetry.update();

 

       leftmotor1=hardwareMap.dcMotor.get("stanga fata");//declararea motorului pentru a-l putea folosi in program

       leftmotor2=hardwareMap.dcMotor.get("stanga spate");

       rightmotor1=hardwareMap.dcMotor.get("dreapta fata");

       rightmotor2=hardwareMap.dcMotor.get("dreapta spate");

  

  sensorRange = hardwareMap.get(DistanceSensor.class, "Distanta Fata");

 

       Rev2mDistanceSensor sensorTimeOfFlight = (Rev2mDistanceSensor)sensorRange; //Stabilirea Senzorului de distanta REV

 

       waitForStart();

 

       runtime.reset();

      leftmotor1.setPower(-power);// Setarea motoarelor astfel incat sa mearga in fata

       leftmotor2.setPower(power);

       rightmotor1.setPower(-power);

       rightmotor2.setPower(power);

       while (opModeIsActive()){

           double p= sensorRange.getDistance(DistanceUnit.CM); // variabila care masoara distanta in cm fata de obstacol

 

           if(p<30) //Daca distanta fata de obstacol este mai mica de 30 de cm atunci robotul se opreste

           {

               leftmotor1.setPower(0);

               leftmotor2.setPower(0);

               rightmotor1.setPower(0);

               rightmotor2.setPower(0);

           }

           leftmotor1.setPower(power);

           leftmotor2.setPower(-power);

           rightmotor1.setPower(power);

           rightmotor2.setPower(-power);

 

           sleep(1000);// Acesta merge o secunda in spate pentru a evita contactul cu obstacolul

 

           leftmotor1.setPower(0);

           leftmotor2.setPower(0);

           rightmotor1.setPower(0);

           rightmotor2.setPower(0);

           telemetry.addData("Status",runtime.toString());

           telemetry.update();

 

           idle();//Sfarsit Program

 

       }

 

   }

 

}