Polymorphie und Vererbung

Status
Nicht offen für weitere Antworten.

sumatra

Mitglied
Ich lerne Java und habe was von polymorphie und sonstigen sachen in der art gehört, doch da ich noch nicht so weit mit dem buch bin, als dass ich selber nach lesen könnte, wollte ich hier fragen... Ich kenne polymorphie indirekt von (computer)viren, die das z.t. auch können... kann mir jemand eine erklärung geben bitte?
mfg
 

KSG9|sebastian

Top Contributor
Code:
class figur{
    int radius;
    public abstract double berechneUmfang();
}
class kreis extends figur(){
    public double berechneUmfang(){
        return Math.PI * radius;
    } 

}
class quadrat extends figur(){
    public double berechneUmfang(){
        return 4 * radius;
    }

}

dass ist polymorphie und vererbung zusammen

vorteil: in den klassen kreis, quadrat kannst du jedesmal die variable radius verwenden, musst sie aber nicht nochmal deklarieren..![/code]

//Edit: Upsi :) war net ganz wach wo ich des geschrieben hab..^^
 
B

bygones

Gast
KSG9|plak hat gesagt.:
Code:
class figur{
    int radius;
    public abstract berechneUmfang();
}
class kreis extends figur(){
    public double umfang(){

}
class quadrat extends figur(){
    public double umfang(){

}
:noe: das soll in java so gehen ???? such mal selber deine Fehler (sind ein paar)
 
B

bygones

Gast
zu 1.

schau dir mal ein paar Konstruktoren in der API an. Man verwendet meist Polymorphie um eine Methode in versch. Weise aufrufen zu können

zu 2.
bei vererbung gibt es zwei untersch. polymorphien:

2.1. "Normale" Vererbung:
d.h. in der Oberklasse ist eine Methode implementiert. Deine Klasse will aber diese Methode aber anders implementieren bzw. diese erweitern. Dann kannst du die Methode aus der Oberklasse überschreiben und deinen eigenen Code darin verwenden.

2.1. Abstract Vererbung:
d.h. in der Oberklasse ist eine Methode als abstract definiert - dann muss deine Klasse diese implementieren.

bei beiden muss die Signatur der Methode übereinstimmen....

zu 3:
bei einer Interface implementieren muss die Methode mit selber Signatur implementiert werden.

wenn es Frage zu Vererbung oder Interfaces gibt - würde ich dir raten ein neuen Thread auzumachen ;-)
 

sumatra

Mitglied
danke
wenn ich dich also richtig verstanden habe, was "vererbung" angeht, dann müsste das eine abstrakte vererbung sein:
Code:
class MusterKlasse
{
    int funktion(void)
    {
        return (1);
    }
}

und jetzt eine andere Klasse:
Code:
public class Klasse
{
    public static void main(String args[])
    {
        MusterKlasse var;
        var = MusterKlasse();
        System.out.println(var.funktion());
    }
}

Ist hier also die funktion "funktion" vererbt worden? seh ich das richtig? :bahnhof:
mfg
 
B

bygones

Gast
nein - das ist leider komplett falsch.

Du nutzt in dem Fall keine Vererbung. Du erzeugst dir einfach eine Instanz einer Klasse in einer andere Klasse und nutzt dann die Methoden der Instanz....

Vererbung ist:
Code:
public class SuperKlasse {
   public void doSomething() {
      System.out.println("Ich tue hier was");
   }
}

public class DieKlasse extends SuperKlasse {
}

public class TestKlasse {
  public static void main(String[] args) {
    DieKlasse k = new DieKlasse();
    k.doSomething(); // DieKlasse erbt diese Methode von der SuperKlasse;
  }
}

D.h. eine Klasse erbt über das Schlüsselwort extends von einer anderen Klasse und kann deren Methoden (außer private) mitbenutzen ohne sie explizit zu haben....

Abstrakte Verebung ist dann folgendes:
Code:
public abstract class SuperKlasse {
   public void abstract doSomething();
}

public class DieKlasse extends SuperKlasse {
   public void doSomething() {
     System.out.println("DieKlasse");
    }
}

public class AndereKlasse extends SuperKlasse {
  public void doSomething() {
     System.out.println("AndereKlasse");
  }
}

public class TestKlasse {
  public static void main(String[] args) {
    SuperKlasse k = new DieKlasse();
    k.doSomething(); // hier wird nun die Methode von DieKlasse aufgerufen

    k = new AndereKlasse();
    k.doSomething(); // hier wird nun die Methode von AndereKlasse aufgerufen
  }
}

Bei der abstrakten Vererbung ist die Oberklasse eine abstrakte Klasse und die erbenden klassen müssen alle abstracten methoden der klasse implementieren !
 

sumatra

Mitglied
danke =)
wenn ich das jetzt mit der "normalen vererbung" richtig verstanden habe, so kann man theoretisch auch einfach innerhalt der klasse "TestKlasse" eine instanz auf die klasse "SuperKlasse" bilden und dann auf die methode "doSomething" zugreifen, oder? (sry, ich will hier keine neun-mal-klugen alternativen oder verbesserungsvorschläge angeben, ich weiss, dass es hier um's prinzip geht ;) ich frage nur, damit ich nichts missverstehe)
mfg
 

KSG9|sebastian

Top Contributor
ja, genau :)

Wenn du Vererbung verwendest, dann kannst du die Methoden der Superklasse (so nennt man die KLasse von der man erbt) direkt zugreifen, wenn du ne Assoziation erstellst greifst du mit

assoziation.methode()

drauf zu.

Im Allgemeinen sagt man, dass Vererbung v.a. dann verwendet wird, wenn man 1 Superklasse hat, und verschiedene Unterklassen, welche die Superklasse speziallisieren.

Beispiele:

Superklasse: KFZ
Unterklassen: Auto, Motorrad, Roller, PickUp

oder

Superklasse: Kleidungsstück
Unterklassen: Hemd, Krawatte, Hose, T-Shirt, Pullover



Ich hoffe mal, dass das ganze so verständlicher ist.
Ach ja, noch was zum Thema abstracte Methoden in Superklassen,

Beispiel:

Superklasse: Figur
Unterklassen: Kreis, Quadrat

Jetzt schreibt man in der Klasse Figur die abstracte Methode berechneFlaeche(), als Rückgabe einen double Wert.
Dann überschreibt man in der Klasse Kreis, Quadrat die Methode. Jetzt ist natürlich die Frage nach dem Sinn, man könnte ja auch so in beiden Unterklassen diese Methode machen OHNE sie in der Superklasse zu haben.

Vorteil:

Du hast eine Liste von Figuren

Code:
Figur[] figuren = new Figuren(20);

figuren[0] = new Kreis(..)
.
.
.

Wenn du jetzt die Gesamtfläche aller Figuren berechen willst, dann musst du nur ein Element nach dem anderen durchlaufen und berechenFlaeche() aufrufen, ohne zu casten...hättest du die abstracte methode nicht, dann würde dass nicht gehen!
 

sumatra

Mitglied
THX für die ausführliche erklärung :)
müssen aber die methoden innerhalb einer klasse, von der geerbt werden soll, als "public" deklariert sein, damit man auf die zugreifen kann?
 

Illuvatar

Top Contributor
Aus einer Subklasse kann man auf public und protected Methoden zugreifen. Wenn die Subklasse im gleichen Package ist auch auf package private Methoden (=default).

Wenn eine Methode final deklariert ist, kann man sie nicht ableiten.

Edit: 2. :(
 
B

bygones

Gast
Illuvatar hat gesagt.:
Wenn die Subklasse im gleichen Package ist auch auf package private Methoden (=default).
Versteh ich nicht - meinst du wenn in der Oberklasse die Methode private deklariert ist kann die erbende Klasse wenn sie im selben Package ist drauf zugreifen ?
Das ist nämlich falsch. Eine private Methode ist nur in der implementierenden Klasse zugänglich !!

Und private ist nicht default !!
 

Illuvatar

Top Contributor
"package private" = nix vor der Methode :D

Code:
class A
{
  void x()
  {}
}
class B extends A  //gleiches Package
{
  public B()
  {
    x();
  }
}
 

sumatra

Mitglied
tut mir leid, wenn ich nerven sollte, aber der meiste teil des thread handelt um vererbung (und jetzt weiss ich auch was das ist :) )
aber was ist genau polymorphie??? :bahnhof: ist es das, wie es klingt, also dass sich das Programm (eigentständig) verändert?
mfg
 

Illuvatar

Top Contributor
Soweit ich weiß, heißt Polymorphie, von mehreren Klassen zu erben, und wird von Java nicht unterstützt.

Oder hab ich das falsch verstanden?
 
B

bygones

Gast
ne nicht ganz:
http://de.wikipedia.org/wiki/Polymorphie_(Programmierung)

Polymorphie ("Vielgestaltigkeit") bedeutet, dass Funktionen bzw. Methoden einem bestimmten Typ bzw. einer bestimmten Klasse zugeordnet sind, und je nach Typ/Klasse eines bestimmten Objekts die zugehörige Funktion/Methode ausgeführt wird.

Man unterscheidet zwischen Kompilationszeit-Polymorphie und Laufzeit-Polymorphie. Kompilationszeit-Polymorphie bedeutet, dass der statische Typ des Objekts die aufgerufene Funktion/Methode bestimmt. Dies funktioniert nur für Sprachen mit statischen Typen, und wird typischerweise mit Überladen und generischen Funktionen implementiert.

Laufzeit-Polymorphie bedeutet, dass die Klasse des Objekts zur Laufzeit bestimmt, welche Methode aufgerufen wird ("späte Bindung"). Diese muss nicht unbedingt identisch mit dem statischen Typ sein (sofern dieser überhaupt existiert). Die Laufzeit-Polymorphie ist einer der wichtigsten Bestandteile der objektorientierten Programmierung.
 

sumatra

Mitglied
also wenn ich das richtig verstanden habe dann wird (bei der laufzeit polymorphie) noch innerhalb des programmdurchlaufs "entschieden" aus welcher klasse welche methoden entnommen werden???
mfg
 

Isaac

Bekanntes Mitglied
Ja. Stellen wir uns mal folgendes einfaches Szenario vor


Du schreibst eine Klasse mit der Methode

Code:
Bonbonbeutel.getAllBonbons()


Von dieser Klasse leitest du Klassen ab

WertersEchte extends Bonbonbeutel
NimmZwei extends Bonbonbeutel

In diesen 2 Klassen implementierst du nun auch die Methode


Code:
WertersEchte.getAllBonbons()
NimmZwei.getAllBonbons()

Jetzt gebe ich deinem Programm von aussen einen Bonbonbeutel (Der aber in wirklichkeit, was du nciht weist, ein Werters oder ein Nimm2 Beutel ist). Du weist zum Zeitpunkt der Programmierung ja nicht ob du nun ne Tüte Werters oder Nimm2 bekommst. Aber du eins weist du. Du kannst die Methode getAllBonbons() Aufrufen.

Zur Laufzeit des Programms wird nun entschieden ob die Werters oder die Nimm2 Methode aufgerufen wird. Alle Methoden in Java sind virtuell. Das bedeutet das eine Methode immer von oberster Implementierungsstelle aufgerufen wird. In diesem Fall also entwerder Werters oder Nimm2.

Am einfachsten kann man es sich an einem kleinen Beispeil begreiflich machen.

Code:
public static void main(String[] args)
{
    String s = "a";
    Object o = (Object)s;
    o.toString();
}


Obwohl ich den String auf Object gecastet habe und eigentlich Object.toString() aufrufe wird hier die String.toString() Methode aufgerufen da ich das Object durch den Cast nicht verändert habe und es weiterhin ein String bleibt.
 

sumatra

Mitglied
danke, jetzt weiss ich eigentlich recht genau was vererbung und polymorphie ist :) ..obgleich ich mir nicht den vorteil vor augen halten kann, was nun der unterschied ist, wenn man nun die methode getAllBonbons entweder von der klasse "NimmZwei" oder von "WertersEchte" entnehme :bahnhof:
 

Illuvatar

Top Contributor
Nun, dieses Beispiel ist vielleicht nicht sehr sinnvoll. Als anderes Beispiel könnte man aus dem Java3D-API die Klasse
Code:
public class J3DGraphics2D extends java.awt.Graphics2d
nehmen. 5 der 7 Methoden dieser Klasse überschreiben eine Methode von Graphics2d, z.B. die Methode setBackground, und zwar so, dass die Methoden nichts bewirken.
Die Ausgabefläche hat die Methode getGraphics2D(), die eine J3DGraphics2D zurückgibt.
Wenn man jetzt schreibt
Code:
J3DGraphics2D 3g2 = canvas3d.getGraphics2D();
Graphics g = (Graphics2d)3g2;
g.setBackground (Color.BLACK);
würde in manchen Programmiersprachen, die Kompilationszeit-Polymorphie benutzen, die Methode aus Graphics2d benutzen, was aber nicht geschehen soll. Da Java Late-Binding, also Laufzeit-Polymorphie unterstützt, wird bei diesem Codestück die Methode setBackground der Klasse J3DGraphics2D benutzt, es passiert also nichts.
 

sumatra

Mitglied
klingt logisch :)
danke
ich hätte da noch eine weitere frage: wieso wird polymorphie bei viren eingesetzt? und wie überhaupt? denn viren werden wohl kaum in java geschrieben und im gegensatz zu anderen programmiersprachen gibt es in java laufzeit-polymorphie (was ich ja erst durch diesen thread herausgefunden habe :D )

das soll keine aufforderung sein wie man denn eigene viren zusammenbastelt, ich will nur das prinzip wissen, denn das war unter anderem auch der anlass wieso ich mich und hier überhaupt gefragt habe...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Vererbung - Polymorphie Java Basics - Anfänger-Themen 37
G Polymorphie, Vererbung, statischer Typ, Laufzeittyp Java Basics - Anfänger-Themen 2
D Vererbung / Polymorphie Java Basics - Anfänger-Themen 5
H Polymorphie Verständnisproblem Vererbung/Polymorphie Java Basics - Anfänger-Themen 4
M OOP Polymorphie/Vererbung Verständnisproblem Java Basics - Anfänger-Themen 2
M Vererbung Enum Vererbung/Polymorphie Java Basics - Anfänger-Themen 2
S Polymorphie und Vererbung Java Basics - Anfänger-Themen 6
T Vererbung und Polymorphie Java Basics - Anfänger-Themen 7
Z Vererbung oder Polymorphie? Java Basics - Anfänger-Themen 5
T Beispiel Polymorphie, Tier hund = new Hund(); Java Basics - Anfänger-Themen 3
T Aufruf der Methode einer Oberklasse, wenn sie in der Unterklasse überschrieben ist. Polymorphie. Java Basics - Anfänger-Themen 2
T Polymorphie und LSP Java Basics - Anfänger-Themen 4
KogoroMori21 Polymorphie-Verständnis Java Basics - Anfänger-Themen 5
C Polymorphie-Problem Java Basics - Anfänger-Themen 3
NeoLexx Zuweisungskompatibilität zwischen Vererbungsbeziehungen (Polymorphie) Java Basics - Anfänger-Themen 18
A Polymorphie Java Basics - Anfänger-Themen 4
O Polymorphie Java Basics - Anfänger-Themen 3
J Polymorphie und Dynamisches Binden richtig nutzen Java Basics - Anfänger-Themen 11
K Polymorphie Java Basics - Anfänger-Themen 6
C Polymorphie Was genau ist Polymorphie und wann genau sollte man es verwenden? Java Basics - Anfänger-Themen 9
C Kurze Frage zur Polymorphie Java Basics - Anfänger-Themen 1
J Polymorphie - Beispielcode Java Basics - Anfänger-Themen 7
T Polymorphie Java Basics - Anfänger-Themen 4
C Polymorphie - Erklärung bitte Java Basics - Anfänger-Themen 5
C Polymorphie Java Basics - Anfänger-Themen 1
L Polymorphie Polymorphie verstehen? Java Basics - Anfänger-Themen 2
N Methoden Polymorphie Java Basics - Anfänger-Themen 11
E Polymorphie Beispiel Polymorphie Java Basics - Anfänger-Themen 2
K Polymorphie und instanceOf Operator Java Basics - Anfänger-Themen 6
S Vererbung Objekte in verwandten Klassen (Kovarianz, Polymorphie) Java Basics - Anfänger-Themen 4
R Polymorphie Java Basics - Anfänger-Themen 2
P Polymorphie Java Basics - Anfänger-Themen 6
xehpuk Polymorphie Polymorphie in Parametern Java Basics - Anfänger-Themen 5
H Kleines Problem mit der Polymorphie Java Basics - Anfänger-Themen 2
A OOP Polymorphie Java Basics - Anfänger-Themen 6
2 Interfaces, Polymorphie und Methoden. Java Basics - Anfänger-Themen 14
C OOP Frage zu Polymorphie Java Basics - Anfänger-Themen 4
P Eine Frage begzl. Interface / Polymorphie Java Basics - Anfänger-Themen 11
Y Kleine Verständnisfrage zum Thema dynamische Polymorphie Java Basics - Anfänger-Themen 3
F Verständnisfrage Objekt instanzierung / Polymorphie Java Basics - Anfänger-Themen 10
T Polymorphie:Überschreiben der Methode klappt nicht Java Basics - Anfänger-Themen 4
C Unterschied zwischen Polymorphie und Typcasting Java Basics - Anfänger-Themen 10
S Polymorphie Verständnisproblem Java Basics - Anfänger-Themen 4
J Polymorphie Java Basics - Anfänger-Themen 6
G Polymorphie und Interface Java Basics - Anfänger-Themen 2
S Polymorphie - oder auch spanisches Dorf? Java Basics - Anfänger-Themen 5
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
L Java- Vererbung Java Basics - Anfänger-Themen 4
ineedhelpinjava Vererbung Java Basics - Anfänger-Themen 12
ineedhelpinjava Vererbung Java Basics - Anfänger-Themen 1
I JSON / XML Struktur mit Vererbung / Interfaces Java Basics - Anfänger-Themen 0
M Interface oder Vererbung? Java Basics - Anfänger-Themen 12
M Vererbung Java Basics - Anfänger-Themen 6
M Designentscheidung von Attributen/Methoden im Falle von Vererbung Java Basics - Anfänger-Themen 8
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
A Methoden Vererbung und Interface Java Basics - Anfänger-Themen 14
D Klassen und Vererbung Java Basics - Anfänger-Themen 2
U Vererbung Java Basics - Anfänger-Themen 7
D Vererbung Java Basics - Anfänger-Themen 3
K Schleife berechnet kein Ergebnis (Vererbung) Java Basics - Anfänger-Themen 6
00111010101 Objektorientiertes Programmieren mit Vererbung (Zahlen in Array verschwinden) Java Basics - Anfänger-Themen 3
W Zur Vererbung: Wann und wie? Java Basics - Anfänger-Themen 35
H Datenkapselung, Vererbung und UML Java Basics - Anfänger-Themen 16
districon Super-Stichwort/ Vererbung Java Basics - Anfänger-Themen 3
YaU Vererbung erstellt NullPointerException? Java Basics - Anfänger-Themen 4
1 Vererbung Klassenattribute Java Basics - Anfänger-Themen 9
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
N Thema Vererbung Java Basics - Anfänger-Themen 31
A Vererbung Vererbung Übung Java Basics - Anfänger-Themen 5
B Vererbung - Sichtbarkeitsmodifikation - protected Java Basics - Anfänger-Themen 10
B Best Practice Unschlüssig ob Vererbung oder Interface Java Basics - Anfänger-Themen 2
G Java Vererbung Java Basics - Anfänger-Themen 8
Y Vererbung Konto - Anfangsprobleme Java Basics - Anfänger-Themen 7
A Vererbung Klassen im Bezug auf Auto´s Java Basics - Anfänger-Themen 18
A Klassen Vererbung und zusätzliche Unterklassen Java Basics - Anfänger-Themen 23
M Vererbung mit Enums Java Basics - Anfänger-Themen 8
Kirby.exe Vererbung im Detail erklärt? Java Basics - Anfänger-Themen 9
N Modellierung, vererbung, Java Basics - Anfänger-Themen 163
M Fehlendes Verständnis für dynamische Bindung und Vererbung Java Basics - Anfänger-Themen 13
W OOP Vererbung im Computerspiel Java Basics - Anfänger-Themen 7
J Probleme mit Vererbung Java Basics - Anfänger-Themen 4
I Vererbung Java Basics - Anfänger-Themen 13
W OOP Vererbung und Problem bei Zählschleife in einer Methode Java Basics - Anfänger-Themen 10
W Methoden Verständnisfrage Vererbung von Methoden Java Basics - Anfänger-Themen 14
V Vererbung Java Basics - Anfänger-Themen 2
J Frage zur Vererbung Java Basics - Anfänger-Themen 1
J Vererbung Java Basics - Anfänger-Themen 3
U Was löst meine NullPointerException aus? (Vererbung) Java Basics - Anfänger-Themen 12
O Vererbung Ueben mit kleiner Datenstruktur von Räumen Java Basics - Anfänger-Themen 10
O Umgang mit Vererbung verstehen Java Basics - Anfänger-Themen 4
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
O Vererbung änderung des Konstruktors Java Basics - Anfänger-Themen 8
L Vererbung Java Basics - Anfänger-Themen 5
E HashMap+Vererbung Java Basics - Anfänger-Themen 11
E Vererbung super-Methoden Aufruf Java Basics - Anfänger-Themen 3
B Java Vererbung Fragen (zu Code Beispiel) Java Basics - Anfänger-Themen 3
A Objekterstellung bei der Vererbung Java Basics - Anfänger-Themen 7
P Vererbung Warum funktioniert die Vererbung hier nicht Java Basics - Anfänger-Themen 14
S Vererbung Java mehrfach Java Basics - Anfänger-Themen 10
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben