Documente Academic
Documente Profesional
Documente Cultură
Suprancrcarea (overloading)
Supradefinirea (overriding)
class A {
void metoda() {
System.out.println("A: metoda fara parametru");
}
// Suprancrcare
void metoda(int arg) {
System.out.println("A: metoda cu un parametru");
}
}
class B extends A {
// Supradefinire
void metoda() {
System.out.println("B: metoda fara parametru");
}
}
Static/dynamic binding n Java
class Vehicle {
public void drive() {
System.out.println("A");
}
}
A
B
B
Polimorfism
class Vehicle {
public void start() {
System.out.println("In metoda start din Vehicle!");
}
}
class Car extends Vehicle {
public void start() {
System.out.println ("In metoda start din Car!");
}
}
public class DynamicBindingTest {
public static void main(String args[]) {
Vehicle vehicle = new Car(); //tip Vehicle, dar obiect Car
vehicle.start(); //start din clasa Car - start() e supradef
}
}
Conceptul de overriding
Car extends Vehicle - supradefinete start()
Apelul lui start() pentru un obiect Vehicle,
apeleaz start() din subclasa Car deoarece
obiectul referit de tipul Vehicle este un obiect
Car
Aceasta se petrece la execuie pentru c
obiectul este creat doar la execuie ->
Dynamic binding in Java.
Dynamic binding este mai ncet dect static
binding pentru c apare n momentul execuiei
i necesit timp pentru a determina care
metod este apelat de fapt.
Exemplu Static Binding vs
Dynamic binding
Output:
Cainele este un: ciobanesc
(dynamic binding)
Tipul este: mamifer
(static binding)
Output:
Cainele este un: ciobanesc
Tipul este: ciobanesc
Observaii
class TestEgal{
public boolean equals ( TestEgal other ) {
System.out.println( "In equals din TestEgal" ); return false;
}
public static void main( String [] args ) {
Object t1 = new TestEgal(), t2 = new TestEgal();
TestEgal t3 = new TestEgal();
Object o1 = new Object();
int count = 0;
System.out.println( count++ ); // afiseaza 0
t1.equals( t2 ) ;
System.out.println( count++ ); // afiseaza 1
t1.equals( t3 );
System.out.println( count++ ); // afiseaza 2
t3.equals( o1 );
System.out.println( count++ ); // afiseaza 3
t3.equals(t3);
System.out.println( count++ ); // afiseaza 4
t3.equals(t2);
}
}
Rezolvare
Output:
0
1
2
3
In equals din TestEgal
4
class Test {
public static void main(String args[]) {
Adult a = new Student(); /* fara
eroare */
Adult b = new Inginer();/* fara
eroare */
a.explorare(); // fara eroare
b.explorare(); // fara eroare
a.afisare(); //fara eroare
b.afisare(); //eroare la compilare!
}
}
Exerciiu propus
class Ana {
public void print(Ana p) {
System.out.println("Ana 1\n");
}
}
class Mihai extends Ana {
public void print(Ana p) {
System.out.println("Mihai 1\n");
}
public void print(Mihai l) {
System.out.println("Mihai 2\n");
}
}
class Dana extends Mihai {
public void print(Ana p) {
System.out.println("Dana 1\n");
}
public void print(Mihai l) {
System.out.println("Dana 2\n");
}
public void print(Dana b) {
System.out.println("Dana 3\n");
}
}
Exerciiu propus
Ce sunt coleciile ?
Interfee ce descriu colecii
Implementri ale coleciilor
Folosirea eficient a coleciilor
Algoritmi polimorfici
Tipuri generice
Iteratori i enumerri
Ce sunt coleciile ?
Avantaje:
Reducerea efortului de programare
Creterea vitezei i calitii programului
Interfee ce descriu colecii
Collection
Map
Set List
SortedMap
SortedSet
AbstractCollection
AbstractMap
AbstractSet AbstractList
Collection
HashSet
TreeSet
LinkedHashSet
SortedSet
List (I)
AbstractList (A)
Stack
List (2)
ArrayList LinkedList
add 0.12 0.14
get 0.01 87.45
remove 12.05 0.01
Concluzii:
exist diferene substaniale n reprezentarea
i comportamentul diferitelor implementri
alegerea unei anumite clase pentru
reprezentarea unei mulimi de elemente trebuie
s se fac n funcie de natura problemei ce
trebuie rezolvat.
Algoritmi polimorfici
Caracteristici comune:
sunt metode de clas (statice);
au un singur argument de tip colecie;
apelul lor general va fi de forma:
Collections.algoritm(colectie,[argumente]);
majoritatea opereaz pe liste dar i
pe colecii arbitrare.
Exemple de algoritmi
sort
shuffle
binarySearch
reverse
fill
copy
min
max
swap
enumeration
unmodifiableTipColectie
synchronizedTipColectie
Tipuri generice
Enumeration:
// Parcurgerea elementelor unui vector v
Enumeration e = v.elements();
while (e.hasMoreElements()) {
System.out.println(e.nextElement());
}
// sau, varianta mai concisa
for(Enumeration e=v.elements(); e.hasMoreElements();){
System.out.println(e.nextElement());
}
Iterator, ListIterator
Atenie!
Deoarece coleciile sunt construite peste tipul de date
Object, metodele de tip next sau prev ale iteratorilor
vor returna tipul Object, fiind responsabilitatea noastr
de a face conversie (cast) la alte tipuri de date, dac
este cazul.
import java.util.*;
class MyArray {
ArrayEnum (MyArray a) {
this.a =a;
i=0;
}
class ArrayDemo {
// afisare prin enumerare
public static void main ( String av[]) {
MyArray a = new MyArray(10);
for (int i=1;i<11;i++)
a.add(""+i);
Enumeration it = a.elements();
while (it.hasMoreElements())
System.out.print (it.nextElement()+",");
System.out.println();
System.out.println(a);
}
}