statische/dynamische bindung

Klausur 23.02.2012 aufgabe 3

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

statische/dynamische bindung
Ich versteh nicht so ganz warum bei gd.f(93) der statische Typ hergenommen wird… laut Folien wird ja bei einer instanzmethode auf den dynamischen typ geschaut.

Kann man sagen das genrell generell dem objekt nur die methoden und attribute des Statischen typs bekannt sind, denn wenn man gd.f(93L) draus macht, geht dies auch nicht da das objekt keine entsprechende methode mit der signatur enthaelt…


Das ist soweit richtig. Der dynamische Typ kommt erst zum Tragen, wenn die entsprechende Methode in diesem (oder „zwischen“ dem statischen und dem dynamischen Typ in der Vererbungshierarchie) überschrieben wird. Dann zählt quasi die letzte Überschreibung.


habe ich das richtig verstanden das wenn B eine unterklasse von A ist,

und man macht sowas:

A ab = new B();
dann ist das dasselbe wie wenn man schreiben wuerde
A ab = (A) new B();.

das heisst der dynamische Typ wird in den statischen cecastet?

und dabei etwas ahnliches passiert wie wenn man z.B. primitive datentypen castet, in dem fall faellt die 0.45 weg, da dem int ja nur die ganzzahlen bekannt sind.

int i = (int) 1.45;

und beim casten von objekttypen faellt praktisch auch alles an methoden und attreibuten weg, die dem objekt in das gecastet wird nicht deklariert sind.


und noch eine Frage, also instanzvariablen sind ja statisch gebunden, warum also wird bei folgendem Code
folgendes Ausgegeben, die variable waere doch statisch gebunden und im statischen typ ist doch der Wert…

EDIT: Ok habs mittlerweile begriffen, entscheidend ist woe die “Zugriffsstelle” ist, da die zugriffsstelle sich in der methode befindet, ist der statiste Typ, Spinne, wuerde man nach der instanziierung direkt auf die variable zugreifen also mit kreuzspinne.anzahlAugen; so waere der statische Typ “tier” das ja spinne nach Tier gecastet. und die zugriffstelle ja “ausserhalb” der methode liegt…

Ich Schwimme
Augen: 2
Ich laufe
Augen: 2
Ich krabbel
Augen: 8

public class aa {

public static void main(String[] args) {
	
	// Teilaufgabe b)
	Tier hai = new Fisch();
	Tier boxer = new Hund();
	Tier kreuzspinne = new Spinne();
	
	hai.bewegung();
	boxer.bewegung();
	kreuzspinne.bewegung();
}

}

class Tier {
int anzahlAugen = 2;

public void bewegung(){
	System.out.println("Ich faulenze");
}

}

class Fisch extends Tier{

public void bewegung(){
	System.out.println("Ich Schwimme");
	System.out.println("Augen: " + anzahlAugen);
}

}

class Hund extends Tier{
public void bewegung(){
System.out.println(“Ich laufe”);
System.out.println("Augen: " + anzahlAugen);
}

}

class Spinne extends Tier{
int anzahlAugen = 8;
public void bewegung(){
System.out.println(“Ich krabbel”);
System.out.println("Augen: " + anzahlAugen);
}

}