Wo unterscheiden sich Java und C++? Dipl. -Ing. Darko Sucic Arkusa DV Planung und Entwicklung GmbH Tunnelstr. 14, 70469 Stuttgart Inhalt l l l l l l l l l l Im Vortrag verwendete Elemente der Unified Modelling Language (UML) Quellcode-Struktur Klassenkonzept Mehrfachvererbung vs. Java-Interface Speicherverwaltung Exceptions Threads Operatoren Templates Labeled Breaks und Continues Weiterführende Informationen Literatur l l l l l l l l Flangan D.: Java in a Nutshell, O‘Reilly, 1996 Arnold K., Gosling J.: The Java Programming Language, Addison Wesley, 1996 Doug L.: Concurrent Programming in Java: Design Principles and Patterns, Addison Wesley, 1997 Watson M.: Intelligent Java Applications, Morgan Kaufmann, 1997 Roberts S. et al.: The Complete Java 2 Certification Study Guide, Sybex, 1999 Java Homepage (http://java.sun.com/docs/index.html) Java Report , SIGs Publications (http://www.javareport.com/) C++ Report , SIGs Publications (http://www.creport.com/) Unified Modelling Language UML l l l l l UML entstand aus der Zusammenführung von drei Notationen verschiedener Autoren: – Grady Booch – Jim Rumbaugh – Ivar Jacobson UML ist sehr umfangreich UML ist seit 1997 von der Object Management Group OMG standardisiert. UML hat sich am Markt durchgesetzt Weitere Informationen: – www.rational.com – www.omg.org Methode und Notation l UML stellt zur Verfügung: – ein Meta-Modell (grundlegende Modellierungskonzepte, Modellelemente und ihre Semantik) – eine graphische Notation zur Visualisierung des Meta-Modells – Richtlinien (Namenskonventionen, Anordnung von Symbolen usw.) l UML ist keine Methode. Sie definiert kein Vorgehensmodell. l UML ist durch die Verwendung von Stereotypen erweiterbar. Verschiedene Sichten eines SW-Systems l l UML deckt den gesamten Software-Lebenszyklus ab. Verschiedene Sichten, die mit UML darstellbar sind: DESIGN VIEW COMPONENT VIEW USE CASE VIEW PROCESS VIEW DEPLOYMENT VIEW Diagrammtypen der UML l Die wichtigsten Diagramme – – – – l Use Case-Diagramme Klassendiagramme Paketdiagramme Komponenten-Diagramme Weitere Diagramme – Interaktionsdiagramme (Sequenz- und Kollaborationsdiagramme) – Zustandsdiagramme – Deployment-Diagramme Klassendiagramm l l l Zentrales Element der UML und der objektorientierten Softwareentwicklung Darstellungen von Klassen und Objekten mit Beziehungen, Methoden und Attributen Viele Details darstellbar, z.B.: – – – – spezielle Eigenschaften einer Klasse (abstrakt, interface) Kardinalitäten der Beziehungen Navigationsfähigkeit usw. Elemente eines Klassendiagramms Class - attribute Klasse + operation() Cl ass A ClassB Class A ClassB Class A ClassB 1 * Class A ClassB 1 * Vererbung: Klasse A erbt von der Klasse B Abhängigkeit: Klasse A hängt von der Klasse B in irgendeiner Art und Weise ab Assoziation: Klassen A und B stehen in einer Beziehung zu einander Aggregation: Klasse A beinhaltet die Klasse B Quellcode-Struktur - 1 Java unterscheidet nicht zwischen Header- und Implementierungs-Dateien, wie es in C++ der Fall ist. Der Gesamtcode (Deklarationen und ihre Implementierungen) liegen in einer Datei, die den Klassennamen trägt. Quellcode-Struktur - 2 l l Java import Statements entsprechen C++ includes. Der Quellcode von Java ist in Pakete (packages) organisiert. Die Java-Pakete müssen der VerzeichnisStruktur des File-Systems folgen. Java-Pakete sind das Pendant zu C++ Namensbereiche (namespace). package ike.tutorium; #include “ike.h“ import java.applet.*; import java.awt.image; import java.awt.Button;// (Java) namespace tutorium { // define classes in the name space }// namespace tutorium (C++) Quellcode-Struktur - 3 Java erlaubt keine Präprozessor-Anweisungen, die in C++ wie #define, #include, #ifdef usw. üblich sind. public final class SimpleMath { // ... public static final double PI =3.14; // ... }// class SimpleMath (Java) // define constant PI #define PI 3.14 // (C++) Klassen Konzept - 1 l Jede Klasse in Java ist eine Subklasse der Klasse java.lang.Object, und – erbt alle ihre Methoden und Attribute – läßt jederzeit die Typ-Umwandlung ihrer Objekte auf Objekte der Klasse Object zu l C++ Klassen haben keine „default“Superklasse. Object (f rom lang) + getCl ass() + hashCode() + equals() # clone() + toSt ring() + notify() + notifyAll() + wait () + wait () + wait () # finalize() + Object () Klassen Konzept - 2 l l l Java benutzt die Zeigertechnik nicht, um die Instanzen einer Klasse zu referenzieren Java erlaubt keine automatischen Typ-Umwandlungen In Java gibt es nur Klassen, aber keine – structs – unions – functions Mehrfachvererbung vs. Java-Interface - 1 Java erlaubt keine Mehrfachvererbung, wie es in C++ der Fall ist. Ein Java-Interface entspricht einer C++ Klasse, welche nur pure virtual-Methoden hat. public interface Stack { public void push (Object o); public void Object pop (); }// interface Stack (Java) class Stack { public virtual void push (Object&) = 0; virtual void Object& pop () = 0; };// class Stack (C++) Mehrfachvererbung vs. Java-Interface - 2 l l l l Ein Java-Interface ist keine Klasse. Ein Java-Interface darf keine Klassen-Attribute deklarieren. Ein Java-Interface darf die innerhalb eines Interfaces deklarierten Methode nicht selbst implementieren. Einer Java-Klasse ist es erlaubt, mehrere Interfaces implementieren zu können. Mehrfachvererbung vs. Java-Interface - 3 Java unterstützt keine Mehrfachvererbung. Sogenannte Deadly Diamond of Death (DDD) Situationen können nicht auftreten. A - i : int + operation() B C + operation() + operation() D C++ braucht virtuelle Vererbung Mehrfachvererbung vs. Java-Interface - 4 Cl ock - m_dTime : double Subject +observers + tick() + register() + not ify() Clock Subject Observer 1 - m_dTime : double * + register() + notify() + tick() + update() +m_subjectImpl SubjectImpl ObservedClock 1 1 + register() + notify() + tick() ObservedClock 1 + tick() * Observer +observers + update() Java C++ Speicherverwaltung - 1 l l l Java beinhaltet automatische Speicherverwaltung. Java verwendet anstelle von Zeigern ausschließlich Referenzen auf Objekte. In Java ist es möglich, eine Referenz neu zuzuweisen. // c refers to new clock Clock c = new Clock(); // use for a while // ... // done with that clock. System will clean up later. c = null; Speicherverwaltung - 2 In Java besteht keine Möglichkeit, die SpeicherVerwaltung selbst zu kontrollieren Vorteil: Sicherheit für InternetAnwendungen (Applets) void f (){ char * p = new char [1000]; delete [] p; SearchPwdInOtherThread(p); return; }// f (C++) Nachteil: Echtzeit-Anwendungen können die CPU Zeit nicht kontrollieren public class RealTime { // must complete in 500µs public void Do () { Clock c = new Clock();//might collect }// Do }// class RealTime (Java) Speicherverwaltung - 3 l l l Die Java-Methode finalize() entspricht grob dem Destruktor in C++. Beim Löschen eines Java-Objektes wird von der Speicherverwaltung seine finalize() Methode aufgerufen. Der Zeitpunkt, zu dem die finalize() Methode aufgerufen wird, ist nicht festlegbar. Es kann eine geraume Zeit vergehen, bis die Ressourcen freigegeben werden. Speicherverwaltung - 4 Die finalize() Methode einer abgeleiteten Klasse muss bei Bedarf die finalize() Methode ihrer Basisklasse explizit aufrufen. public class A extends B { protected void finalize () throws Throwable { super.finalize(); // finalize B // now take care of finalizing A }// finalize }// class A (Java) Exceptions - 1 l l In Java ist die Unterstützung von Ausnahmefällen (exceptions) ein Bestandteil des Sprachumfangs. Jede Exception in Java ist ein Objekt von der Klasse java.lang.Throwable oder einer von ihr abgeleiteten Klasse. Throwable (from lang) + + + + + + + + + Throwable() Throwable() getMessage() getLocalizedMessage() toString() printStackTrace() printStackTrace() printStackTrace() fillInStackTrace() Exceptions - 2 Java erweitert den Exception-Mechanismus von C++ durch das Schlüsselwort finally. public class Thing { protected void exclusive () { semaphore.Acquire(); try {// code that executes while semaphore is acquired. exception my be thrown }// try finally { semaphore.Release(); }// finally } // exclusive private Semaphore semaphore; }// class Thing (Java) Threads -1 l l In Java ist die Unterstützung von Nebenläufigkeiten (threads) ein Bestandteil des Sprachumfangs. Jede Klasse, die Nebenläufigkeiten unterstützt, muß das java.lang.Runnable Interface implementieren. Runnable (from lang) + run() Threads - 2 Java benutzt das Schlüsselwort synchronized, um kritische Bereiche (critical sections) zu schützen. Hiermit wird gewährleistet , dass zwei threads ein Codesegment nicht gleichzeitig ausführen können. public synchronized void doJob () { // this code can be executed // only by one thread at same time } // doJob (Java) public synchronized void doJob () { m_mutex.lock(); // this code can be executed // only by one thread at same time m_mutex.unlock(); } // doJob (C++) Operatoren l Überladen von Operatoren – Durch das Überladen von Operatoren ermöglicht C++ im Gegensatz zu Java die Erweiterung des Sprachumfanges l Java erweitert C++ Operatoren um: – +, verbindet (concatenate) zwei Objekte der Klasse java.lang.String – instanceof, gibt true zurück, wenn das Objekt auf der rechten Seite eine Instanz der Klasse ist, wessen Name auf der linken Seite eingegeben ist. Hierfür sieht C++ den RTTI Mechanismus vor (Run Time Type Information) – >>> Vorzeichenlose Verschiebe-Operator Templates -1 Java unterstützt keine Templates, und damit keine statische Polymorphie. template <class Modem> void sendString (char* s, Modem& m) { m.dial (“5551212“); // call my system if (m.isConnected()) { while (*s) m.send(*s++); m.hangup(); }// if else // not connected std::cerr << “could not connect“ << std::endl; }; // sendString (C++) Templates - 2 In Java besteht keine Möglichkeit, einen typ-sicheren Container zu implementieren. public void notify () { Enumeration i = observers.elements(); while (i.hasMoreElements()) { Observer o = (Observer) (i.nextElement()); // the cast above will throw an exception if next element returns something other // then an Observer o.update(); }// while } // notify (Java) Labeled Breaks und Continues Java enthält nicht das „verpönte“ Schlüsselwort goto, aber ist um labeled break und continue erweitert outer: for (int i = 0; i < 99; i++) { for (int j = 0; j < 99; j++) { if (areWeDone( i,j ) == true) break outer;// get all the way out else doSomethingCool(i,j); }// for (int j doSomethingElse(); }// for(int i Zusammenfassung l Java und C++ sind ähnlich – jemand, der mit einer Sprache vertraut ist, sollte ohne größere Schwierigkeiten die andere Sprache erlernen können l Java ist einfacher – der Sprachumfang ist kleiner – die Sprachkonstrukte sind leichter zu verstehen – die Sprachkonstrukte beschränken sich auf Erfordernisse der objekt-orientierten Softwareentwicklung