Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hi, ein paar Fragen:
1) Man sagt, jede Methode in Java sei virtuell. Wird aber eine Methode nicht erst virtuell, wenn man eine zweite Methode mit gleicher Bezeichnung und Parameterliste verfasst?
zu 1) Eine Methode ist virtuell, wenn sie bei Überschreiben ein gewisses Verhalten erzeugt unabhängig davon, ob dieses Verhalten nun schon erzeugt wurde oder nicht.
zu 2) Eine Methode ist abstrakt, wenn sie keinen ANWEISUNGSBLOCK enthält, also GAR KEINE geschweiften Klammern. Das sollte deine weitere Frage beantworten.
Virtuell heißt, dass, wenn diese Methode überschrieben wird, das überschreibende Objekt allerdings in einer Variable vom Typ der Superklasse gespeichert ist und nun diese Methode aufgerufen wird, trotzdem die Überschreibung aufgerufen wird.
Das ist bei allen Methoden in Java so.
Wie genau das in Java gehandhabt wird, weiß ich nicht aber in C++ wird eine Liste aller Überschreibungen erstellt und es muss von Fall zu Fall entschieden werden, welche Methode nun aufgerufen werden soll. Deshalb ist der Aufruf nicht virtueller (in Java finaler) Methoden schneller. Es muss nicht erst die Liste erstellt und in ihr nachgeguckt werden sondern es wird direkt diese Methode aufgerufen.
Die toString() Methode ist ein gutes Beispiel. Hier in Pseudocode:
Java:
public void test(){
ArrayList tmp = new ArrayList();
tmp.add("Test");
sysout(tmp); //Ausgabe: java.util.ArrayList[Test] o.Ä.
}
Danke für die Antworten.
@ QwertSmeik:
zu 1) Um das auf C++ zu übertragen: Soweit ich weiß, muss man vor eine Methode das Schlüsselwort "virtual" schreiben, damit sie virtuell wird. Ohne "virtual" kann man sie nicht überschreiben, mit schon.
In Java dagegen braucht man das Schlüsselwort nicht. Dort lassen sich alle Methoden auch so überschreiben. Deshalb sind in Java alle Methoden virtuell.
Richtig so?
Nicht ganz. Ohne virtual lassen sie sich trotzdem überschreiben, aber wenn man ein Kindobjekt aus einer Variable vom Typ der Superklasse aufruft, wird die Implementierung der Superklasse aufgerufen.
Und voll virtuell werden sie durch virtual und am Ende keine {} sondern = 0 und nicht wie in Java ohne das = 0.
Solange die Methode nicht final ist, lassen sie sich einfach so überschreiben und verhalten sich so, wie virtuelle Methoden in C++. Ist eine Methode in Java final, so kann sie nicht überschrieben werden und ist auch nicht virtuell. Versucht man es trotzdem, so kommt eine Fehlermeldung
Das Ganze gilt natürlich nur für public und protected Methoden. private und Methoden ohne Modifizierer lassen sich immer überschreiben, da sie für Kindklassen nicht sichtbar sind.