Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

11

06.05.2011, 12:42


Also das Wichtigste was mir auffiel war eher die durchgehende Verwendung von Referenzen, das Fehlen von Pointern (speziell Funktionspointer) und die Garbage-Collection.

Fürs Studium (jedenfalls bei uns) so gut wie Unwichtig. Bei uns sind Pointer böser Hokus Pokus mit dem Java Schluss gemacht hat.

Mag ja für's Studium unwichtig sein (ist es mMn trotzdem nicht, denn eine Referenz ist eben was anderes als eine Kopie, das ist wichtig zu wissen), aber für einen Umsteiger aus C++ ist das sicherlich der Unterschied, der als erstes wichtig ist.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Fred

Supermoderator

  • »Fred« ist der Autor dieses Themas

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

12

06.05.2011, 14:56

Also vielen Dank schon einmal für eure zahlreichen Antworten und Hilfen.Das bringt mich auf jeden Fall schon einmal eine ganze Ecke weiter.
Meine Meinung vopn Java ist momentan eher negativ als positiv. Zum einen begrüßt es mich gleich mal damit, dass ich Dateien mit dem Klassennamen abspeichern muss(gut das ist jetzt nicht so schlimm, aber dass ich dazu gezwungen werde, ist schon etwas bösartig^^). Zum anderen missfällt mir irgendwie, dass mich Java so an die Leine nimmt. Operatorenüberladung gibt es nicht, weil du damit böse Sachen machen könntest. Mit Pointern lassen wir dich auch nicht beliebig rumexperimentieren, du sollst ja nichts kaputt machen. Objekte sind immer Referenzen. Mit Call-By-Value und Call-by-Reference würdest du nur durcheinander kommen. Außerdem halte ich Java schon für ein bisschen inkonsistent. Die Basis-Datentypen werden nur als Kopie weitergegeben. Alle Klassen nur als Referenz. Wenn man Referenzen auf Basistypen braucht, nimmt man die entsprechende Klasse. Also irgendwie wirkt das auf mich etwas verkompliziert. Da lobe ich mir ein C++, bei dem ich selbst entscheide, wann ich eine Kopie und wann ich eine Referenz nutze.
Aber gut nun werde ich mich wohl noch ein bisschen mit Java anfreunden können und mit der Zeit wird es schon klappen :).

Eine Frage, die sich mir noch stellt: Gibt es überhaupt die Möglichkeit so etwas, wie die Kopie eines Klassenobjekts anzulegen oder geht das gar nicht? Also wäre dann eine angelegte Kopie unabhängig von dem anderen Objekt oder letztlich auch nur eine Referenz?

EDIT: Ach ja ich finde das, was Blue-Cobold sagte schon auch wichtig. Denn im Grunde ist das ja schon ein sehr essenzieller Unterschied zwischen Java und C++. Im Studium ist das natürlich weniger wichtig, weil Java eben meinen Müll aufräumt und Pointer gibt es nicht. Aber als Umsteiger von C++ fällt es mir natürlich schon auf ;).

13

06.05.2011, 15:05

Object.clone() bzw. das Cloneable interface http://download.oracle.com/javase/1.4.2/…ct.html#clone()
Die selbst auferlegten Grenzen von Java sind IMO übrigens auch eine Stärke, da so Code oft wartbarer und besser lesbar ist. Wenn man mit Java arbeitet muss man sich auf den Rahmen (Call-by-Value nur bei primitiven Datentypen und so) einlassen, sonst macht es keinen Spaß. Durch die Eingrenzungen kann man sich IMO aber wesentlich besser auf die Softwarearchitektur konzentrieren und braucht nicht an low-level Kram, abgefahrene Sprachfeatures oder unspezifiziertes Verhalten denken. C# finde ich da zum Beispiel schon wieder an der Grenze zur Featuritis. Und C++ ist mir einfach zu komplex und fehleranfällig, auf C++ Entwicklung hab ich daher eigentlich keine Lust mehr. Der Zwang mit dem Klassenname=Dateiname finde ich übrigens eines der besten Sachen an Java. Nested Classes finde ich fast immer unangenehm und durch diesen Zwang weiß man bei Fremdbibliotheken eigentlich immer wo was zu finden ist. Man kann schon im Explorer feststellen wie eine Bibliothek aufgebaut ist - das ist doch einfach nur angenehm.

Achja bei Swing Oberflächenentwicklung solltest du auf jeden Fall einen guten GUI Editor nutzen, sonst ist das ziemlich umständlich. Netbeans hat da was nettes...

Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von »Chromanoid« (06.05.2011, 15:24)


drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

14

06.05.2011, 17:31


Also das Wichtigste was mir auffiel war eher die durchgehende Verwendung von Referenzen, das Fehlen von Pointern (speziell Funktionspointer) und die Garbage-Collection.

Fürs Studium (jedenfalls bei uns) so gut wie Unwichtig. Bei uns sind Pointer böser Hokus Pokus mit dem Java Schluss gemacht hat.

Mag ja für's Studium unwichtig sein (ist es mMn trotzdem nicht, denn eine Referenz ist eben was anderes als eine Kopie, das ist wichtig zu wissen), aber für einen Umsteiger aus C++ ist das sicherlich der Unterschied, der als erstes wichtig ist.

Finde ich auch recht wichtig. Weil man sich sonst schnell mal frägt warum denn jetzt der String sich dort auch verändert und nicht nur an einem anderen Ort.


... und falls du die Build-In Types doch mal als Referenz rumreichen willst, nimm ihre abstrahierten Äquivalente - Integer, Float usw. (diese sind teil der Standardbibliothek).

Das könnte man meinen, ja. ;)
Aber Integer sind (und mir ist der Name dafür entfallen, in Eiffel wäre das expanded) speziell, da sie doch kopiert werden.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args) 
    {
        Integer n = 1;
        foo(n);
        System.out.println(n); // 1 und nicht 2
    }
    
    public static void foo(Integer n)
    {
        n = 2;
    }

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

15

06.05.2011, 17:32

Strings sind immutable, drakon :P Aber ja, bei anderen Objekten stimmt das natürlich.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

16

06.05.2011, 17:46

Damn. Stimmt.. ^^
Da merkt man mal wieder wie wenig man eigentlich Strings manipulieren muss. (immutable Objekte sind btw. in Objective-C breit durchgezogenes Paradigma auch bei Container)

Ich finde Java eigentlich durch die Einfachheit, die es hat auch immer mal wieder nett, auch wenn gewisse Sachen mich ein wenig nerven. Aber da es einem einige Entscheidungen abnimmt macht es das Programmieren wirklich grundsätzlich einfacher.

@Fred
Ich habe Java auch erst während dem Studium gelernt und das eigentlich Grösstenteils mit learning by doing gemacht. Da in Java ja eher etwas nicht geht, als dass man es falsch machen könnte. Und die Sachen, die ich gesucht habe, habe ich dann halt übers Internet oder mit dem Insel Buch gemacht. Vor allem das Streaming Zeugs (z.B InputStreamReader usw.) sollte man mal nachlesen.
Grundsätzlich fehlt ja in Java das, was man von C++ her kennt und dann stösst man automatisch auf die Lösungen, welche gängig sind, wenn man es sucht. Und der Rest ist halt eher Library abhängig und die muss man einfach mal verwenden und dann separat nachlesen.
An was man sich imo ein wenig gewöhnen muss ist, dass man eher mehr Klassen hat, als mit C++, wo man einiges anders lösen kann, wo man in Java einfach eine neue Klasse macht.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

17

06.05.2011, 18:02

Jop, learning by doing + google war für mich auch ausreichend, zum Glück hält sich der Javagebrauch in meinem Studium sehr in Grenzen, ansonsten würd ich wohl wahnsinnig werden ;)

denjo

Treue Seele

Beiträge: 163

Wohnort: BLB

  • Private Nachricht senden

18

06.05.2011, 18:18

Also muss man, da Java für den Typ string die Klasse String bereitstellt, für strings auch bspw.

C-/C++-Quelltext

1
String foo = "foo"; foo.equals("bar")

schreiben, anstelle von einem simplen Vergleich á la foo == "bar".
Das ist so nicht ganz richtig, denn

C-/C++-Quelltext

1
if(foo == "bar")

bringt false und

C-/C++-Quelltext

1
if(foo == "foo")

bringt true!

Java vergleicht beim "==" von Objekten die Referenz und String-Objekte werden von der Laufzeitumgebung nur einmal angelegt. Das heißt foo mit dem Inhalt "foo" zeigt auf die gleiche Referenz wie das "foo" im Vergleich. Hinter "foo" liegt zur Laufzeit auch wieder ein String-Objekt, da Strings mit den gleichen Zeichen aber nur einmal von der Laufzeitumgebung angelegt werden, besitzen sie die gleiche Referenz. Darum klappt der ist gleich-Vergleich.

Um immer auf ein korrektes Ergebnis zu hoffen sollte man aber natürlich die .equals() Methode am String verwenden.
"Irren ist menschlich, Vergeben göttlich."
- Alexander Pope -

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

19

06.05.2011, 19:14

Stimmt, mangelhaft ausgedrückt, verzeih.
Trotzdem ist das mit der fehlenden Operator Überladung leicht nervig.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

20

06.05.2011, 19:26

Um immer auf ein korrektes Ergebnis zu hoffen sollte man aber natürlich die .equals() Methode am String verwenden.
und zwar nach möglichkeit so :) "xy".equals(string) sonst kann ne nullpointerexception fliegen...

Werbeanzeige