JAVA predavanje 11

Redefinicija metod (overriding)


Kadar metoda, ki jo podrazred podeduje od nadrazreda ni ustrezna, jo lahko v podrazredu redefiniramo: Ponovno jo deklariramo, pri tem pa obdržimo enako ime in enak seznam parametrov (a.k.a. enak podpis – signature).

Primer: razreda Student in IzredniStudent; v razredu Student imamo metodo izpisiVse.

1
2
3
4
public void izpisiVse(){
System.out.println(vpisSt);
System.out.println(priimek + " " + ime);
}

 




Zaradi dedovanja je ta metoda na razpolago tudi v razredu IzredniStudent, vendar ni ustrezna, ker ne izpiše zneska šolnine, zato jo moramo redefinirati.


Kako izgleda metoda izpisiVse v razredu IzredniStudent. To je ena izmed rešitev:

1
2
3
4
5
public void izpisiVse(){
System.out.println(vrniVpisSt());
System.out.println(vrniPriimek() + " " + vrniIme());
System.out.println(znesekSolnine);
}

 




Optimalna rešitev: izpis podedovanih atributov realiziramo z metodo nadrazreda, dodatno pa sprogramiramo le izpis tistih atributov, ki so dodatno deklarirani v podrazredu.

1
2
3
4
public void izpisiVse(){
super.izpisiVse();
System.out.println(znesekSolnine);
}

 




Raba konstruktorjev pri dedovanju


Kadar imamo v nadrazredu konstruktor s parametri moramo v podrazredu nujno napisati lasten konstruktor in v tem konstruktorju poklicati konstruktor nadrazreda ter mu posredovati ustrezne parametre.

Klic konstruktorja nadrazreda realiziramo z rezerviramo besedo super in mora biti prvi stavek v konstruktorju podrazreda.

Primer: za izhodišče vzamemo razreda Student in IzredniStudent; v razredu Student imamo konstruktor s tremi parametri.


1
2
3
4
5
public Student(int vs, String p, String i){
vpisSt = vs;
priimek = p;
ime = i;
}

 




V podrazredu IzredniStudent moramo sedaj napisati konstruktor s parametri in v njem poklicati konstruktor nadrazreda:

1
2
3
4
public IzredniStudent(int vs, String p, String i, double zs){
super(vs, p, i); //klic konstruktorja nadrazreda
znesekSolnine = zs;
}

 





Abstraktni razred in abstraktne metode


Abstraktni razred je nek splošni nadrazred v katerem ne moremo še sprogramirati vseh metod, ampak nekatere metode le "nakažemo". Tem metodam rečemo abstraktne metode.


Posledice pri dedovanju: Podrazred podeduje abstraktne metode, ki pa niso uporabne, zato jih mora redefinirati.

Ker abstraktni razred ni "popoln" (niso natančno specificirane vse metode), ne moremo kreirati objektov abstraktnega razreda.


Primer: Abstraktni razred Zival, v katerem želimo imeti metodo oglasanje, ki izpise, kako se določena žival oglaša. Te metode ne moremo še sprogramirati, zato jo deklariramo, kot abstraktno. Iz razreda Zival izpeljemo več podrazredov (za vsako vrsto živali svoj podrazred).

Zival.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public abstract class Zival{
private String ime;
 
public Zival(String i){
ime = i;
}
 
public String vrniIme(){
return ime;
}
 
public abstract void oglasanje(); //deklaracija abstraktne metode
}
 
class Pes extends Zival{
 
//konstruktor
public Pes(String i){
super(i);
}
 
//redefinicija abstraktne metode oglasanje
public void oglasanje(){
System.out.println("How, how, ... ");
}
}
 
class Krava extends Zival{
public Krava(String i){
super(i);
}
 
public void oglasanje(){
System.out.println("Muuuu");
}
}
 
class Kaca extends Zival{
public Kaca(String i){
super(i);
}
 
public void oglasanje(){
System.out.println("Sssss");
}
}

 




Z abstraktno metodo zagotovimo, da bodo te metode v podrazredih res prisotne. S tem predpišemo vsebino podrazredov.


Še testni razred:

DemoAbstraktni.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class DemoAbstraktni{
public static void main(String[] args){
 
//deklaracija treh objektov
Pes p;
Krava k;
Kaca ka;
 
//kreiramo objekte
System.out.print("Ime psa: ");
p = new Pes(BranjePodatkov.preberiString());
 
System.out.print("Ime krave: ");
k = new Krava(BranjePodatkov.preberiString());
 
//izpis objektov
System.out.println(p.vrniIme());
p.oglasanje();
 
System.out.println(k.vrniIme());
k.oglasanje();
}
}

 





Dinamično povezovanje metod


Dinamično povezovanje metod je sposobnost programa, da med izvajanjem izbere tisto metodo, ki pripada dejanskemu objektu.

Primer: deklariramo spremenljivko z tipa Zival.

1
Zival z;

 



kreiramo tri objekte tipa Pes, Krava in Kaca.

1
2
3
Pes p = new Pes("Fifi");
Krava k = new Krava("Liska");
Kaca ka = new Kaca("Klopotaca");

 




Dopustni so naslednji prireditveni stavki:

1
2
3
4
5
z = p;    //spremenljivka z vsebuje objekt tipa Pes
z = k;    //spremenljivka z vsebuje objekt tipa Krava
z = ka;    //spremenljivka z vsebuje objekt tipa Kaca
 
z.oglasanje();    //izpisemo, kako se oglaša žival, ki jo predstavlja spremenljivka z

 


 


Dinamično povezovanje metod omogoča, da se izbere metoda oglašanja iz tistega v katerega spada objekt, ki je trenutno shranjen v spremenljivki z.

Dinamično povezovanje metod si lahko razložimo tudi s pojmoma "dinamični podatkovni tip" in "statični podatkovni tip".

Statični podatkovni tip je tisti, ki je določen ob deklaraciji spremenljivke (za spremenljivko z je ta tipa Zival).

Dinamični podatkovni tip je tisti, do katerega pride med izvajanjem programa (za spremenljivko z imamo tri možnosti: Pes, Krava, Kaca).

Dinamični podatkovni tip je tisti, ki določa, katera metoda oglasanje se izvede.

 

DemoDinamicnoPovezovanje.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class DemoDinamicnoPovezovanje{
	public static void main(String[] args){
		Zival z;
 
		Pes p = new Pes("Fifi");
		Krava k = new Krava("Liska");
		Kaca ka = new Kaca("Klopotaca");
 
		z = p;
		z.oglasanje();
 
		z = k;
		z.oglasanje();
 
		z = ka;
		z.oglasanje();
	}
}

 

Heterogene tabele objektov


Koncept dedovanja omogoča, da kreiramo tabele, ki vsebujejo objekte različnih tipov.

Pomembno je, da so vsi tipi objektov izpeljani iz istega nadrazreda.


Primer: Zgradili bomo tabelo, ki bo vsebovala objekte tipa Pes, Krava, Kaca.

1
Zival[] tz = new Zival[10];

 


 

DemoHeterogeneTabele.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class DemoHeterogeneTabele{
	public static void main(String[] args){
		Zival[] tz = new Zival[5];
 
		//vpis podatkov v tabelo
		for(int i = 0; i<tz.length; i++){
			System.out.print("Katera žival? (1-Pes, 2-Krava, 3-Kaca): ");
			int odg = BranjePodatkov.preberiInt();
			System.out.print("Ime zivali: ");
			String imeZivali = BranjePodatkov.preberiString();
 
			switch(odg){
				case 1: tz[i] = new Pes(imeZivali); break;
				case 2: tz[i] = new Krava(imeZivali); break;
				case 3: tz[i] = new Kaca(imeZivali); break;		
			}
		}
 
		//izpis vsebine tabele
		for(int i = 0; i<tz.length; i++){
			System.out.print(tz[i].vrniIme() + " se oglasa");
			tz[i].oglasanje();
		}
	}
}

 

Razred Object in njegove metode


Razred Object
je univerzalni nadrazred, iz katerega so izpeljani vsi ostali razredi.

V razredu Object so deklarirane že nekatere metode. Te metode avtomatsko podedujejo vsi ostali razredi.

Primeri teh metod so:

toString()


vrne ime razreda, ki mu pripada in naslov lokacije v pomnilniku, kjer se ta objekt nahaja (npr. @ba34f2).

Dogovor: V vsakem razredu to metodo redefiniramo tako, da vrne niz, ki predstavlja vsebino objekta.

equals()


služi za primerjavo dveh objektov (ali sta enaka ali ne).

v razredu Object: objekta primerja tako, da primerja njuna naslova.


Primer:

 

1
2
Pes p1 = new Pes("Fifi");
Pes p2 = new Pes("Fifi");

izraz  p1.equals(p2) vrne vrednost false.

False je zato, ker spremenljivki vsebujeta naslova dveh različnih objektov.

Če nam ta način delovanja metode ustreza je ni potrebno redefinirati.

V razredu String je metoda equals redefinirana tako, da primerja vsebino dveh nizov:
1
2
String niz1 = "Fifi";
String niz2 = "Fifi";

 

 

izraz niz1.equals(niz2) vrne true.

Vsi vodiči so na voljo BREZPLAČNO!
Pišite mi

Želite mnenje ali pomoč pri vašem projektu?

Pišite mi in bom pomagal, kakor bom v tistem trenutku lahko.