Vererbung und Funktionsaufruf

Status
Nicht offen für weitere Antworten.

Corcovado

Bekanntes Mitglied
Hallo,
s sollte ein ziemliches Standardproblem sein mit Vererbung. Ich habe folgende drei Klassen.
derived erbt von base. Dann hab ich eine dritte Klasse in der eine Variable der Basisklasse definiert wird (x):

Code:
//base.java
public class base{
    public base(){}

    public void basefunction(){
	System.out.println("base function");
    }
}

// derived.java
class derived extends base{
    public derived(){}

    public void derivedfunction(){
	System.out.println("derived function");
    }
}

// control.java
class control{
    public control(){}

    public static void main(String[] argv){
	base b = new base();
	b.basefunction();

	derived a = new derived();
	a.derivedfunction();
	a.basefunction();

	//////////// Problem:
	base x = a;
	x.basefunction();
	x.derivedfunction(); // findet die Funktion nicht, warum ??? Gibts Wege das in Java hinzubekommen?
    }
}

Meine Frage:
Ist es moeglich eine Objekt des Typs der Basisklasse zu deklarieren und dann mit dem Konstruktor der abgeleiteten Klasse zu definieren, so dass ich Funktionen, von Basis und von abgeleiteter Klasse aufrufen kann?
Wieso geht is bei mir nicht und wie macht man sowas normalerweise (bitte mit Codezeile)?
Danke
 
R

Roar

Gast
du hast ein objekt x vom typ base. in base gibt es keine methode derivedfunction() darum kriegst du logischer weise einen fehler. java kann doch nicht wissen was in x steckt. für ihn ist es genauso möglich dass da ein objekt vom typ base dri nis und nicht von einer unterklasse. du musst dein x casten:
((derived)x).derivedfuction();
 

Corcovado

Bekanntes Mitglied
nja, dass java das nicht erraten kann, wenn ich ihm nen Object vom Typ "base x" hinschmeisse is mir klar - aber ich dachte, wenn ich das dann schon mit dem Konstruktor von derived() definiere, dann muesste es doch auch zusaetzliche Funktionalitaet von derived dazubekommen?!

Was ist denn dann bitte der Unterschied zwischen:

Code:
base b = new base();
// und 
base b = new derived();

ist das dasselbe, mein Compiler macht jedenfalls beides anstandslos? Ist casten wirklich der einzige Weg das zu machen, sollte man casten nicht eher vermeiden, wie ist das in java (ich habe da so schlechte Erinnerungen an downcasts in C++)?
 
R

Roar

Gast
für java ist 'b' einfach nur ein objekt vom typ "base". ob da nun base oder ferived oder kartoffelsalat dri nist weiß es nicht...
 

Corcovado

Bekanntes Mitglied
...ich hab grad selber festgestellt, das man
Code:
base x = new derived();
x.basefunction();
((derived)x).derivedfunction(); // geht mit cast

base y = new base();	
((derived)y).derivedfunction(); // wirft classCastException

...es ist also nicht dasselbe, aber trotzdem gut geraten ;) danke
Ich will aber nun nicht jedes mal wenn ich eine Funktion der abgeleiteten Klasse hernehmen will, explizit casten,
kann ich x nicht dauerhaft zu einem Objekt der derived Klasse machen?

Wenn ich es so versuche:
Code:
	x = ((derived)x);
	x.derivedfunction(); // geht nicht: Fehlermeldung !!!

In meinem eigentlchen Problem handelt es sich darum, dass ich nen Vektor hab (Vector a) und ich habe eine Klasse von Vector abgeleitet (myVector b), in den andern Klassen deklariere ich eben zunaechst klassenweit Vector-Objekte, die ich dann konkret in den wiederum davon abgeleiteten Klassen immer als myVector benoetige, also gerne im konkreten Konstruktor auf myVector dauerhaft casten will? (das Bsp sollte nur zur Erlaeuterung dienen, wenns unverstaendlich is isses auch egal, die Antworten auf die obige Situation sind dieselben.)
 

Illuvatar

Top Contributor
Du könntest
Code:
derived dx = (derived)x;
schreiben.
Wenn du testen willst,, ob ein Objekt von einem Typ ist, nimmst du übrigens den instanceof-Operator:
Code:
base b = //methode um objekt zu kriegen
b.basefunction();
if (b instanceof derived){
 ((derived)b).derivedfunction();
}
Und noch eine Anmerkung: Laut einer Konvention sollte man Klassennamen immer groß schreiben. Also Base, Derived und Control.
 

Corcovado

Bekanntes Mitglied
Hallo
Klassen immer gross und "instanceof" zum Typ pruefen !!! OK, danke, ich werds mir merken und glaube ich muss noch einiges lernen :rolleyes:

Das obige ist schon irgendwie klar aber ich habe trotzdem noch folgende Frage :
Code:
...
	Base x = new Derived();
	x.basefunction();
	((Derived)x).derivedfunction();  // funzt
	x.derivedfunction(); // funzt nicht, da nicht permanent gecastet - Problem !!
	
	// ... also wie schaffe ich es, dass x nun permanent den Typ von Derived annimmt und nicht mehr Base ist ???

	x = (Derived)x; // Methode 0: funzt nicht ??!!!! - hab ich etwas falsch gemacht ?

	Derived w = (Derived) x; // Methode 1: dann heisst aber das Objekt w und eben nicht mehr x (wie ich es gerne haette)
	w.derivedfunction(); // geht jetzt (mit w halt)

	// todo: Methode 2: ???
        //was ich ausgeben will ist das hier :
	x.derivedfunction();   // aber es geht nicht
...

in Worten:
Wie schaffe ich es einen Typ eines (eigenen) Objektes dauerhaft umzucasten ?

Ich glaube in C++ war das Typumcasten ein Fall von reinterpret_cast<> und das Downcasten ein Fall von dynamic_cast<>
Vielleicht hat ja jemand schon mal das Problem gehabt in JAVA...
 
B

Beni

Gast
Du musst eine neue Variable anlegen:

Code:
Base x = new Derived();
Derived y = (Derived)x; // x sollte ein Derived sein, sonst krachts :-)
y.derivedfunction();

Alles andere geht nicht. Denn während das Progi läuft, wird der Typ der Variable angeschaut (der unveränderbar ist), nicht der Typ des Objektes, welches dahintersteht.
 

Bleiglanz

Gesperrter Benutzer
man sollte lernen, zwischen dem Typ einer Variablen (zur Compilezeit, für javac) und dem Class-Objekt, das jeder Objektinstanz zugeordnet ist (zur Laufzeit) zu unterscheiden

Wenn irgendwo steht

Ober x = new Unter();

dann wird zur Laufzeit ein Objekt erzeugt (mit class = Unter); dieses kann NICHT "umgecastet" werden, es behält IMMER seine "Klassigkeit", bis es irgendwann entsorgt wird

dass die Variable x den Typ "Ober" hat, lässt sich ebenfalls NICHT mehr ändern, x kann aber Objektreferenzen auf Objekte enthalten, die zum Typ "Ober" passen...

mit Unter y = (Unter) x kann man runtercasten, aber dazu braucht man eine neue Variable....

Casts dienen also nur dazu, zur Laufzeit "Objektinstanz-Referenzen" in die richtigen "Variablen" reinzulegen, weder am Typ von Variablen noch an der "Class" von Objektinstanzen ändert sich jemals etwas
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
M Vererbung - Polymorphie Java Basics - Anfänger-Themen 37
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
A Klassen Vererbung privater Methoden und Member Java Basics - Anfänger-Themen 12
A Konstruktoren Vererbung Java Basics - Anfänger-Themen 3
ReinerCoder Vererbung von JFrame in einer Klasse entfernen Java Basics - Anfänger-Themen 5
W Vererbung, abstract und Konstruktoren Java Basics - Anfänger-Themen 30
J Vererbung und Methodenaufruf Java Basics - Anfänger-Themen 11
G Polymorphie, Vererbung, statischer Typ, Laufzeittyp Java Basics - Anfänger-Themen 2
H Vererbung mit private instanzvariablen Java Basics - Anfänger-Themen 9
S Vererbung Funktionsweise Code zur Vererbung Java Basics - Anfänger-Themen 1
C Methoden Vererbung private Attribute/public Methoden Java Basics - Anfänger-Themen 4
S Verständnis Vererbung Java Basics - Anfänger-Themen 3
D JavaFX Vererbung Java Basics - Anfänger-Themen 2
U Vererbung Generizität und Vererbung Java Basics - Anfänger-Themen 4
A Vererbung bei Klassen mit Objekt der Klasse im Konstruktor Java Basics - Anfänger-Themen 4
K Vererbung Octagon von Circle Java Basics - Anfänger-Themen 0
B Hilfe bei Vererbung Java Basics - Anfänger-Themen 2
D Vererbung Frage zum Klassenaufbau mit Vererbung Java Basics - Anfänger-Themen 1
T Vererbung und interface. Java Basics - Anfänger-Themen 1
S Gehaltsberechnung (Vererbung, abstrakte Methoden) Java Basics - Anfänger-Themen 6
S Vererbung Java Basics - Anfänger-Themen 1
F Vererbung in zwei Richtungen? Java Basics - Anfänger-Themen 14
D Vererbung / Polymorphie Java Basics - Anfänger-Themen 5
O Vererbung Java Basics - Anfänger-Themen 5
MiMa Vererbung Theorie OK, Praxis ?? Java Basics - Anfänger-Themen 4
Arif Vererbung Vererbung Variablen überschreiben Java Basics - Anfänger-Themen 1
C Vererbung - Ausgaben bestimmen Java Basics - Anfänger-Themen 6
S Vererbung Java Basics - Anfänger-Themen 10
L Setter und Getter/Vererbung Java Basics - Anfänger-Themen 6
C Konstruktoren und Vererbung Java Basics - Anfänger-Themen 2
J Kleinere Frage zur Vererbung/Objekterzeugung Java Basics - Anfänger-Themen 2
G Vererbung Java Basics - Anfänger-Themen 12
J Vererbung privater Variablen Java Basics - Anfänger-Themen 7
J Vererbung Vererbung von Methoden Java Basics - Anfänger-Themen 6
B Vererbung Java Basics - Anfänger-Themen 12
K Vererbung (super) Java Basics - Anfänger-Themen 2
A ArrayQueue mit Exceptions und Vererbung Java Basics - Anfänger-Themen 3
J Java: static bei Vererbung Java Basics - Anfänger-Themen 5
C Vererbung Java Basics - Anfänger-Themen 4
L Vererbung Java Basics - Anfänger-Themen 3
J Klassenorganisation | Vererbung Java Basics - Anfänger-Themen 1
B Vererbung Vererbung Java Basics - Anfänger-Themen 2
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
A Benötige Hilfe bei Vererbung Java Basics - Anfänger-Themen 1
M Anfängerprobleme mit Vererbung Java Basics - Anfänger-Themen 27
J Vererbung Java Basics - Anfänger-Themen 9
F Vererbung von Attributen zwischen zwei Klassen Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben