Re(5): Java-Dau-Anfängerproblem...
Geizhals » Forum » Programmierung » Java-Dau-Anfängerproblem... (63 Beiträge, 281 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
Java-Dau-Anfängerproblem...
11.07.2005, 13:50:53
Hi, Folks !

Habe mich in letzter Zeit wieder besseren Wissens in Java eingearbeitet...
Und hab' grad ein Micky-Maus-Prob:


public class Vater {

protected Vater() {}

public static boolean add ( int x ) {
return true;
}
}

public class Sohn extends Vater {

public static void main(String[] args) {
Sohn s = new Sohn();
Sohn.add(2);
}

public static int add ( int x ) {
return x;
}
}

---> Das ist nicht erlaubt - er motzt, weil die Methode add bei gleichen Parameter in Vater einen anderen Rückgabewert liefert als in Sohn...

Also in c++ wäre das erlaubt ;-).

Wozu braucht ma des ?

Also als Java-Laie dachte ich mir das wie folgt (und mußte daher schon viel umschreiben):
Es gibt eine Klasse Person - mit private-Gschichtln wie Zuname, Vorname, Gebdatum, ...
Person habe einen protected-Constructor - damit niemand selbst eine Person anlegen kann. Stattdessen gibt es eine Klassenmethode
> public static Person add(String Zuname, String Vorname, GregorianCal... GebDatum) - die zuerst mal nachsieht (in einem HashSet), ob es die Person schon gibt. wenn es sie gibt, liefert sie die bekannte Person zurück - wenn nicht, legt sie eine neue an und liefert die zurück. Grund: Auf diese Art will ich doppelte Personen vermeiden.

von Person gibt es eine abgeleitete Klasse Personal: sie hat dieselben Gschichtln wie Person - plus Job/Funktion, ...
Sie hat wieder einen protected Konstruktor - gleicher Grund wie bei Person.
Personal habe eine Reihe von Klassenmethoden "add"  -
so auch ein
> public static Personal add(String Zuname, String Vorname, GregorianCal... GebDatum)
---> Und genau da fetzt diese "$&%"!! Java-VM - eben wegen dem Rückgabewert von add().

Mir ist das ja komplett unklar...
Erstens sprech' ich hier von Klassenmethoden - also nix mit VMT. Irgendeine ominöse Forderung, warum das verboten sei in sauberen Design will noch nicht in meinen kleinen Schädel.
Zweitens ist mir der Workaround unklar...
Person::add() private machen nutzt auch nix - wieso net ???
Drittens scheint ein Object zurückliefern zwar als möglich aber bescheiden - denn jeder Aufrufende muß dann casten bzw. ein instanceOf scheint problematisch...
EDIT:
Viertens bin ich jetzt auf ein addPerson(), addPersonal(), ... ausgewichen - nur das ist ja auch besch*en... denn wozu sollte jede Klasse dann Trilliarden vererbter Methoden mitführen müssen ?

Ach ja, das bequeme Äquivalent in C++, das funktioniert:
class vater {
        public:
        static int add(int x);
};

int vater::add(int x)
{
        return 2;
}

class sohn: public vater
{
        public:
        static float add(int x);
};

float sohn::add(int x)
{
        return 2.3f;
}

int main() {
        sohn *s = new sohn();
        float f = s->add(2);
}



So oder so - ich denke wahrscheinlich zu C++-lastig...
wie macht man das sauber in Java ? Und /was/ ist der Hintergedanke von dieser IMHO stupiden, sinnlosen Limitierung ???

cu
ein frustrierter gepeinigter

11.07.2005, 14:10 Uhr - Editiert von gepeinigter_aon_neukunde, alte Version: hier
Antworten PM Alle Chronologisch
 
Melden nicht möglich
.  Re: Java-Dau-Anfängerproblem...  (Frankster am 11.07.2005, 14:07:47)
...  Re(3): Java-Dau-Anfängerproblem...  (Frankster am 11.07.2005, 14:19:36)
.....  Re(5): Java-Dau-Anfängerproblem...  (Frankster am 11.07.2005, 15:06:11)
.  Re: Java-Dau-Anfängerproblem...  (DeaconFrost am 11.07.2005, 17:13:42)
...  Re(3): Java-Dau-Anfängerproblem...  (DeaconFrost am 12.07.2005, 12:09:04)
.....
Re(5): Java-Dau-Anfängerproblem...
12.07.2005, 13:29:44
Zur Übersichtlichkeit: Ich kann deine Probleme voll nachvollziehen. Das Problem ist IMHO, dass Java zwar eine sehr ähnlich aussehende Syntax hat, aber vom Konzept her komplett verschieden zu C++ ist. Deshalb sind C++-Kenntnisse beim Java lernen auch oft hinderlich.
Etwas ähnliches wie Templates gibt es bereits. Ist in Java 5 neu hinzugekommen und nennt sich Generics.
Includes sind in Java nicht nötig, da es keine Header-Dateien gibt. Grundsätzlich ist jede (sichtbare) Klasse über ihren vollqualifizierten Namen erreichbar (z.B.: packet.subpacket.MeineKlasse). Ein Header einzubinden ist daher nicht nötig. Damit nicht immer der vollqualifizierte Name verwendet werden muss, kann man das import-Statement verwenden.
Sowas wie friends gibt's in Java auch. Es handelt sich um die Pakete. Ich darf innerhalb eines Pakets auf alle, außer auf private deklarierte Methoden & Felder zugreifen. Das heisst, dass alle Klassen innerhalb eines Pakets "friends" sind. Nur der Vollständigkeit halber: Es gibt 4 versch. Sichtbarkeiten: public, protected, private und package-default (dafür gibt's kein Schlüsselwort, sondern einfach nichts schreiben). Klassen selbst können nur public oder package-default sein.

Zu private:
Ich denke, du hast Recht. Eigentlich dürfte add dann in der Kind-Klasse auch protected oder public sein. Ich bin mir da aber ehrlich gesagt unsicher, weil es sich eben um statische Methoden handelt. Da kann es anders geregelt sein, als bei den normalen Methoden. Bei normalen Methoden wäre ich mir sicher, dass privates in der Kind-Klasse ohne Probleme überschrieben werden dürfen (aus den genannten Gründen).

Danke fürs Bier! Ich bin halt etwas übervorsichtig was mögliche Missverständnisse anbetrifft. Ich wollte lediglich sichergehen, dass du das nicht als meine Erfindung missverstehst...

Zu virtual:
In C++ ist es tatsächlich so, dass virtuelle Methoden immer mehr Zeit kosten als nicht-virtuelle. Grund ist, dass C++ statisch übersetzt wird und Objekte der Kindklasse möglicherweise immer präsent sind. Deshalb gibt's ja auch das Schlüsselwort und es ist schon sinnvoll, sich das für die jeweilige Methode zu überlegen.
Bei Java liegt der Fall anders. Die Virtual Machine weiss, welche Klassen präsent sind. Und beim dynamischen übersetzen (Just in time) wird davon auch Gebrauch gemacht. Wenn virtuelle Methoden nicht nötig sind (weil noch keine Kindklassen geladen wurden), dann ist der JIT-Compiler so schlau diese auch direkt, anstatt über eine VMT zu verlinken.
Übrigens: Alle wissenschaftlichen Arbeiten über Performance-Optimierung die ich kenne haben eine Grundaussage. Vorzeitige Performance-Optimierung ist die Quelle alles Bösen ;-)
Denn im Endeffekt liegt der Flaschenhals immer nur an wenigen Stellen, an denen man sie vorher eh nicht vermuten würde. Deshalb als general rule: Immer nachher messen und dann optimieren.

Antworten PM Alle Chronologisch Zum Vorgänger
 
Melden nicht möglich
.......  Re(7): Java-Dau-Anfängerproblem...  (DeaconFrost am 12.07.2005, 14:28:09)
.........  Re(9): Java-Dau-Anfängerproblem...  (DeaconFrost am 12.07.2005, 15:11:21)
.  Re: Java-Dau-Anfängerproblem...  (adhoc am 13.07.2005, 12:03:34)
...  Re(3): Java-Dau-Anfängerproblem...  (adhoc am 13.07.2005, 13:31:54)
...  Re(3): Java-Dau-Anfängerproblem...  (adhoc am 13.07.2005, 13:40:48)
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung