Sunteți pe pagina 1din 41

Curs 6.

Metode (continuare)
Supraîncărcarea metodelor
Când o clasă are două sau mai multe metode cu același nume, dar parametri diferiți, este
cunoscută sub denumirea de supraîncărcare a metodei. Este diferit de suprascriere. În
suprascriere, o metodă are același nume, tip, număr de parametri etc.

Să luăm în considerare exemplul discutat anterior pentru a găsi un număr minim de tip
întreg.

Dacă, să zicem că vrem să găsim numărul minim de tip double.

Conceptul de supraîncărcare va fi introdus pentru a crea două sau mai multe metode cu
același nume, dar parametri diferiți.
Supraîncărcarea metodelor
public class ExampleOverloading {

public static void main(String[] args) {


int a = 11;
int b = 6;
double c = 7.3;
double d = 9.4;
int result1 = minFunction(a, b);

// aceasi functie cu parametri diferiti


double result2 = minFunction(c, d);
System.out.println("Minimum Value = " + result1);
System.out.println("Minimum Value = " + result2);
}
Supraîncărcarea metodelor
// for integer
public static int minFunction(int n1, int n2) {
int min;
if (n1 > n2)
min = n2;
else
min = n1;
return min;
}
// for double
public static double minFunction(double n1, double n2) {
double min;
if (n1 > n2)
min = n2;
else
min = n1;
return min;
}
}
Output
Supraîncărcarea metodelor
Valoarea minimă = 6
Valoarea minimă = 7,3

Metodele de supraîncărcare fac programul lizibil. Aici, două metode sunt date cu același
nume, dar cu parametri diferiți.

Numărul minim de tipuri întregi și double este rezultatul.


This cuvânt cheie
Cuvîntul cheie -this
Acesta este un cuvânt cheie în Java care este utilizat ca referință la obiectul clasei curente, cu
o metodă de instanță sau un constructor. Folosind this, puteți face referire la membrii unei
clase, cum ar fi constructori, variabile și metode.

Notă - Cuvântul cheie this este utilizat doar în cadrul metodelor sau constructorilor de
instanță.
În general, cuvântul cheie this este folosit pentru a diferenția variabilele de instanță de
variabilele locale dacă au aceleași nume, în cadrul unui constructor sau o metodă.
Exemplu:
Cuvîntul cheie -this
class Student {
int age;
Student(int age) {
this.age = age;
}
}
Apelați la un tip de constructor (constructor parametrizat sau implicit) de la un altul dintr-o
clasă. Este cunoscută sub numele de invocare constructivă explicită.
class Student {
int age
Student() {
this(20);
}
Student(int age) {
this.age = age;
}
}
Cuvîntul cheie -this
public class Acest_Exemplu {
// Instance variable num
int num = 10;

Acest_Exemplu () {
System.out.println(“Acesta este un exemplu cu cuvantul cheie this");
}
Acest_Exemplu(int num) {
// Invoca constructorul default
this();
// Asigneaza variabila locala num instantei variabilei num
this.num = num;
}
public void salut() {
System.out.println(“Buna, ai sosit la timp!");
}
public void print() {
Cuvîntul cheie -this
// variabila locala num
int num = 20;
// tiparire variabila locala
System.out.println(“valoarea variabilei num este : "+num);

// tiparirea variabilei de instanta


System.out.println(“valoarea variabilei de instanta este : "+this.num);

// Invocarea mesajului de salut


this.salut();
}
public static void main(String[] args) {
// istantierea clasei
Acest_Exemplu obj1 = new Acest_Exemplu();
// Invocarea metodei print
Cuvîntul cheie -This
obj1.print();

//atribuirea unei noi valori variabilei num num prin constructor parametrizat
Acest_Exemplu obj2 = new Acest_Exemplu(30);

// invocarea metodei print din nou


obj2.print();
}
}
Cuvîntul cheie -this
Rulati acest program si scrieti care este output-ul!
Metoda finalize()
Metoda finalize ()
Se poate define o metodă care va fi apelată chiar înainte de distrugerea finală a unui obiect de
către colectorul de gunoi. Această metodă se numește finalize () și poate fi utilizată pentru a
vă asigura că un obiect se termină curat.

De exemplu, puteți utiliza finalize () pentru a vă asigura că un fișier deschis deținut de acel
obiect este închis.

Pentru a adăuga un finalizator la o clasă, pur și simplu definiți metoda finalize ().
Java runtime apelează acea metodă ori de câte ori este pe cale să recicleze un obiect din acea
clasă.
În interiorul metodei finalize (), veți specifica acțiunile care trebuie efectuate înainte ca un
obiect să fie distrus.
Metoda finalize () are această formă generală -
protected void finalize () {
    // cod de finalizare aici
}
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.
Crearea unui pachet
• Toate clasele si interfetele Java apartin la diverse pachete,
grupate dupa functionalitatea lor: clasele de baza se gasesc
în pachetul java.lang
• Clasele pentru intrari/iesiri sunt în java.io
• Clasele pentru grafica în java.awt
• Clase pentru construirea applet-urile în java.applet, etc.
• Crearea unui pachet se realizeaza prin scriere la începutul
fisierelor sursa ce contin clasele si interfetele pe care
dorim sa le grupam într-un pachet al instructiunii:
package NumePachet
Denumirea unui pachet

Exista posibilitatea ca doi programatori care lucreaza la un


proiect comun sa foloseasca acelasi nume pentru unele din
clasele lor. De asemenea, se poate ca una din clasele unei
aplicatii sa aiba acelasi nume cu o clasa a mediului Java.
Acest lucru este posibil atât timp cât clasele cu acelasi
nume se gasesc în pachte diferite, ele fiind diferentiate prin
prefixarea lor cu numele pachetelor. Asadar numele
complet al unei clase este format din numele pachetului la
care apartine + numele sau: numePachet.NumeClasa
Ex: java.lang.String (java.lang=pachet, String=clasa)
Denumirea unui pachet

• Specificarea numelui complet al clasei se face, asa cum am


vazut, prin prefixarea numelui clasei cu numele pachetului:
numePachet.NumeClasa. Aceasta metoda este
recomandata doar pentru cazul în care folosirea acelei
clase se face o singura data sau foarte rar.
• De exemplu ar fi extrem de greoi sa scriem de fiecare data
când vrem sa declaram un sir de caractere sau sa folosim
un obiect grafic secvente de genul; java.lang.String s =
"neplacut"; java.awt.Rectangle r = new
java.awt.Rectangle(); java.awt.Circle c = new
java.awt.Circle();
Denumirea unui pachet

• In aceste situatii vom importa (include) clasa


respectiva sau întreg pachetul din care face parte
aplicatia noastra. Acest lucru se realizeaza prin
instructiunea import, care trebuie sa apara la
începutul fisierelor sursa, imediat dupa
instructiunea package.
Folosirea membrilor unui pachet

• Conform specificatiilor de acces ale unei clase si


ale membrilor ei doar clasele publice si membri
declarati publici ai unei clase sunt accesibili în
afara pachetului în care acestea se gasesc.
• 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
– importul clasei respective
– importul întregului pachet în care se gaseste clasa
Denumirea unui pachet

• Ce se întâmpla însa când doi programatori care lucreaza la un proiect


comun folosesc clase cu acelasi nume ce se gasesc în pachete cu
acelasi nume ?
• Pentru a evita acest lucru companiile folosesc inversul domeniului lor
Internet în denumirea pachetelor implementate în cadrul companiei,
cum ar fi com.company.numePachet. In cadrul unei aceeasi companii
conflictele de nume trebuie rezolvate prin diverse conventii de uz
intern.
• De exemplu, adresa mea de e-mail este mkadar@uab.ro, ceea ce
înseamna ca domeniul meu Internet este uab.ro. Pachetele create de
mine ar trebui denumite ro.uab.NumePachet. Pentru a rezolva
conflicte cu alti programatori din acelasi domeniu cu mine pachetele s-
ar putea numi: ro.uab.mkadar.NumePachet.
Importul unei clase sau interfete

• Se face printr-o instructiune import în care


specificam numele clasei (interfetei) pe care dorim
sa o folosim dintr-un pachet:
• import java.awt.Rectangle;
• Din acest moment vom putea folosi în clasele
fisierului în care am plasat instructiunea de import
numele scurt al clasei Rectangle
• Rectangle r = new Rectangle(0,0,100,100);
Importul unui pachet (importul la cerere)

• Se face printr-o instructiune import în care specificam numele


pachetului ale carui clase si interfete dorim sa le folosim dintr-un pachet,
urmat de simbolul '*'.
• Se mai numeste import la cerere deoarece încarcarea claselor se face
dinamic în momentul apelarii lor. Este cel mai uzual tip de import.
import java.awt.*;
• Din acest moment vom putea folosi în clasele fisierului în care am plasat
instructiunea de import numele scurt al tuturor claselor pachetului
importat: Rectangle r = new Rectangle(); Circle c = new Circle(); ...
• Atentie
* nu are semnificatia uzuala de wildcard (masca) si nu poate fi
folosit decât ca atare.
import java.awt.C*; //eroare de compilare
Importul unei clase sau interfete

• Mediul Java importa automat trei pachete


pentru toate fisierele sursa:
– pachetul java.lang
– pachetul curent
– pachetul implicit (fara nume)
Pachetele JDK

Limbajul Java se bazeaza pe o serie de


biblioteci (pachete) cu ajutorul carora se pot
construi aplicatiile. Exista deci un set de
clase deja implementate, ceea ce reduce
timpul de dezvoltare a unui program.
Pachetele JDK

java.applet :suport pt scrierea de appleturi


java.awt :suportul pentru grafica(Abstract Windowing Toolkit)
java.beans: suport pentru scrierea de componente reutilizabile
java.io :intrari/iesiri, acces la fisiere
java.lang: clasele de baza ale limbajului
java.math :operatii matematice
java.net :acces la retea
java.rmi :executie la distanta (Remote Message Interface)
java.security:mecanisme de securitate : criptare, autentificare
java.sql:interogari SQL
java.text:suport pentru formatarea textelor
java.util :clase utile : Vector, Stack, Random, etc.
Ce este un applet ?

• Un applet reprezinta o suprafata de afisare


(container) ce poate fi inclusa într-o pagina
Web si gestionata printr-un program Java. Un
astfel de program se mai numeste miniaplicatie
sau, prin abuz de limbaj, applet.
Ce este un applet ?

• Codul unui applet poate fi format din una sau mai multe clase. Una dintre
acestea este principala si extinde clasa Applet, fiind clasa ce trebuie
specificata în documentul HTML ce descrie pagina de Web în care dorim sa
includem appletul.
• Diferenta fundamentala dintre un applet si o aplicatie consta în faptul ca, un
applet nu poate fi executat independent, ci va fi executat de browser-ul în care
este încarcata pagina Web ce contine appletul respectiv.
• O aplicatie independenta este executata prin apelul interpretorului java, având
ca parametru numele clasei principale a aplicatiei, clasa principala fiind cea
care contine metoda main.
• Ciclul de viata al unui applet este complet diferit, fiind dictat de evenimentele
generate de catre browser la vizualizarea documentului HTML ce contine
appletul.
• Pachetul care ofera suport pentru creearea de appleturi este java.applet.
Crearea unui applet

• Orice applet este implementat prin crearea


unei subclase a clasei Applet.
• Ierarhia claselor din care deriva Applet este
prezentata în figura de mai jos:

Un applet simplu

import java.applet.Applet;
import java.awt.*;
public class AppletSimplu extends Applet {
public void paint(Graphics g){
g.setFont(new Font("Arial", Font.BOLD, 16));
g.drawString("Hello", 0, 30);
}
}

Uzual, clasa principala va fi salvata într-un fisier cu acelasi nume si


extensia .java. Asadar, vom salva clasa de mai sus într-un fisier
AppletSimplu.java.
Compilarea

• Compilarea se face la fel ca si la aplicatiile


independente, apelând compilatorul javac
pentru clasa principala a appletului (cea
care extinde Applet).
• javac AppletSimplu.java
• In cazul în care compilarea a reusit va fi
generat fisierul AppletSimplu.class.
Executia (vizualizarea)

• Pentru a vizualiza acest applet trebuie sa cream un document HTML,


sa-i spunem demo.html, în care sa specificam cel putin urmatoarele
informatii:
– clasa ce contine codul appletului
– latimea si înaltimea suprafetei alocate pe pagina Web
<HTML> <HEAD> <TITLE> Un applet simplu </TITLE> </HEAD>
<APPLET CODE="AppletSimplu.class" WIDTH=100 HEIGHT=50>
</APPLET> </HTML>
Vizualizarea acestui document se poate face cu orice browser (Internet Explorer,
Netscape, etc), sau cu utilitarul appletviewer ce vine în pachetul JDK.
appletviewer demo.html
Metodele specifice appleturilor

• Metoda Situatia în care este apelata


• init La initializarea appletului; teoretic, aceasta metoda ar
trebui sa se apeleze o singura data, la prima afisare a
appletului în pagina, însa, la unele browsere, este
posibil ca ea sa se apeleze de mai multe ori.
• start Imediat dupa initializare si de fiecare data când
appletul redevine activ, dupa o oprire
temporara.
• stop De fiecare data când appletul nu mai este vizibil
(pagina Web nu mai este vizibila, fereastra
browserului este minimizata, etc) si înainte de destroy.
• destroy La închiderea ultimei instante a browserului care a
încarcat în memorie clasa principala a appletului.
Aceste metode sunt apelate automat de browser si nu
trebuie apelate explicit din program !
Structura generala a unui applet

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class StructuraApplet extends Applet {
public void init() {
}
public void start() {
}
public void stop() {
}
public void destroy() {
}
public void paint(Graphics g) {
}
}
Interfata grafica cu utilizatorul
Clasa Applet este o extensie a superclasei Container, ceea
ce înseamna ca appleturile sunt, înainte de toate, suprafete
de afisare.
Plasarea componentelor, gestionarea pozitionarii lor si
tratarea evenimentelor generate se realizeaza la fel ca si în
cazul aplicatiilor.
Uzual, adaugarea componentelor pe suprafata appletului
precum si stabilirea obiectelor responsabile cu tratarea
evenimentelor generate sunt operatiuni ce vor fi realizate
în metoda init.
Gestionarul de pozitionare implicit este FlowLayout, însa
acesta poate fi schimbat prin metoda setLayout.
Desenarea pe suprafata unui applet
• Exista o categorie întreaga de appleturi ce nu comunica cu
utilizatorul prin intermediul componentelor ci, executia lor
se rezuma la diverse operatiuni de desenare executate în
metoda paint.
• Metoda paint este responsabila cu definirea aspectului
grafic al oricarei componente. Implicit, metoda paint din
clasa Applet nu realizeaza nimic, deci, în cazul în care
dorim sa desenam direct pe suprafata unui applet va fi
nevoie sa supradefinim aceasta metoda.
In cazul în care este aleasa aceasta solutie, evenimentele
tratate uzual vor fi cele generate de mouse sau tastatura.
Definirea si folosirea parametrilor
• Parametrii sunt pentru appleturi ceea ce argumentele de la
linia de comanda sunt pentru aplicatiile independente. Ei
permit utilizatorului sa personalizeze aspectul sau
comportarea unui applet fara a-i schimba codul si
recompila clasele.
• Definirea parametrilor se face în cadrul tagului APPLET
din documentul HTML ce contine appletul si sunt
identificati prin atributul PARAM.
• Fiecare parametru are un nume, specificat prin NAME si o
valoare, specificata prin VALUE
Definirea si folosirea parametrilor
<APPLET CODE="AppletSimplu.class" WIDTH=100
HEIGHT=50>
<PARAM NAME=textAfisat VALUE="Salut">
<PARAM NAME=numeFont VALUE="Times New
Roman">
<PARAM NAME=dimFont VALUE=20>
</APPLET>
Definirea si folosirea parametrilor
Folosirea parametrilor primiti de catre un applet se face
prin intermediul metodei getParameter care primeste ca
argument numele unui parametru si returneaza valoarea
acestuia.
In cazul în care nu exista nici un parametru cu numele
specificat, metoda întoarce null, caz în care programul
trebuie sa atribuie o valoare implicita variabilei în care se
dorea citirea respectivului parametru.
Sa rescriem appletul considerat initial (AppletSimplu)
astfel încât acesta sa afiseze textul primit ca parametru,
folosind un font cu numele si dimensiunea specificate de
asemenea ca parametri.
Ciclul de viata al unui applet
• Executia unui applet începe în momentul în care un browser afiseaza o pagina Web în care este inclus
appletul respectiv si poate trece prin mai multe etape. Fiecare etapa este strâns legata de un eveniment
generat de catre browser si determina apelarea unei metode specifice din clasa ce implementeaza
appletul.
• Incarcarea in memorie
Este creata o instanta a clasei principale a appletului si încarcata în memorie.
• Initializarea
Este apelata metoda init ce permite initializarea diverselor variabile, citirea unor parametri de intrare,
etc.
• Pornirea
Este apelata metoda start
• Executia propriu-zisa
Consta în interactiunea dintre utilizator si componentele afisate pe suprafata appletului sau în
executarea unui anumit cod într-un fir de executie. In unele situatii întreaga executie a appletului se
consuma la etapele de initializare si pornire.
• Oprirea temporara
In cazul în care utilizatorul paraseste pagina Web în care ruleaza appletul este apelata metoda stop a
acestuia, dându-i astfel posibilitatea sa se opreasca temporar cât timp nu este vizibil, pentru a nu
consuma inutil din timpul procesorului. Acelasi lucru se întâmpla daca fereastra browserului este
minimizata. In momentul in care pagina Web ce contine appletul devine din nou activa, va fi reapelata
metoda start.
• Oprirea definitiva
La închiderea tuturor instantelor browserului folosit pentru vizualizare, appletul va fi eliminat din
memorie si va fi apelata metoda destroy a acestuia, pentru a-i permite sa elibereze resursele detinute.
Apelul metodei destroy este întotdeauna precedat de apelul lui stop.
Definirea si folosirea parametrilor
Ca si în cazul argumentelor trimise aplicatiilor de la linia
de comanda, tipul parametrilor este sir de caractere,
indiferent daca valoarea este între ghilimele sau nu.
Fiecare applet are si un set de parametri prestabiliti ale
caror nume nu vor putea fi folosite pentru definirea de noi
parametri folosind metoda de mai sus.
Acestia apar direct în corpul tagului APPLET si definesc
informatii generale despre applet.
Exemple de astfel de parametri sunt CODE, WIDTH sau
HEIGHT.
Definirea si folosirea parametrilor
Folosirea parametrilor primiti de catre un applet se face
prin intermediul metodei getParameter care primeste ca
argument numele unui parametru si returneaza valoarea
acestuia.
In cazul în care nu exista nici un parametru cu numele
specificat, metoda întoarce null, caz în care programul
trebuie sa atribuie o valaore implicita variabilei în care se
dorea citirea respectivului parametru.

Sa rescriem apletul considerat initial (AppletSimplu) astfel


încât acesta sa afiseze textul primit ca parametru, folosind
un font cu numele si dimeniunea specificate de asemenea
ca parametri.
Definirea si folosirea parametrilor
import java.applet.Applet;
import java.awt.*;
public class AppletSimplu extends Applet {
String text, numeFont; int dimFont;
public void init() {
text = getParameter("textAfisat");
if (text==null) text="Hello"; // valoare implicita numeFont =
getParameter("numeFont");
if (numeFont==null) numeFont="Arial";
try { dimFont = Integer.parseInt(getParameter("dimFont")); }
catch(NumberFormatException e) {
dimFont = 16;
}
}
public void paint(Graphics g) {
g.setFont(new Font(numeFont, Font.BOLD, dimFont));
g.drawString(text, 20, 20);
}
}

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