Ausgabe bei Ausführung |
neuling96 unregistriert
|
|
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:
|
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 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:
25:
26:
27:
28:
29:
30:
31:
32:
|
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(o1.m() + o2.m());
System.out.println(o2.m() + o3.m());
System.out.println(o2.n());
System.out.println(print(o1));
System.out.println(print(o2));
System.out.println(print(o3));
System.out.println(o1.add(o1));
System.out.println(o1.add(o2));
System.out.println(o2.add(o3));
System.out.println(o2.add(o2));
}
}
}
|
|
|
|
28.12.2014 08:04 |
|
|
|
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
code: |
1:
|
System.out.println(o2.add(o3)); //3 |
|
Ist ein B.add(A). Da B diese Funktion nicht anbietet (hat nur B.add(B)), wird A.add(A) aufgerufen. this.getA() ist daher 3, b.getA() liefert eine 0 (Begründung siehe oben)
code: |
1:
|
System.out.println(o2.add(o2)); //0 |
|
greift zweimal auf B zu, also 0 + 0 = 0.
__________________ Syntax Highlighting fürs Board (Link)
|
|
28.12.2014 09:25 |
|
|
neuling96 unregistriert
|
|
ich sehe gerade, dass in der überschritt des übungsblattes steht : Interface
kann man das verstehen ohne Interface behandelt zuhaben?
|
|
28.12.2014 09:49 |
|
|
neuling96 unregistriert
|
|
ich tun mich das alles nach zuvollziehen
(o1.add(o2));
wieso wird hier
ruft aber den Konstruktor der Elternklasse auf und setzt somit das A.a, aber wieso?
ich verstehe auch nicht wieso es die Variablen A.a und B.a. gibt?
|
|
28.12.2014 10:51 |
|
|
neuling96 unregistriert
|
|
A o3 = new B(4);
was genau macht das?
|
|
28.12.2014 11:01 |
|
|
|
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
|
public class A {
private int a;
//...
}
public class B extends A {
private int a;
//...
} |
|
die Klassen haben beide eine Variable namens a, aber es sind trotzdem 2 verschiedene Variablen. Dabei verdeckt B.a A.a. Deshalb liefert B.getA() immer 0.
code: |
1:
|
A o3 = new B(4); |
|
legt ein B Objekt an und speichert einen Verweis auf ein A Objekt ab.
__________________ Syntax Highlighting fürs Board (Link)
|
|
28.12.2014 11:32 |
|
|
neuling96 unregistriert
|
|
legt ein B Objekt an und speichert einen Verweis auf ein A Objekt ab
d.h wenn ich eine Methode mit A o3 = new B(4);
03.beliebigeMethode aufrufe dann wird die beliebigeMethode von B aufgerufen, da es sich um ein Objekt aus B handelt?
wird hingegen
haben wir public int(A a) und public int(B b), dann wird public int(A a) ausgeführt?
|
|
28.12.2014 11:45 |
|
|
|
Zitat: |
haben wir public int add(A a) und public int add(B b), dann wird public int add(A a) ausgeführt? |
Bei o2.add(o3) wird o2.add(B b) aufgerufen, da o3 ein B ist. o3 verhält sich wie ein B.
Einen Unterschied gibt es aber: die main kennt o3 als A und erlaubt daher nur, dessen Funktionen aufzurufen.
code: |
1:
|
System.out.println(o3.add(o2)); //4 |
|
ruft die Funktion add der Klasse A auf, da o3 in der main als A und nicht als B bekannt ist.
Mein Rat: hole dir NetBeans/eclipse und gehe das Programm mit Hilfe des Debuggers Zeile für Zeile durch, dann siehst du, wann welche Funktion aufgerufen wird.
__________________ Syntax Highlighting fürs Board (Link)
|
|
28.12.2014 11:57 |
|
|
neuling96 unregistriert
|
|
Zitat: |
Original von eulerscheZahl
System.out.println(o2.add(o3)); //3
Ist ein B.add(A). Da B diese Funktion nicht anbietet (hat nur B.add(B)), wird A.add(A) aufgerufen. this.getA() ist daher 3, b.getA() liefert eine 0
. |
Zitat: |
Original von eulerscheZahl
Zitat: |
haben wir public int add(A a) und public int add(B b), dann wird public int add(A a) ausgeführt? |
Bei o2.add(o3) wird o2.add(B b) aufgerufen, da o3 ein B ist. o3 verhält sich wie ein B.
Einen Unterschied gibt es aber: die main kennt o3 als A und erlaubt daher nur, dessen Funktionen aufzurufen.
. |
wieso ist einmal B.add(A). und dann B.add(B)
und was genau ist die main im Programm?
|
|
28.12.2014 12:18 |
|
|
neuling96 unregistriert
|
|
o1.add(o2)
das problem was ich habe ist folgendes
01 ist von A und damit o1.add(o2) auf etwas zugegriffen, was eig nicht in der klasse A gibt
System.out.println(o2.add(o2)); //0
das habe ich verstanden
System.out.println(print(o3));
die main nimmt es als 03 als A auf
also wird
public static String print(A a){
return "Parameter A: " + a.toString();
}
aus geführt?
bei a.toString wird aber aber auf B klasse zugegriffen
also
Paramerter A: ich bin ein B
|
|
28.12.2014 13:14 |
|
|
|
[qoute]o1 ist von A und damit o1.add(o2) auf etwas zugegriffen, was eig nicht in der klasse A gibt [/quote]
aber o2 ist ja als B nichts anderes als ein abgeleitetes A. Daher kann es verwendet werden (wenn es in A eine Funktion add(B) geben würde, würde die genommen werden. Gibt es aber nicht, also die zweitbeste Lösung, die ein A erwartet.
toString() gibt es für 2 Klassen (eigentlich für 3, auch für Object, von dem A erbt). o3 ist von Typ B, ruft also B.toString() auf.
Hätte B noch eine Funktion, die A nicht besitzt, könntest du sie in der main nicht aufrufen, da o3 dort als A deklariert ist.
__________________ Syntax Highlighting fürs Board (Link)
|
|
28.12.2014 13:21 |
|
|
|