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

Fred

Supermoderator

  • »Fred« ist der Autor dieses Themas

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

1

06.05.2011, 01:03

Java für C++ Programmierer ;)

Hallo,

da ich nun vor kurzem ein Informatik-Studium begonnen habe, muss ich Wohl oder Übel nun nebenbei Java lernen. Jetzt komme ich allerdings von der C++ Programmierung und kenne mich damit ja etwas besser aus. Jetzt fällt es mir natürlich schwer mit einem Buch, wie Java ist auch eine Insel zu lernen, weil die Grundlagen größtenteils die selben sind. Allerdings ist mir beim Überfliegen mancher Passagen aufgefallen, dass eben nebenbei durchaus wichtige Punkte erwähnt werden, wie beispielsweise, dass Java kein const kennt. Für einen Programmieranfänger ist das völlig irrelevant, denn er nutzt eben was da ist und was nicht da ist, braucht er nicht. Für mich als C++-Programmierer ist das aber ein bisschen nervig, wenn man dann irgendwann feststellen muss, dass irgendwelche Sachen nicht funktionieren, weil Java das anders lösen will oder einfach gar nicht unterstützt.
Kennt ihr also evtl. irgendwelche Skripts, Bücher oder was auch immer, was einem als C++ Programmierer die Unterschiede in Java erläutert? Oder habt ihr irgendwelche Tipps, wie ihr grundsätzlich an das Lernen einer solchen Sprache herangehen würdet? Also einfach programmieren und dann zeigt sich schon, was klappt und was nicht klappt? Oder bestimmte Bücher lesen?

Vielen Dank schon einmal für eure Hilfe.
Fred

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

2

06.05.2011, 03:07

Das ist mit const ist bisher beinahe das einzig relevante im Studium was mir auffiel.
Und statt des const hat java eben auch hierfür final als Verwendung.
const double PI = 3.14; wäre in Java einfach final double PI = 3.14;
Ansonsten: Operator Overloading nur für + Operator der String Klasse verfügbar, sonst gar nicht verfügbar/selbst definierbar. 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 sind so Punkte wo ich erkannt habe, dass ich Java einfach nicht mag...
Und die String Klasse ist final, was meiner Meinung echt dämlich gewählt ist.
Letzlich zu erwähnen wäre, das Java ein beschissenes Boxing Model hat. Möchtest du eine Liste von int's haben, darfst du nicht einfach

C-/C++-Quelltext

1
ArrayList<int>
schreiben sondern musst das entsprechenden Boxing Objekt nehmen, das wäre in diesem falle Integer, also würde es

C-/C++-Quelltext

1
ArrayList<Integer>
heißen. Dies macht Java für sämtliche Datentypen, was auch sehr nervig sein kann...
Achja, etwas wie dies hier funktioniert im Gegensatz zu C++ nicht in Java:

C-/C++-Quelltext

1
int nr = 0; if (!nr) { ... }
. Man musst explizit mit boolean Werten arbeiten bzw. boolschen Ausdrücken. Und da ist auch schon der letzte Punkt: hier heißt es boolean, nicht bool.
Ok, wurde doch etwas mehr, aber wenn ich erstmal ins schwärmen komme (; ...
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Architekt« (06.05.2011, 03:13)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

06.05.2011, 07:03

Das ist mit const ist bisher beinahe das einzig relevante im Studium was mir auffiel.

Also das Wichtigste was mir auffiel war eher die durchgehende Verwendung von Referenzen, das Fehlen von Pointern (speziell Funktionspointer) und die Garbage-Collection.
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]

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

4

06.05.2011, 08:29

Und nicht zu vergessen: Built-In Types wie int, float und so werden immer per Kopie rumgereicht, alles andere als Referenz. Wenn Du einen int an eine Funktion übergibst, wird der kopiert und kann demzufolge nicht seinen Wert ändern. Wenn Du einen Integer übergibst, kann der aber sehr wohl seinen Wert in der Funktion ändern.

Hat mich also Java-Neuling damals ein paar Mal überrascht, eh ich das raushatte. Aber mir ist Java eh zu geschwätzig, ich habe nur noch selten Kontakt damit.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

5

06.05.2011, 09:12

... 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).

6

06.05.2011, 09:57

Weil es so schön, nochmal von vorne :)
Also es gibt ein paar primitive Datentypen (byte, char, short, int, long, float, double, boolean). Diese werden per Wert hin und her geschoben.
Zusätzlich behandelt Java noch Zeichenketten (String) ganz besonders (+-Operator, "..." führt zu neuem String-Objekt, String-Objekte sind unveränderbar).
http://download.oracle.com/javase/tutori…/datatypes.html
Damit man auch primitive Datentypen per Referenz hin und her schieben kann, gibt es noch spezielle Boxing-Klassen die auch ein bisschen besonders behandelt werden, da sie automatisch in ihren repräsentierenden Datentyp umgewandelt werden können und umgekehrt wird auch sowas "Integer x=10;" unterstützt.
Neben diesen Datentypen gibt es auch klassische Arrays. Diese werden by Reference übergeben und haben eine Spezialsyntax zum Initialisieren. (int[] a=new int[10] und int[] a= {21,2,30,4}).
http://download.oracle.com/javase/tutori…lts/arrays.html
Eine Möglichkeit direkt Methoden (function pointer o.Ä.) zu übergeben, gibt es in Java (noch) nicht.

Das sind eigentlich alle Besonderheiten, was Datentypen angeht. Ich finde das hält sich noch ziemlich im Rahmen und lässt sich leicht verinnerlichen... Mit diesen Datentypen, kann man seine Klassen zusammenbasteln, deren Instanzen immer per Referenz übergeben werden. Alle Klassen erben von der Object-Klasse. Für Klassen gibt es ein paar Spezialfälle (enums, abstract, nested classes) http://download.oracle.com/javase/tutori…vaOO/index.html

Es gibt in Java keine Mehrfachvererbung. Es gibt allerdings "interface" Definitionen, die definieren, dass Klassen bestimmte Methoden implementieren und auch als Typ für eine Referenz gewählt werden können. http://download.oracle.com/javase/tutori…andI/index.html

Es gibt in Java keine Templates. Als ein bisschen was in der Richtung kann man generische Klassen definieren. http://download.oracle.com/javase/tutori…rics/index.html

Es gibt keine Namespaces dafür sog. Packages. http://download.oracle.com/javase/tutori…kage/index.html

Exception-Handling gibt es ähnlich wie in C++. http://download.oracle.com/javase/tutori…ial/exceptions/

Es gibt noch kleinere Syntaxabkürzungen wie
for(T x:collection/array of T){
//mach was mit x
}
oder
int test=a<b?10:12; //if(a<b) test=10; else test=12;

Zu guter letzt gibt es noch die Möglichkeit zur Reflexion (Analyse der Java Klassen zur Laufzeit) und sog. Annotationen. Das sind beides sehr mächtige Werkzeuge, die ich nicht missen möchte. http://download.oracle.com/javase/tutori…nnotations.html http://java.sun.com/developer/technicalA…ALT/Reflection/ Im Zusammenhang damit sollte man sich auch ClassLoader mal anschauen.

Außerdem darf man javadoc nicht vergessen, sozusagen ein eingebautes doxygen.

In Java 7 gibt es Anfänge eines RAII Konzepts: http://java.dzone.com/articles/java-7-new-try-resources

Die großen Plattform APIs von Java solltest du dir auch mal anschauen.

Statt DLL Hell gibt es in Java die JAR Hell :) ich komme mit JAR Hell aber besser klar :).

Als Alternative zu Make o.Ä. gibt es für Java Sachen wie ant oder maven (netbeans unterstützt beides sehr gut mit GUI).

Java ist eine meiner Lieblingssprachen. Nur ActionScript3 und C# habe ich bisher als ähnlich angenehm in der Benutzung empfunden.

Wenn du etwas tiefer in Java einsteigst lohnt es sich bei der Entwicklung von Anwendungen immer mal nach Open Source Bibliotheken zu suchen. Da gibt eine schiere Menge hochqualitativer Bibliotheken in deren Code man sich dank der sehr breiten Einhaltung von Konventionen http://www.oracle.com/technetwork/java/c…toc-136057.html schnell einarbeiten kann.

Momentan gefällt mir auch für kleinere Projekte besonders http://code.google.com/p/google-guice/ Ein leicht zu benutzendes Dependency Injection Framework.

Als kostenlose IDE gefällt mir Netbeans am besten, obwohl ich auch regelmäßig mit Eclipse arbeite. Netbeans empfinde ich wesentlich aufgeräumter.

Herzlich Willkommen in der Java Welt :)

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »Chromanoid« (06.05.2011, 10:18)


Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

7

06.05.2011, 11:49

Das ist mit const ist bisher beinahe das einzig relevante im Studium was mir auffiel.

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.

Zitat

Es gibt noch kleinere Syntaxabkürzungen wie
for(T x:collection/array of T){
//mach was mit x
}

Zu erwähnen wäre: x kann nicht verändert werden. Benötigst du eine Schleife um Elemente zu manipulieren, musst du die herkömmlichen Schleifen benutzen und per Index auf den Wert zugreifen den du ändern möchtest.
C++0x hat dies besser gelöst.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

8

06.05.2011, 12:00

Naja Objekte können schon verändert werden, nur eben keine Basis-Datentypen...

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

9

06.05.2011, 12:08

Naja Objekte können schon verändert werden, nur eben keine Basis-Datentypen...

Gut, vergessen zu erwähnen. Aber das reicht ja schon als Kritikpunkt.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

10

06.05.2011, 12:13

Naja alles andere wäre IMO inkonsistent. Strings sind immutable, und die primitiven Datentypen werden per Value übergeben. Es gibt halt kein ref Attribut o.Ä..

Werbeanzeige