T2: Vortragsfolien (57KB PDF) - Fakultät Informatik Uni Stuttgart

Werbung
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
Herunterladen