N
javanewbe schrieb:
1. Kann man mit Java alles realisieren, was man mit c++ machen könnte? Oder gibts da irgendwo Grenzen?
Ja, es gibt Grenzen. Du hast generell weniger Möglichkeiten, auf tiefer Abstraktionsebene zu programmieren oder spezifisch zu optimieren (z.B. durch manuelle Speicherverwaltung). Sprachfeatures, die in Java fehlen, wären: Const-Correctness auf Objekt-Ebene, deterministische Destruktoren (und damit Idiome wie RAII), Mehrfachvererbung, Präprozessor, Zeigerarithmetik, Referenzen (im C++-Sinne), globale Funktionen und Variablen, unsigned -Typen, friend , Defaultparameter, Funktionszeiger. Dir stehen weniger Abstraktionsmechanismen zur Verfügung (kein Typedef, keine Operatorüberladung, keine Templates, kein ADL).
Dafür hast du in Java Reflection, wodurch sich neue Türen zur Laufzeit öffnen. Die Sprache besitzt Garbage Collection und eine grössere Standardbibliothek (unter anderem mit GUI, Multimedia und Threads). Statt mit Wertsemantik arbeitest du meist mit Referenzsemantik. Du benutzt in Java ein anderes Modulsystem (keine Aufteilung in Implementierungs- und Headerdatei). Im Weiteren unterstützt Java Checked Exceptions, Generics (ähnlich wie Templates, allerdings weniger mächtig), Foreach-Schleifen, anonyme Klassen, umfangreiche Enums, synchronized , die Unterscheidung von class und interface , Annotations, Static Initializers, paketweite Sichtbarkeit.
Die Philosophie beider Sprachen ist grundsätzlich verschieden. Während einem C++ sehr viele Freiheiten lässt und weitgehend das Prinzip des "zero abstraction overhead" durchzieht, werden potentiell gefährliche Operationen in Java eingedämmt und Abstraktionen gehen oft auf Kosten der Performance. Dafür hat man alle möglichen Laufzeitchecks und prinzipiell weniger Fehlerquellen. C++ erlaubt einem verschiedenste Programmierparadigmen (prozedural, objektorientiert, generisch, mit C++0x auch zunehmend funktional), während sich Java auf objektorientierte Programmierung fokussiert.