# Virtuelle Methode in Java mit R[ckgabewert wie_



## 3Cyb3r (12. Januar 2011)

Hallo,

ich komme von C++ und Programmieren momentan gezwungener Weise mit Java. Soweit so gut ... nun habe ich Probleme bei der Vererbung von Klassen. 

Genauer es gibt in C++ das Schlüsselwort virtual.
Nun soweit ich weiß ist diese in Java total überflüssig denn die Methoden sind "automatisch virtual" ...

Beispiel in C++

```
class Player
{
protected:
  virtual Position do_action(Field const&) = 0;
  //....

public:
  //....
  Player(Type);
};
```

in Java

```
public class Player {
	
	protected Type element;
	protected Position do_action(final Field field);
	
	public Player(Type element) {
		this.element = element;
	}
	
	public final Type getElementType() {
		return this.element;
	}
}
```

Das gibt einen Fehler. Bei void Funktionen geht es ja, aber wie mache ich das bei Funktionnen mit Rückgabewert?

THX mfg^^

EDIT: falls ich mich nicht klar ausgedrückt habe ... ich vererbe diese Klasse:
Deswegen möchte ich auch in der Basisklasse die Funktion ohne ien Rumpf haben.


----------



## AttilaF (12. Januar 2011)

Mittels abstract geht es.
(Aber abstrakte Klassen können nicht instanziiert werden.)


```
public abstract class Player {
    protected Type element;
    protected abstract Position do_action(final Field field);
    //...
```

Gruß Attila


----------



## Matt297 (12. Januar 2011)

Das was du machen möchtest, kannst du mit abstrakten Klassen lösen. Link!

Aber erklär mir mal bitte


> Genauer es gibt in C++ das Schlüsselwort virtual.
> Nun soweit ich weiß ist diese in Java total überflüssig denn die Methoden sind "automatisch virtual" ...


Bzw. bitte erkläre einem C++-Kaum-Kenner mal genau das Schlüsselwort "virtual".

Gruß
Matt


----------



## 3Cyb3r (12. Januar 2011)

Also in C++ gibts ja auch noch abstract^^ oder man schreibt einfach = 0 dahinter. Das Schlüsselwort virtual macht, dass die Einsprungsadresse einer Funktion dynamisch während der laufzeit ermittelt wird, und somit z.B. dann die Methode einer abgeleiteten Klasse aufgerufen wird und nicht die der ursprüglichen (Durch überschreiben der Funktion in der Unterklasse) und ich kann trotzdem noch eine Intanz de Basisklasse erzeugen ... und eine vurtuelle Methode kann zusätzlich noch abstrakt sein, aber dann darfm an sie genau wie in Java noch ncith ausformulieren und kann auch dann keine Instanz der Klasse erzeugen.


----------



## Matt297 (13. Januar 2011)

Ok, das bringt ein wenig Licht in die Sache  Ich hatte zuerst gedacht "virtual" wäre äquivalent zu "abstract", das ist aber anscheinend nicht der Fall.
Dann hast du mit deiner Aussage 'Nun soweit ich weiß ist diese in Java total überflüssig denn die Methoden sind "automatisch virtual"' eigentlich auch Recht. Der Fachbegriff dazu heißt Polymorphie oder auch Late Binding, was das Phänomen eigentlich gut beschreibt. 
Nochmal die Java-Insel .
Wenn du die Basisklasse aber auch instanzieren möchtest, darf sie natürlich nicht abstrakt sein, dann musst du sie aber auch implementieren, sowas wie " = 0" geht nicht.
Natürlich kannst du auch einfach nen leeren Funktionsrumpf bzw. "return null/0;" schreiben. Du kannst auch soweit gehen, dass du ne Exception schmeißt, meinetwegen auch ne eigene, z.B. AufrufVerbotenException 
Ist aber nicht ganz so schön, besser ist dann schon, wenn du Basisklasse abstract ist...

Gruß
Matt


----------

