Mensch und Maschine
Willkommen auf » Allgemein

Ein entscheidender Nachteil von JAVA sei, so höre ich viele Entwickler-Kollegen lästern, dass es keine Mehrfachvererbung beherrsche.

Heute möchte ich das verständlich widerlegen, damit ich nur noch Links zu nennen brauche, auf die jeder dann mit seinem iPhone wandern, die Antwort durchlesen kann und ich meine Zeit nicht mit Wiederholungen verschwende ;)

Die beispielhaften Basisklassen A und B:

class A{
public void getA(){...}
}
class B{
public void getB(){...}
}

Will man nun eine Klasse C schreiben, die A und B erweitert,
erhält man eine Fehlermeldung vom Compiler.

class C extends A,B{
...
}

Klasse C würde in C++ so aussehen:

class C extends A,B{
public void getA(){...}
public void getB(){...}
}

Der Grund, warum JAVA Mehrfachvererbung verbietet, liegt darin, dass eine Mehrdeutigkeit entsteht, wenn man folgende Änderungen an Klasse A und B vornähme:


class A{
public void getA(){...}
public void getX(){...}
}
class B{
public void getB(){...}
public void getX(){...}
}

Klasse C in C++ :

class C extends A,B{
public void getA(){...} //A.getA()
public void getB(){...} //B.getB()
public void getX(){...} //A.getX()
public void getX(){...} //B.getX()
}

Eine Klasse C, die A und B erweitert, müsste sich nun “entscheiden”, welche der beiden getX()-Methoden aufgerufen werden soll – die von A oder die von B ?

Das ist ein Problem.

In C++ ist Mehrfachvererbung erlaubt. Dort wird das Mehrdeutigkeitsproblem entweder so gelöst, dass man explizit angibt, welche Basisklasse genutzt werden soll. Oder aber man bedient sich komplizierter und m.E. unsauberer virtueller Klassen.

JAVA will durch das Verbot solcher Szenarien grundlegend sauberen Code sicherstellen und potentiell schwer auffindbare Fehler vermeiden.

Man kann sich jedoch helfen!

Man könnte z.B. Klasse B so verändern, dass sie von A erbt:

class A{
public void getA(){...}
public void getX(){...}
}
class B extends A{
public void getB(){...}
public void getX(){...}
}
=>
class C extends B{
public void getA(){...}
public void getB(){...}
public void getX(){...} //B.getX
}

Klasse B überschreibt die getX()-Methode von A. C kann also nur noch auf die getX()-Methode von B verweisen.
Damit ist die Eindeutigkeit des Codes gewährleistet.

Die “fehlende” Mehrfachvererbung entpuppt sich somit als a) sehr wohl vorhanden und b) als sehr vorteilhaft:

  • man wird gedrängt, die Vererbungshierarchie besser zu planen
  • die Klassenstruktur wird übersichtlicher
  • man muss Methoden einer Klasse feiner aufteilen
  • dadurch enthält jede einzelne Klasse weniger Code
  • dadurch wiederum steigt die Wartbarkeit des Codes
  • man erhält mehrere Klassen, die man modular in anderen Projekten einsetzen kann
  • es lassen sich wesentlich komplexere Vererbungshierarchien erzeugen, die jedoch stets übersichtlich bleiben

Alles in Allem ist die “Strukturierte Mehrfachvererbung”, wie ich sie mal nennen will, in JAVA eine feine Sache und sollte von jedem Entwickler, ob der eigenen Fehleranfälligkeit, mit offenen Armen empfangen werden.


nKrebs

Ab jetzt werden neue artikel automatisch unter meinem twitter account nico_krebs gepostet. Zusätzlich könnt ihr über den Twit This button meine Artikel über euren eigenen Twitter-Account verbreiten :D is das nich toll? Großartig find ich das! nutzt dieses Spielzeug, Leute! macht auch ne menge spaß und is total modern!

na los, klick und losgetwittert :D

__

nicoK

Die Drucken-Taste, oder auch S-Abf oder SysRq benannt, ist ein Überbleibsel aus vergangenen Fernschreiber-Zeiten. (s. Wikipedia)

Das tolle heute daran ist jedoch, dass man Linux-Systemstillstände, z.b. durch schwere Hardwarefehler verursacht, sicher zu Ende bringen kann.  Unter Windows hat die Taste keine Bedeutung mehr – schade eigentlich.

“Sicher” bedeutet hier, dass die Daten aus dem RAM zurück auf die Datenträger geschrieben werden.

Dafür gibt es eine ganze Reihe von Befehlen:

alt gr + print +…
b immediate reBoot
d Display all locks
k Kill all Prozesses of current console
e send sigterm to all processes Except init
m Memory info
o shut Off system
r switch keyboard from Raw Mode
u Unmount all filesystems read only
i send sIgkill to all processes

s syncs all mounted filesystems

Das Akronym “REISUB” bedeutet einen sicheren Reboot.

Ich werde das hier nicht erläutern, die Liste spricht für sich selbst :)

Die Ausgaben der einzelnen Kommandos kann man nur auf dem Terminal sehen. Mit Alt+Strg+F1 kommt man auf das erste Temrinal, mit Alt+Strg+F2 auf die Zweite usw. bis F7, mit der man, soweit vorhanden, auf die graphische Benutzeroberfläche gelangt.

nicoK

Linux: Help->About->Installation Details

Mac OS X: Eclipse->About Eclipse->Installation Details

Ferd Bauer

Ferd Bauer

http://blog.plurk.com/2009/12/14/microsoft-rips-plurk/

All denjenigen, die, wie ich, nur selten mit purem PHP entwickeln und sich jedesmal am Kopf kratzen, wenn es darum geht zu wissen, wie der verdammte Befehl heißt, mit dem man einen REDIRECT ausführen kann, soll geholfen werden:

HEADER(“location:http://www.mensch-und-maschine.de”);

zu beachten ist:
Vor dem Aufruf darf nichts ausgegeben werden. also kein echo, kein print_r etc. verwenden.

Dasselbe bekommt man per HTML mittels META Refresh hin:

<html>
<head>
<meta http-equiv="refresh" content="2;url=http://www.yoursite.com/newpage.htm" />
<title>Page has moved</title>
</head>
<body>
</body>
</html>

Ausblick von meinem Balkon

Dresden, Zschertnitz, 11. Stock, Osten, Morgens, 6:30

Bitte draufklicken :)

aussicht dresden sonnenaufgang elbtal richtung sächsiche schweiz prohlis

aussicht dresden sonnenaufgang elbtal richtung sächsiche schweiz

Mal wieder eien Erkenntnis aus der Eclipse-Welt:

Wer unter Linux den JAVA-Debugger anwirft und sich wundert, dass im Variablen-Fenster keien Variablen angezeigt werden bzw. nicht aufgeklappt werden können, der sollte im Dialog Windows-> Preferences unter Java->Installed JREs die “gjc” Variante von JAVA deaktivieren bzw zu einer anderen wechseln. Sollte keine weitere verfügbar sein, kann per sudo apt-get install sun-java6-jdk der sudo apt-get install sun-java5-jdk eine passende Version installieren.

Viele Grüße,

–kdot

Wer glaubt, des Gute könne nicht existieren, ohne dass es das Böse gibt, irrt: Es genügt zu wissen, wie sich Böses definiert um einen Maßstab zu erhalten.

–kdot