Java: Statischer vs. Dynamischer Typ

Beim Thema Vererbung ist man schnell mal verwirrt, vor allem wenn sich da auch Statische Methoden reinmischen. Zur klarstellung sollte man sich verdeutlichen, was der Unterschied zwischen dem statischen und dem dynamischen Datentypen einer Variable ist.  Dies hier ist die formale Beschreibung:

  • Statischer Typ: Ist der Typ einer Variablen, die bei der Variablendeklaration angegeben sind. Dieser Typ ist bei der Kompilierung schon bekannt.
  • Dynamischer Typ: Ist der Typ einer Variable, welcher erst zur Laufzeit bekannt ist und kann vom statischen Typen abweichen; Ist der Typ vom Wert der Variable: d.h. der “echte” Typ der Klasse.

Für einfacheres Verständnis hier ein Beispiel; Zunächst unsere Klassenhierarchie:

public class A {
	public static int x = 0;

	public static String name() {
		return "Klasse A: name";
	}

	public String method() {
		return "Klasse A: method";
	}
}

public class B extends A {
	public static int x = 42;

	public static String name() {
		return "Klasse B: name";
	}

	@Override
	public String method() {
		return "Klasse B: method";
	}
}

Und zum Ausführen machen wir uns noch eine Main Methode:

public class Main {
	public static void main(String args[]) {
		B v1 = new B();
		System.out.println(v1.x); // 1
		System.out.println(v1.name()); // 2
		System.out.println(v1.method()); // 3

		A v2 = new B();
		System.out.println(v2.x); // 4
		System.out.println(v2.name()); // 5
		System.out.println(v2.method()); // 6
	}
}

 

Was ist nun die Ausgabe? Überlege zuerst selbst 🙂

42
Klasse B: name
Klasse B: method
0
Klasse A: name
Klasse B: method

Was passiert hier?

Obwohl es eigentlich keine Sinn macht über eine Variable auf ein Statische Methode oder Attribut zuzugreifen, kann man es trotzdem. Normal sollte man direkt über Klassenname.Variable zugreifen. Bei 1 & 2 & 3 passiert alles so, wie man es von Java gewohnt ist. Die Methoden “name” & “method” wird in B überschrieben (Overriding), deswegen greifen wir auch auf die Definitionen der Methoden in B zu, obwohl die gleichen Funktionen auch in A bestehen. Der dyn. & stat. Typ von der Variable ist immer B.

Interessant wird es bei Nummer vier. Obwohl wir ein Objekt vom Typen B mit new definiert haben, wird trotzdem die Statische Methode von der Klasse A aufgerufen. Der statische Typ der Variable v2 ist in dem Falle A. Der dynamische Typ ist B, da das der Typ ist, der bei new aufgerufen wurde. D.h.: Wir haben eine Variable v2 vom Typen A, welche allerdings auf ein Objekt vom Typen B zeigt.

Man kann also sagen: bei normalen, nicht statischen Methoden, wird der Dynamische Typ verwendet; bei statischen Methoden/Attributen wird der Statische Typ verwendet.

Diese Unterscheidung wird nicht immer in diesem Kontext verwendet, denn oft ist die Bedeutung von statischen/dynamischen Typen in Lehrbüchern eine andere. Statische Typisierung bezeichnet eine Fixe Zuordnung einer Variable zu einem Typen, dynamische Typisierung bedeutet, dass eine Variable viele Verschiedene Typen annehmen kann. Java gehört demnach eigentlich zu Gruppe der Statischen Programmiersprachen, hingegen etwa PHP zu den der Dynamischen. Die Grenzen zwischen diesen Gruppen verfließen allerdings durch Vererbung, Type casting und Late binding. 

Da die Terminologie auch nicht eindeutig ist, ist man schnell mal verwirrt, was jetzt “statisch” bzw. “dynamisch” wirklich bedeutet. Am besten ist es einfach ein paar Beispiele zu schreiben und diese auszuprobieren 😉

 

 

Published by

Kordian Bruck

I'm a TUM Computer Science Alumni. Pizza enthusiast. Passionate for SRE, beautiful Code and Club Mate. Currently working as an SRE at Google. Opinions and statements in this blog post are my own.

Leave a Reply