[Java] Verständsfrage Typ|Konstruktor

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von osiris, 2. Mai 2013 .

Schlagworte:
  1. 2. Mai 2013
    Verständsfrage Typ|Konstruktor

    moin moin.

    Ich frag mich gerade, wenn ich ObjektA haus = new ObjektB(); beispielsweise schreibe was isses dann? Welche Methoden kann ich verwenden?
    Die von ObjektB oder ObjektA?

    Also wenn ObjektB extends ObjektA.

    Beispielsweise:

    Code:
    public class Haus{
     public void print(Haus a){
     System.out.println("Haus 1");
     }
    }
    
    public class Baum extends Haus{
     public void print(Haus a){
     System.out.println("Baum 1");
     }
    
     public void print(Baum b){
     System.out.println("Baum 2");
     }
    }
    
    Und jetzt z.B.:

    Code:
    public static void main(String[] args){
     Haus A = new Baum();
     Haus B = new Haus();
     
     A.print(new Baum());
     B.print(new Baum());
     A.print(new Haus());
     B.print(new Haus());
     ((Baum)A).print(new Haus());
     ((Baum)A).print(new Baum());
     }
    
    Outcome ist hierbei:
    Was ich allerdings nicht ganz verstehe, deshalb der Thread ^.^
     
  2. 2. Mai 2013
    Zuletzt bearbeitet: 2. Mai 2013
    AW: Verständsfrage Typ|Konstruktor

    A ist ein Baum und B ist ein Haus, die Ausgaben sind richtig.

    Du kannst ja mal
    Code:
    System.out.println("A: " + A.getClass());
    System.out.println("B: " + B.getClass());
    
    eintippen und die die Ausgabe ansehen.

    Alternativ kannst du mit "instanceof" prüfen, was für eine Instanz ein Objekt ist.
    Zb:
    Code:
    if (A instanceof Haus) {
     // mach sauber
    } else if (A instanceof Baum) {
     // fällen, whatever
    }
    
    Wobei es dabei dann auf die Reihenfolge ankommt weil A beides ist und somit schon die erste if matchen würde.

    Kleiner Tipp, Variablen schreibt man in Java klein bzw in camelCase
     
  3. 2. Mai 2013
    Zuletzt bearbeitet: 2. Mai 2013
    AW: Verständsfrage Typ|Konstruktor

    Ich hatte an getClass ehrlich gesagt nicht gedacht, aber was da rauskommen wird/rausgekommen ist, war ziemlich offensichtlich:

    A: class zettel6.Baum
    B: class zettel6.Haus

    Was meine Frage leider noch nicht erklärt.
    A.print(new Baum()); liefert Baum 1. // -> Wenn ich hier n Typ Haus habe, lande ich mit new Baum() (die es in Haus nicht gibt!) doch in Baum, nehme aber nicht die dafür zuständige Methode, sondern die erste Methode.
    ((Baum)A).print(new Baum()); liefert Baum 2.

    Der TYP ist jeweils Haus, wird beim zweiten auf Baum gecastet, ist mir soweit auch klar.

    Aber wenn ich einen Typ HAUS habe, bei dem ich 1 Methode habe, darauf ein new Baum(); mache und diesem einen BAUM übergebe, warum bekomme ich dann als return Baum 1.
    Theoretisch wäre:
    Haus übergeben, output: Baum 1
    Baum übergeben, output: Baum 2

    E:/ Die Variablen sind zur Übersicht groß. Ich hoffe nicht, dass jemand in seinem Projekt Objekte mit Baum und Haus benennt. Außer ein Architekturbüro vielleicht.


    E2:/
    Also die Methode BAUM wird auf die überladenen Methoden reduziert: k.
    Warum kann ich aber die Methode, die ein Object vom Typen HAUS erwartet, mit einem Object vom Typen BAUM ansprechen? Wird das automatisch gecastet???
     
  4. 3. Mai 2013
    Zuletzt bearbeitet: 3. Mai 2013
    AW: Verständsfrage Typ|Konstruktor

    Bin ein bisschen verwirrt von den ganzen Häusern und Bäumen^^ aber im Prinzip ja. Weiß nicht mehr 100%ig wie das intern funktioniert, aber Java benutzt einen Bottom-Up-Parser um den Source zu parsen, es wird also das kleinste bzw. tiefste Element im Parse-Tree gematcht. Das Objekt "Baum" hängt unter dem Knoten "Haus", eine Vererbung stellt eine "ist ein"-Beziehung dar. So kannst du alle Sachen, die von "Haus" erben, auch als Haus ansehen (Von daher macht die Vererbung semantisch keinen Sinn, weil ein Baum kein Haus ist ).

    Hier kannst du das noch genauer nachlesen: Java Insel 5 (besonders "Das Substitutionsprinzip")

    Wenn du die print-Methoden in "Baum" mal umbennenst (print1, print2), dürfte nur noch
    die Methode von "Haus" ausgegeben werden, also "Haus 1".

    Relativ häufig benutzt man das zb. bei Methoden die Listen erwarten.

    Code:
    void foo(List bar) {
    
    }
    Da ist es nun egal, was für eine konkrete Liste das ist (ArrayList, LinkedList, eine von dir selbst erstellte Klasse), wichtig ist nur, dass das übergebene Objekt das Java-Interface "List" implementiert.

    Hoffe das hilft dir weiter^^
     
  5. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.