1 / 87

Prof. Dr. Max Mühlhäuser Dr. Guido Rößling

Grundlagen der Informatik I Thema 12: Einführung in die objektorientierte Programmierung mit Java. Prof. Dr. Max Mühlhäuser Dr. Guido Rößling. Inhaltsverzeichnis. Objektorientierter Entwurf in aller Kürze; Klassen und Objekte in Java

adeola
Download Presentation

Prof. Dr. Max Mühlhäuser Dr. Guido Rößling

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Grundlagen der Informatik IThema 12: Einführung in die objektorientierte Programmierung mit Java Prof. Dr. Max Mühlhäuser Dr. Guido Rößling

  2. Inhaltsverzeichnis • Objektorientierter Entwurf in aller Kürze; Klassen und Objekte in Java • Interpreter, Compiler, virtuelle Maschinen; Java- Übersetzungs- und -Laufzeitumgebung • Sichtbarkeit von Variablen in Java • Packages • Einführung in das Testen mit JUnit und Eclipse

  3. Objektorientierte Programmierung • Eines der existierenden Programmierparadigmen • Organisiert die zu modellierende Welt als eine Menge kooperierender Objekte (OO-Systeme) • Dabei gilt: • Ein Objekt ist zuständig für einen spezifischen wohldefinierten Teil der Berechnung • Kapselt die Definition der dafür benötigten Daten und Operationen, welche diese Daten verarbeiten • Nimmt Dienste anderer ihm bekannter Objekte in Anspruch • Jedes Objekt ist eine Instanz (Exemplar) einer Klasse • Klassen sind in einer Vererbungshierarchie organisiert • Bilden Begriffshierarchien der zu modellierenden Welt nach

  4. Objektorientierte Programmierung • Beispiel: Modellierung der Immobilienfirma Nobel&Teuer • Objekte repräsentieren Häuser, Mitarbeiter und Kunden • Für jedes Haus sollen Informationen über den betreuenden Mitarbeiter, den Besitzer… verwaltet werden • Für jeden Kunden sind die zu verwaltenden Häuser, Name und Telefonnummer… zu verwalten • Mitarbeiter haben Namen, Telefonnummer, verwaltete Häuser • … • Verschiedene Typen von Häusern • Ein- und Mehrfamilienhäuser • Verschiedene Typen von Haus-Objekten werden in Erben der Klasse Haus spezifiziert

  5. Manager Mitarbeiter Objektorientierte Programmierung Wichtig Die Welt von Nobel&Teuer Müller verwaltet Schmidt Besitzer verwaltet Besitzer Reich

  6. besitzt * zuständig für 2..10 verwaltet Objektorientierte Programmierung Objekt Die Welt der Immobilienfirmen Ur-Objekt-Typ Person Haus 0..2 Mitarbeiter Kunde Einfamilien- haus Mehrfamilien- haus Manager Verwalter Begriffe & Kategorisierung

  7. besitzt * zuständig für 2..10 Objektorientierte Programmierung Objekt Die Welt der Immobilienfirmen Instanziierung Person Haus 0..2 Mitarbeiter Kunde Einfamilien- haus Mehrfamilien- haus Manager Verwalter verwaltet

  8. Klassen • Allgemein: Eine Klasse fasst Gemeinsamkeiten einer Gruppe von Objekten (Instanzen) zusammen • mit denselben Eigenschaften (Attributen) • mit demselben Verhalten (Operationen) Methoden Daten(Variablen) Konstruktionsvorschrift (Schablone) für Objekte; beschreibt deren Struktur und Dienste (Schnittstelle).

  9. Klassen in Java • Der Definitionsblock einer Klasse besteht aus • einer Menge von Variablendeklarationen • Attribute, Instanzvariablen, Felder • einer Menge von Operationsdefinitionen • Konstruktordefinitionen <KlassenDefinition> = class Klassen-Name [extendsSuperKlassenName] <KlassenDefinitionBlock> <KlassenDefinitionsBlock> = { <MitgliedDefinition> ... <MitgliedDefinition> } <MietgliedDefinition> = <InstanzvariablenDeklaration> | <OperationsDefiniton> | <KonstruktorDefinition> class Counter { ... }

  10. Instanzvariablen (Felder) • Instanzvariablen modellieren Eigenschaften von Objekten z.B. aktueller Wert eines Zählers, aktueller Stand eines Kontos, … • Haben einen Namen, einen Typ und einen Wert • Der Name wird meistens klein geschrieben • Der Wert ändert sich während der Ausführung Zur Erinnerung: intist ein so genannter primitiver Typ in Java. Stellt die Klasse der natürlichen Zahlen zwischen -2.147.483.648  und 2.147.483.647 dar class Counter { intcurrentVal; ... } Name Typ class Counter { intcurrentVal = 10; ... } (define (make-counter) (local ( (definecurrentVal 10) ... ) Wert

  11. Konstruktor-Operationen • Ein Konstruktor definiert mit Hilfe der Parameter eine generische Initialisierungsvorschrift • In Java sind Konstruktoren spezielle Operationen: • haben den gleichen Namen wie die Klasse selbst • haben keinen Rückgabewert Formaler Parameter des Konstruktors class Counter { intcurrentVal; ... Counter(intinitVal) { currentVal = initVal; } ... } Initialisierung der Felder mit den aktuellen Parametern eines Konstruktor-Aufrufs (define (make-counter initVal) (local ( (definecurrentValinitVal) ... )

  12. Die Konstruktor-Operationen • Eine Initialisierungsvorschrift wird einmal in einer Klasse definiert und mehrfach benutzt • Erzeugung mehrerer Zählerexemplare des gleichen Typs mit unterschiedlich initialisierten Instanzvariablen ... Counter c1 = new Counter(3); Counter c2 = new Counter(6); ... Schlüsselwort für die Erzeugung von Objektinstanzen ... (define c1 (make-counter 3)) (define c2 (make-counter 6)) ...

  13. Die Java-Klasse Counter class Counter { intcurrentVal; public Counter(intinitVal) { currentVal = initVal; } /** * Effect: Increasesthecurrentvalueofcounterby 1 */ publicintinc() { currentVal = currentVal + 1; returncurrentVal; } /** * Effect: Decreasesthecurrentvalueofcounterby 1 */ publicintdec() { currentVal = currentVal - 1; returncurrentVal; } /** * @returnthecurrentvalueofthecounter */ publicintgetCurrentVal() { returncurrentVal; } } Sichtbar außerhalb der Definition von Counter JavaDoc Kommentar. Hier aus Platzmangel verkürzt.

  14. Klassen in Scheme und Java • Klassen werden in Scheme durch Konstruktor-Funktionen (make-XXX) modelliert • Spielen die Rolle der Java-Klassen und -Konstruktoren • Geben Dispatcher-Funktionen zurück • Der Dispatcher kombiniert und versteckt alle Dienstfunktionen • In Java gibt es ein spezielles Konstrukt für Klassen • Klassen sind nicht wirklich erstklassige Werte • Klassen können mehrere Konstruktoren haben • Dispatch-Mechanismus implizit in der Sprache • Der Dispatcher ist Teil der Sprachsemantik und muss nicht programmiert werden (später mehr)

  15. Klassenschnittstellen in Java • Service Managers (dispatchers) in Scheme sind Schnittstellenfunktionen, die Symbole auf Funktionen verschiedener Typen abbilden • Die Schnittstelle einer Java-Klasse ergibt sich aus der Menge der Operationen, die als public deklariert sind • Nicht-öffentliche Operationen sind von außen unsichtbar • Wir gehen fürs erste davon aus, dass sie nur von Methoden der gleichen Klasse aufgerufen werden können • Das stimmt nicht ganz; wir betrachten es später genauer • Der Begriff einer Klassenschnittstelle als eine Funktion, die Symbole auf Operationen mit einem bestimmten Vertrag abbildet, bleibt jedoch gültig An address-book is an interface: 'add :: symbol number -> void 'search :: symbol -> number

  16. Einkapselung (Information Hiding) class Counter { intcurrentVal; ... } Felder und Operationen eines Objekts können versteckt werden. Auf sie kann nur innerhalb der Implementierung der (öffentlichen) Operationen der Klasse zugegriffen werden. publicstaticvoidmain(String[] args) { Counter c1 = new Counter(2); intcurrent = c1.currentVal; current= c1.getCurrentVal(); // OK }

  17. Generelle Design-Idee: Details eines Programm-Moduls verstecken (z.B. Klasse oder Funktion) Mächtige Idee: reduziert die Komplexität von Anwendungen Keine Notwendigkeit, die versteckten Details des Moduls zu verstehen, um es zu verwenden. Reduziert die Kopplung zwischen Modulen Man kann die versteckte Implementierung ändern, ohne die Klienten unwirksam zu machen. Modul-Schnittstelle als Vertrag. Wir kennen diese Design-Idee schon Datenabstraktion: Repräsentation desDatentyps verstecken Make-Funktionen verstecken lokale Objektdefinitionen Geheimnisprinzip (Information Hiding)

  18. Kapselung • Idee: Kombination von Elementen, um größere Einheiten zu erzeugen und dabei die Details der Komposition zu verstecken. • Kapselung ist ein Mechanismus, um Informationen zu verstecken. • Der Begriff wird manchmal in einem gröberen Sinn verwendet. • Als Synonym für informationhiding • Der Begriff wird manchmal in einem spezifischeren Sinn verwendet • “Daten und Operationen zusammen”

  19. Klassen als zweifache Abstraktion… …beschreiben nur solche Felder und Dienste von realen Objekten, die relevant für die zu entwickelnde Software sind. In der Definition einer Klasse werden unwichtige Unterschiede zwischen allen möglichen Elementen (Objekten) einer Klasse außer Acht gelassen Beispiel: Unterschiede in den aktuellen Werten der Zähler

  20. Klassen und Objekte • Klassen in Java sind statische Beschreibungen ("auf Papier" bzw. "in der Datei")  Pläne (engl. blueprints) • Objekte sind Laufzeitelemente eines Programms  Werte • dynamisch (sind zur Programmausführungszeit im Hauptspeicher des Rechners) • Es kann mehrere Objekte einer Klasse geben, jedes miteigenerIdentitätundeigenemZustand • Objekte sind über einen Namenansprechbar • Jedes Objekt gehört einer Klasse an und kennt seine Klasse • Die Klasse kennt ihre Objekte in der Regel nicht

  21. Charakteristika eines Objekts

  22. Berechnungen durchführen • Jede Berechnung in einem OO-Programm geschieht als Folge des Aufrufs einer Operation auf einem vorher erzeugten Objekt • Beachten Sie die „Punkt-Notation“ für den Aufruf von Methoden publicclassCounterConsumer { Counter c1 = new Counter(3); Counter c2 = new Counter(6); publicvoiddoSomethingWithCounters() { c1.inc(); c1.inc(); c1.dec(); System.out.println(c1.getCurrentVal()); c2.inc(); c2.dec(); System.out.println(c2.getCurrentVal()); } } (begin (incc1) (inc c1) (dec c1)) (begin (incc2) (dec c2)) (getCurrentValc1) (getCurrentValc2)

  23. Berechnungen durchführen • Die Aufgabe wird in Dienstanweisungen zerlegt • Formuliert als Nachrichten (Operationsaufruf) an Objekte • Jede Nachricht enthält: • Name des Empfängerobjektes: c1 im Beispiel • Namen des Dienstes (der Operation), der (die) vom Empfänger ausgeführt werden soll • inc(), dec(), ... • Die Operation muss in der Schnittstelle des Empfängers enthalten sein • Es wird nur eine Nachricht mit einer Dienstanweisung auf einmal geschickt • Wenn mehrere Objekte vorhanden sind, können sie Botschaften aneinander senden • Teilaufgaben an bekannte Objekte delegieren

  24. Zur Erinnerung: Wie alles anfängt… • Die „ausgezeichnete“ Methode namens main wird aufgerufen, wenn ein Java-Programm ausgeführt wird… publicclassCounterTest { // ... publicstaticvoidmain(String[] args) { CounterConsumer cc = newCounterConsumer(); cc.doSomethingWithCounters(); } // ... } CounterTest.java Java- Compiler javac CounterTest.java java CounterTest Java- Bytecode-Interpreter

  25. Inhaltsverzeichnis • Objektorientierter Entwurf in aller Kürze; Klassen und Objekte in Java • Interpreter, Compiler, virtuelle Maschinen; Java- Übersetzungs- und -Laufzeitumgebung • Sichtbarkeit von Variablen in Java • Packages • Einführung in das Testen mit JUnit und Eclipse

  26. Interpreter • Ein Interpreter ist ein Programm, das ein Programm einer bestimmten Programmiersprache direkt ausführt. • Arbeitsweise eines Interpreters(inpExpr ist der aktueller Ausdruck des auszuführenden Programms) • Syntaktische Analyse von inpExpr • Überführung von inpExpr in eine Befehlsfolge der Maschinensprache, oder der Sprache, in der das Interpreterprogramm selbst geschrieben ist (outExpr) • Ausführung von outExpr • Wiederholung der Schritte (1) bis (3) für die nächste Anweisung.

  27. Definition eines Übersetzers • Ein Übersetzer (Compiler) ist ein Programm, das Programme aus einer Programmiersprache A in eine Programmiersprache B übersetzt Programm in der Sprache B Programm in der Sprache A Übersetzer Ausführung A  Quellsprache B  Zielsprache Zielprogramm P2 Quellprogramm P1 • Semantische Korrektheit • Jedem Quellprogramm P1 in A wird genau ein Zielprogramm P2 in B zugeordnet. • Das dem Quellprogramm P1 zugeordnete Zielprogramm P2 muss die gleiche Bedeutung (Semantik) wie P1 besitzen.

  28. Übersetzer (Compiler) Konteradmiral Grace Murray Hopper (1906–1992) Nach eigener Aussage hat sie den Compiler aus Faulheit erfunden, und weil sie hoffte, dass "Programmierer wieder Mathematiker werden" könnten.

  29. Übersetzungsphasen Quellprogramm wird in eine Folge von Worten zerlegt Lexikalische Analyse Testet, ob das Quellprogramm denSyntaxregeln der Quellsprache entspricht. Strukturiert Worte in gültige Sätze. Syntaktische Analyse Testet, ob alle im Quellprogramm benutzten Namen deklariert wurden und ihrem Typ entsprechend verwendet werden, usw. Semantische Analyse Code-Generierung Zielprogramm wird erzeugt

  30. Traditionelle Übersetzung Quelltext in Sprache A Compiler für Sprache A und Prozessor X Compiler für Sprache A und Prozessor Y Compiler für Sprache A und Prozessor Z Ausführbares Programm (Binärcode) für Prozessor Z Ausführbares Programm (Binärcode) für Prozessor X Ausführbares Programm (Binärcode) für Prozessor Y N Sprachen M Plattformen N*M Compiler Pascal Sun Smalltalk PC Java Prolog Apple C++

  31. Vor- und Nachteile traditioneller Übersetzung • Vorteil: Optimale Ausnutzung der jeweiligenProzessor-Eigenschaften • Hohe Abarbeitungsgeschwindigkeit der übersetzten Programme • Nachteil: Plattformabhängigkeit • Ein Programm, das in einer höheren Programmiersprache geschrieben ist, kann theoretisch nach der Anwendung der entsprechenden Übersetzer auf jeder Maschine laufen... „The difference between theory and practice is that in theory, there is no difference between theory and practice, but in practice there is.“

  32. Das übersetzte Programm läuft nur auf dem jeweiligen Prozessortyp Für jeden Prozessortyp und jedes Betriebssystem muss das Programm mit einem anderen Compiler neu übersetzt werden. Windows auf PC != Linux auf PC Plattformabhängigkeit: es gibt unterschiedliche Dialekte einer Sprache Bestimmte Eigenschaften der Maschine beeinträchtigen den Compiler-Entwurf Z.B. Größe der Register oder Speicherzellen beeinträchtigt die maximale Länge der Zahlen, die manipuliert werden können. Daher gibt es oft verschiedene Dialekte einer Programmiersprache Vor- und Nachteile traditioneller Übersetzung

  33. Virtuelle Maschinen (VM) • Eine virtuelle Maschine ist ein Programm, das die Arbeit eines Prozessors in Software simuliert • Programme einer höheren Sprache werden in eine Assembler-ähnliche Zwischensprache übersetzt • Der simulierte Hardware-Prozessor nutzt diese Zwischensprache und besitzt einige Software-Register • Die Anweisungen der Zwischensprache nennt man auch Byte-Code • Die Zwischensprache wird von der Virtuellen Maschine interpretiert • Eine virtuelle Maschine versteckt die spezifischen Eigenschaften eines konkreten Prozessors  eine neue Abstraktionsschicht auf der Hardware-Ebene!

  34. Vor- und Nachteile von Interpretern • Vorteil: es lassen sich relativ schnell lauffähige Programmversionen erstellen  Prototyping • Schnelle Änderbarkeit: geänderte Anweisungen / Deklarationen des Quellprogramms sind sofort ausführbar • Neuübersetzung nicht notwendig • Nachteil: Längere Ausführungszeit • Werden Anweisungen des Quellprogramms k-mal verwendet (z.B. bei Schleifen), werden sie k-mal analysiert und überführt • Bei Zugriffen auf Variablen müssen die zugeordneten Adressen immer wieder bestimmt werden.

  35. Virtuelle Maschinen (VM) N Sprachen M Plattformen N + M Compiler Pascal Sun Smalltalk Virtuelle Maschine PC Java Prolog Apple C++ Eine VM verdeckt die speziellen Eigenschaften des jeweiligen Prozessortyps  Abstraktionsschicht!

  36. Vor- und Nachteile der VM-Technologie • Vorteile: Übersetzte Programme einer Sprache laufen auf allen Prozessortypen, für die es einen Byte-Code Interpreter gibt • Es wird nur ein Compiler benötigt  Die Sprache wirdplattformunabhängig • Natürlich braucht man eine VM pro Prozessortyp! • Nachteil: Byte-Code Programme sind langsamer als Maschinenprogramme • just-in-time-compiler (JIT): Übersetzen den Byte-Code in ein Objekt-Programm für einen speziellen Prozessortyp • sobald es geladen wird, oder nach der ersten Ausführung

  37. Java-Übersetzungs- und -Laufzeitumgebung Übersetzungsumgebung Laufzeitumgebung Class LoaderBytecodeVerifier Java Klassen-bibliothek Java Source (.java) Java Bytecode aus Dateisystem oder Netz Java VM Java Interpreter Just-in-time Compiler Java Compiler (javac) Java Laufzeitumgebung Java Bytecode (.class) Betriebssystem Hardware

  38. Struktur eines Java-Programms • Ein Java-Programm kann aus beliebig vielen Klassen bestehen, von denen mindestens eine die main-Operation besitzen muss (Hauptprogrammklasse). • Aufgaben von main: • Objekterzeugung  der Aufbau einer anfangs minimalen Welt • Aufruf der ersten Operation • Sollte in der Regel keinen weitergehenden Kontrollfluss des Java-Programms enthalten • Der Kontrollfluss wird innerhalb der Objektoperationen realisiert • Nicht vergessen! Berechnung als Kooperation von vielen Objekten, wobei jedes Objekt nur eine kleine Teilaufgabe erledigt! • main wird mit Hilfe des Java-Interpreters gestartet und ausgeführt

  39. Java-Laufzeitumgebung • Java Interpreter: Programm zur Ausführung des Java-Bytecodes auf dem konkreten Rechner • Just-In-Time-Compiler (JIT-Compiler) • Eine Klasse kann (optimal) nach dem Laden direkt in Maschinen-Code der jeweiligen Maschine übersetzt werden • Falls die vorliegende Java-Installation keinen JIT-Compiler besitzt, wird der Bytecode vom Java-Interpreter direkt ausgeführt • Runtime-System: Stellt einem Java-Programm wichtige Ressourcen zur Verfügung • Bytecode Verifier: überprüft, ob die geladenen Bytecodes der JVM-Spezifikation entsprechen • Klassen können über das Netz oder aus dem lokalen Dateisystem zur Laufzeit einer Java-Anwendung in das Laufzeitsystem nachgeladen werden • Ein Teil der Sicherheitsmaßnahmen wird durch den Bytecode Verifier realisiert

  40. Java-Übersetzung (Wiederholung) • Java-Compiler • Eingabe: Java-Quelltextdatei, Datei.java, die eine oder mehrere Klassendefinitionen enthält • Eine derartige Datei nennt man eine Übersetzungseinheit • Ausgabe: pro Klasse Bsp wird genau eine Datei Bsp.class erzeugt, die das Bytecode-Format der Klasse enthält Bsp1.class Datei.java class Bsp1 {...} class Bsp2 {...} classDatei {...} Bsp2.class Java Compiler Datei.class

  41. Inhaltsverzeichnis • Objektorientierter Entwurf in aller Kürze; Klassen und Objekte in Java • Interpreter, Compiler, virtuelle Maschinen; Java- Übersetzungs- und –Laufzeitumgebung • Sichtbarkeit von Variablen in Java • Packages • Einführung in das Testen mit JUnit und Eclipse

  42. Sichtbarkeit von Variablen in Java • Der gleiche Variablenname kann mehrfach verwendet werden, z.B. Instanzvariable, Parameter, lokale Variable einer Methode oder eines Blocks. • Wie in Scheme, lexicalscoping:innereDeklarationen haben immerVorrangvoräußerenDeklarationen. • Auf äußere Deklarationen kann man nicht mehr direkt zugreifen • Mit this.<attribute-name> kann man auf Instanzvariablen zugreifen • Lokale Variablen und Parameter können nichtre-deklariert werden • Redeklaration beeinflusst die Existenz der äußeren Variablen nicht • Fehlende Sichtbarkeit bedeutet kein fehlendes Vorhandensein! • Außerhalb des Deklarationsblocks ist die äußere Variable wieder sichtbar

  43. Sichtbarkeit von Variablen in Java Klassen Lexicalscoping a la Java classExample { int i; char c; voidg(int n) { int i, j; for (char c... ) { int k; … i … k … c … n … this.i … } … c … } } Klassen-Scope Scope von Methode g Scope der for-Schleife

  44. Inhaltsverzeichnis • Objektorientierter Entwurf in aller Kürze; Klassen und Objekte in Java • Interpreter, Compiler, virtuelle Maschinen; Java- Übersetzungs- und –Laufzeitumgebung • Sichtbarkeit von Variablen in Java • Packages • Einführung in das Testen mit JUnit und Eclipse

  45. Packages • Packages bündeln Klassen, die im Hinblick auf Zuständigkeit zusammen gehören. • Hilft Namenskonflikte zu vermeiden. • Klassennamen müssen eindeutig sein (aber nur in einem Package) • Mehrere Klassen können den gleichen (nicht public) Namen haben, z.B. List • Versteckt Klassen, die nur interne Zwecke haben und die nach außen nicht sichtbar sein sollen.

  46. Package Hierarchien • Packages sind hierarchisch organisiert  Ein Package kann andere Packages enthalten, die wieder mehr Packages enthalten, usw. • Punkt-Notation für Package Namen package.subpackage.subsubpackage.Class • Der Kopf einer Java Datei gibt an, mit welchem Package die folgenden Klassen verbunden sind.

  47. Namenskonventionen für Packages • Der Package Name spiegelt den Internet Domain Namen des Herstellers in umgekehrter Reihenfolge • Schräg- und Bindestriche sind nicht erlaubt: • SUN URL: sun.com • SUN class: com.sun.p1.p2.Class • TUD URL: informatik.tu-darmstadt.de • TUD class: de.tu_darmstadt.informatik.p1.Class Die Konvention erlaubt die Definition weltweit eindeutiger Klassennamen.

  48. Deklaration von Packages • Dergleiche PackageName kann in mehreren Dateien verwendet werden • Ein Package kann über mehrere Dateien verteilt sein  schnellere (Re-)Compilierung  Unterstützt die Arbeitsteilung in größeren Projekten • Dervolle Name einer Klasse enthält immer den Package Namen (packagename.ClassName) • Shortcut Notation mit nurdemKlassennamen ist nur innerhalb des selben Packages möglich oder wenn das Packagebzw.die Klasse importiert wurde.

  49. Struktur einer Java Datei <Source-File> ::= <Package-Declaration> <Import-Declarations> <Type-Definitions> <Package-Declaration> ::= package <Package-name> ;| ε <Package-Name> ::= <Identifier> {. <Package-Name>} • Nur Kommentare oder leere Zeilen dürfen vor der Package Deklaration stehen. • Nur einPackage Name pro Datei • Ohneeine Package-Deklarationwerden die enthaltenen Klassen einem anonymenStandard Packagehinzugefügt.

  50. Package Import <Import-Declaration> ::= import<Package-Name> .(<Class-Name> | *) ; • Eine Klassendefinition nach einer import-Anweisung kann auf die importierte Klasse zugreifen, ohne den vollständigen Namen zu nennen. • Wenn "*" (wild card) benutzt wird, kann man auf alle Klassen des Packages zugreifen. • Falls nur Klassenmethoden (static) importiert werden sollen, langt auch folgende Notation: importstatic<Package-Name>.<Class-Name>.<Methode>;

More Related