Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- Praktische Informatik (http://www.informatikerboard.de/board/board.php?boardid=6)
--- Ausgabe bei Ausführung (http://www.informatikerboard.de/board/thread.php?threadid=2028)
Geschrieben von neuling96 am 29.12.2014 um 04:21:
wie nimmt das allg Prinzip das hinter diesen Prozess steht?
Geschrieben von eulerscheZahl am 29.12.2014 um 07:56:
Das nennt sich Polymorphie.
Geschrieben von neuling96 am 08.01.2015 um 06:07:
[quote]
Original von eulerscheZahl
Viel besser.
Die erste Unstimmigkeit haben wir hier:
| code: |
1:
|
System.out.println(o1.add(o2)); //2 |
|
Es gibt die Variablen A.a und B.a.
| code: |
1:
2:
3:
4:
|
public B(int a){
super(a);
System.out.println("B.a = " + this.a); //Testausgabe liefert: B.a = 0
} |
|
ruft aber den Konstruktor der Elternklasse auf und setzt somit das A.a, währed B.a auf dem Anfangswert 0 bleibt. Bei B.getA() wird daher eine 0 zurückgegeben.
o1.add(o2) macht also 2+0 = 2
[quote]
"Bei Attributen tritt dabei der Effekt der
Versteckens
auf: Das Attribut der
Vaterklasse ist in der abgeleiteten Klasse nicht mehr sichtbar"
genau das haben wir hier vorliegen, auf das Attribute this.a ist nicht mehr sichtbar in der Vaterklasse.
muss in der abgeleiteten klasse
Es ist nicht erlaubt, den Default-Konstruktor aufzurufen, obwohl
ein expliziter Konstruktor in der Vaterklasse vorhanden ist und der
Default-Konstruktor nicht existiert
was wenn in der vaterklasse
public class A {
private int a;
public A(){ // ohne in klammern int a
this.a = a;
}
und muss eine abgeleitet klasse stets mit super beginnen also ich mein
public class B extends A {
private int a;
public B(int a){
super(a);// ohne super obwohl in der vaterklasse ein -Konstruktor vorhanden ist
}
Geschrieben von neuling96 am 08.01.2015 um 06:09:
"Bei Attributen tritt dabei der Effekt der
Versteckens
auf: Das Attribut der
Vaterklasse ist in der abgeleiteten Klasse nicht mehr sichtbar"
genau das haben wir hier vorliegen, auf das Attribute this.a ist nicht mehr sichtbar in der Vaterklasse.
und deshalb ist this.a nicht mehr sichtbar in B ??
Geschrieben von eulerscheZahl am 08.01.2015 um 06:35:
zum Verstecken: ja, genau das ist der Fall. Aber
this.a ist weiterhin vorhanden - nur einen ein
anderes a. Nämlich das der Kindklasse.
| Zitat: |
public class A {
private int a;
public A(){ // ohne in klammern int a
this.a = a;
} |
wenn kein a an die Funktion übergeben wird, dann ist
this.a nur eine andere Schreibweise für
a. Und da der Initialwert (und somit aktuelle Wert) 0 ist, setzt du ihn erneut zu 0.
super(a) ruft den Konstruktor der Elternklasse auf. Das ist nicht verpflichtend, kommt eben darauf an, welches Verhalten du erzielen willst.
Geschrieben von neuling96 am 08.01.2015 um 06:42:
| Zitat: |
Original von eulerscheZahl
zum Verstecken: ja, genau das ist der Fall. Aber this.a ist weiterhin vorhanden - nur einen ein anderes a. Nämlich das der Kindklasse.
|
und der einzige zugriff this.a erfolgt durch den befehl super, richtig?
Geschrieben von eulerscheZahl am 08.01.2015 um 06:45:
Ja, das ursprüngliche a kriegst du nur über super.a - oder besser gesagt über super.getA(), da a ja private ist.
Geschrieben von neuling96 am 08.01.2015 um 06:48:
noch eins
das in der klasse A def funktion
public int getA(){
return this.a;
kann nun jede beliebig klasse zugriffen werden mit super.getA()?
Geschrieben von eulerscheZahl am 08.01.2015 um 13:51:
Wenn Klasse B von A erbt, kannst du mit super.getA() darauf zugreifen.
Wenn Klasse C von B erbt und B und C ebenfalls ein getA() haben, wirst du an A.getA() nicht mehr herankommen. Ein super.super gibt es nicht.
Außerhalb der Klasse geht das auch nicht: B b = new B(2); b.super.getA(); geht also auch nicht.
Geschrieben von neuling96 am 24.01.2015 um 01:37:
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
|
public class A {
private int a;
public A(int a){
this.a = a;
}
public int getA(){
return this.a;
}
public int add(A a){
return this.a + a.getA();
}
public int m(){
return 1;
}
public int n(){
return this.m();
}
public String toString(){
return "Ich bin ein A.";
}
}
|
|
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
|
public class B extends A {
private int a;
public B(int a){
super(a);
}
public int getA(){
return this.a;
}
public int add(B b){
return this.getA() + b.getA();
}
public int m(){
return 2;
}
public int n() {
return this.m();
}
public String toString(){
return "Ich bin ein B.";
}
}
|
|
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
|
public class C {
public static String print(A a){
return "Parameter A: " + a.toString();
}
public static String print(B b){
return "Parameter B: " + b.toString();
}
public static void main(String[] args) {
A o1 = new A(2);
B o2 = new B(3);
A o3 = new B(4);
System.out.println(o3.n());
}
}
}
|
|
bestimme den wert von o3.n()
o3.n() ist =2 (überschreiben effekt)
jetzt soll die Methode int n() von A ausgeklammert werden
was liefert nun o3.n()
die main kennt o3 als A, allerdings wird erst zur lauzeit entscheiden, welche methode ausgeführt, aber in A gibt es int n () nicht mehr
ich denke
der Compiler überprüft vor der laufzeit ob überhaupt die Methode enthalten ist?? (ist geraten)
und damit geht es nicht, weil int n() nicht in A gibt??
Geschrieben von eulerscheZahl am 24.01.2015 um 09:06:
Der Compiler stellt zwar fest, ob A die Methode n() hat, weshalb sich das Programm auch nicht starten lässt. Aber mit Laufzeit hat das nichts zu tun (das ist auch nicht Aufgabe des Compilers, sonst könntest du dir Laufzeitfehler ja auch schon beim Compilieren anzeigen lassen).
Forensoftware: Burning Board, entwickelt von WoltLab GmbH