Documente Academic
Documente Profesional
Documente Cultură
obiect
Curs 4 – Mostenire
J
J Acest curs
› Mostenire in Java
› Constructori
J Mostenire
› Mostenirea este mecanismul fundamental pentru
refolosirea codului.
› Prin mostenire o clasa noua dobandeste toate atributele si
comportamentul unei clase existente (clasa originala).
› Din acest motiv, noua clasa poate fi creata prin simpla
specificare a diferentelor fata de clasa originala din care
provine.
› Datorita relatiilor de mostenire clasele de obiecte sunt
organizate intr-o ierarhie bine precizata.
J Mostenire
› In cadrul ierarhiei claselor de obiecte, operatia de definire a
unei noi clase de obiecte pe baza uneia deja existente se
numeste derivare.
› Clasa originala (mai generala) se va numi superclasa a noii
clase, iar noua clasa de obiecte se va numi subclasa a
clasei din care deriva.
› Uneori, in loc de derivare se foloseste termenul de
extindere.
J Mostenire
› Termenul vine de la faptul ca o subclasa isi extinde
superclasa cu noi variabile si metode.
› De exemplu putem extinde clasa Patrulater:
– la Patrat
– si Dreptunghi
› Intr-o ierarhie de clase, o clasa poate avea o singura
superclasa, insa poate avea un numar nelimitat de
subclase.
J Mostenire
› Subclasele mostenesc toate atributele si metodele
superclasei lor, care la randul ei mosteneste toate
atributele si metodele de la superclasa ei si asa mai
departe, urcand in ierarhie.
› Rezulta ca o clasa nou creata contine toate atributele si
metodele claselor aflate deasupra sa in ierarhie, si in plus
contine propriile atribute si metode.
J Mostenire
if(test1.equals(test2)){
System.out.println("test1 and test2 are true in .equal");
}
t = null;
// calling garbage collector
System.gc();
System.out.println("end");
}
@Override
protected void finalize()
{
System.out.println("finalize method called");
} 366712642
} end
finalize method called
J Class Object
› public final Class<?> getClass()
› Returneaza clasa de runtime a obiectului
Student(){
roll_no = last_roll;
last_roll++;
}
@Override
public int hashCode(){
return roll_no;
}
class Base
{
int x;
Base(int _x)
{
x = _x;
}
}
J Constructori
class Derived extends Base {
int y;
Derived(int _x, int _y) {
super(_x);
y = _y;
}
void Display() {
System.out.println("x = "+x+", y = "+y);
}
}
// Inherited class
class Child extends Parent
{
@Overide
// This method overrides show() of Parent
void show()
{
System.out.println("Child's show()");
}
28
}
J Suprascrierea functiilor
class Main
{
public static void main(String[] args)
{
// If a Parent type reference refers
// to a Parent object, then Parent's
// show is called
Parent obj1 = new Parent();
obj1.show();
J int x = 0;
int y = 1;
void afisareDate()
{
System.out.println("Sunt un obiect al clasei " +
this.getClass().getName());
System.out.println("x este " + x);
System.out.println("y este " + y);
}
}
class B extends A
{
int z = 3;
void afisareDate()
{
super.afisareDate();
System.out.println("z este " + z);
}
}
Accesul la metodele din superclasă şi
J redefinirea metodelor în clasele derivate
› Atunci cand se creaza o clasa derivata si se redefineste (suprascrie)
o metoda declarata intr-o superclasa, trebuie sa se ia in considerare
tipul de acces dat pentru metoda originala.
› 1. metodele de tip public dintr-o superclasa trebuie sa fie, de
asemenea, de tip public in toate clasele derivate; ele nu pot fi
redefinite de tip private in clasele derivate;
› 2. metodele de tip protected dintr-o superclasa pot fi de tip
protected sau de tip public in clasele derivate; ele nu pot fi
redefinite de tip private in clasele derivate;
› 3. metodele de tip private dintr-o superclasa nu pot fi redefinite
(suprascrise) in clasele derivate
J Some Interesting Facts:
› 1. In C++ este necesar cuvantul virtual pentru polimorfism, in java
metodele sunt implicit virtuale
› 2. Suprascriere multi-nivel
// Base Class
class Parent
{
void show() { System.out.println("Parent's show()"); }
}
// Inherited class
class Child extends Parent
{
// This method overrides show() of Parent
void show() { super.show();System.out.println("Child's show()"); }
}
33
J Some Interesting Facts:
// Inherited class
class GrandChild extends Child
{
// This method overrides show() of Parent and Child
void show() { super.show();System.out.println("GrandChild's show()"); }
}
// Driver class
class Main
{
public static void main(String[] args)
{
Parent obj1 = new GrandChild();
obj1.show();
}
} Parent's show()
Child's show()
GrandChild's show() 34
J Some Interesting Facts:
› 3. Daca se doreste ca o metoda sa nu mai fie suprascrisa
se va declara ca fiind final
class Parent
{
// Can't be overridden
final void show() { }
}
39
J C++ vs. Java
› 2. In Java, membrii grand parent nu sunt direct accesibili
// filename Main.java
class Grandparent {
public void Print() {
System.out.println("Grandparent's Print()");
}
}
40
J C++ vs. Java
class Child extends Parent {
public void Print() {
super.super.Print(); // Trying to access Grandparent's Print()
System.out.println("Child's Print()");
}
} Error:(114, 15) java: <identifier> expected
41
J C++ vs. Java
› 3. Specificatorul de acces protected nu impiedica alte clase
care nu fac parte din ierarhie sa acceseze membrii
respectivi. Conditia este ca acele clase sa faca parte din
acelasi pachet. In C++ doar clasele derivate pot accesa
membrii privati
// filename B.java
class A {
protected int x = 10, y = 20;
}
class B {
public static void main(String args[]) {
A a = new A();
System.out.println(a.x + " " + a.y);
}
} 42
J C++ vs. Java
› 4. In Java nu exista specificator de acces pentru derivare
› 5. In Java metodele sunt implicit virtuale, in C++ nu
› 6. Java foloseste cuvinte cheie pentru interfata si clase
abstracte
43
J C++ vs. Java
// An abstract class example
abstract class myAbstractClass {
// An abstract method
abstract void myAbstractFun();
// A normal method
void fun() {
System.out.println(“abc");
}
}
44
J C++ vs. Java
// An interface example
public interface myInterface {
// myAbstractFun() is public and abstract, even if we don't use these keywords
void myAbstractFun(); // is same as public abstract void myAbstractFun()
}
45
J C++ vs. Java
› 7. In Java nu este permisa mostenirea multipla. Totusi o
clasa poate mosteni mai multe interfete
› 8. In C++ exista lista de initializare.
package main;
class Base {
private int b;
Base(int x)
{
b = x;
System.out.println("Base constructor called");
}
}
46
J C++ vs. Java
class Derived extends Base {
private int d;
Derived(int x, int y) {
// Calling parent class parameterized constructor
// Call to parent constructor must be the first line in a Derived class
super(x);
d = y;
System.out.println("Derived constructor called");
}
}
class Main{
public static void main(String[] args) {
Derived obj = new Derived(1, 2);
}
}
Base constructor called
Derived constructor called 47
J C++ vs. Java
› 9. In java nu se pot suprascrie metode private. In C++ da.
class Base {
private void fun() {
System.out.println("Base fun");
}
}
class Base {
private:
virtual void fun() { cout << "Base Fun"; }
friend int main();
};
int main()
{
Base *ptr = new Derived;
ptr->fun();
return 0;
}
49
J Clase parinte si copil cu acelasi tip de atribute
class Parent
{
int value = 1000;
Parent()
{
System.out.println("Parent Constructor");
}
}
J
J Buffered draw
J Game loop
public class Game implements Runnable
{
J //game attributes
//constructors
public Game() { ... }