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 28.12.2014 um 01:07:

  Ausgabe bei Ausführung

System.out.println(o1.m() + o2.m()); ->(1+2)=(3)
System.out.println(o2.m() + o3.m()); ->(2+2)=(4)

System.out.println(o2.n()); ->2

System.out.println(print(o1)); ->Parameter A: Ich bin ein A.
System.out.println(print(o2));->Parameter B: Ich bin ein B.
System.out.println(print(o3));->Parameter B: Ich bin ein B.

System.out.println(o1.add(o1));2+2= 4
System.out.println(o1.add(o2));geht nicht?
System.out.println(o2.add(o3)); 4+4=8
System.out.println(o2.add(o2));3+3=6



Geschrieben von eulerscheZahl am 28.12.2014 um 08:00:

 

Sei so lieb und gib den Code in Textform und nicht als Bild an, dann kann ich es auch ausführen ohne abtippen zu müssen.



Geschrieben von neuling96 am 28.12.2014 um 08:04:

 

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));
 }
 }
 }



Geschrieben von eulerscheZahl am 28.12.2014 um 09:25:

 

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.



Geschrieben von neuling96 am 28.12.2014 um 09:49:

 

ich sehe gerade, dass in der überschritt des übungsblattes steht : Interface

kann man das verstehen ohne Interface behandelt zuhaben?



Geschrieben von eulerscheZahl am 28.12.2014 um 10:05:

 

Es geht hier um Vererbung und Polymorphie, um das zu verstehen, musst du keine Interfaces kennen.



Geschrieben von neuling96 am 28.12.2014 um 10:51:

 

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?



Geschrieben von neuling96 am 28.12.2014 um 11:01:

 

A o3 = new B(4);

was genau macht das?



Geschrieben von eulerscheZahl am 28.12.2014 um 11:32:

 

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.



Geschrieben von neuling96 am 28.12.2014 um 11:45:

 

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?



Geschrieben von eulerscheZahl am 28.12.2014 um 11:57:

 

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.



Geschrieben von neuling96 am 28.12.2014 um 12:18:

 

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?



Geschrieben von eulerscheZahl am 28.12.2014 um 12:50:

 

das ist die main:
code:
1:
public static void main(String[] args) {


Ich tue mir gerade schwer, wie ich das erklären soll, hilft dir das weiter? Javainsel



Geschrieben von neuling96 am 28.12.2014 um 13:14:

 

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



Geschrieben von eulerscheZahl am 28.12.2014 um 13:21:

 

[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.


Forensoftware: Burning Board, entwickelt von WoltLab GmbH