Rheinwerk Computing < openbook >


 
Inhaltsverzeichnis
Materialien
Vorwort
1 Java ist auch eine Sprache
2 Imperative Sprachkonzepte
3 Klassen und Objekte
4 Arrays und ihre Anwendungen
5 Der Umgang mit Zeichenketten
6 Eigene Klassen schreiben
7 Objektorientierte Beziehungsfragen
8 Ausnahmen müssen sein
9 Geschachtelte Typen
10 Besondere Typen der Java SE
11 Generics<T>
12 Lambda-Ausdrücke und funktionale Programmierung
13 Architektur, Design und angewandte Objektorientierung
14 Java Platform Module System
15 Die Klassenbibliothek
16 Einführung in die nebenläufige Programmierung
17 Einführung in Datenstrukturen und Algorithmen
18 Einführung in grafische Oberflächen
19 Einführung in Dateien und Datenströme
20 Einführung ins Datenbankmanagement mit JDBC
21 Bits und Bytes, Mathematisches und Geld
22 Testen mit JUnit
23 Die Werkzeuge des JDK
A Java SE-Module und Paketübersicht
Stichwortverzeichnis


Download:

- Listings, ca. 2,7 MB


Buch bestellen
Ihre Meinung?



Spacer
<< zurück
Java ist auch eine Insel von Christian Ullenboom

Einführung, Ausbildung, Praxis
Buch: Java ist auch eine Insel


Java ist auch eine Insel

Pfeil10 Besondere Typen der Java SE
Pfeil10.1 Object ist die Mutter aller Klassen
Pfeil10.1.1 Klassenobjekte
Pfeil10.1.2 Objektidentifikation mit toString()
Pfeil10.1.3 Objektgleichwertigkeit mit equals(…) und Identität
Pfeil10.1.4 Klonen eines Objekts mit clone() *
Pfeil10.1.5 Hashwerte über hashCode() liefern *
Pfeil10.1.6 System.identityHashCode(…) und das Problem der nicht eindeutigen Objektverweise *
Pfeil10.1.7 Aufräumen mit finalize() *
Pfeil10.1.8 Synchronisation *
Pfeil10.2 Schwache Referenzen und Cleaner
Pfeil10.3 Die Utility-Klasse java.util.Objects
Pfeil10.3.1 Eingebaute null-Tests für equals(…)/hashCode()
Pfeil10.3.2 Objects.toString(…)
Pfeil10.3.3 null-Prüfungen mit eingebauter Ausnahmebehandlung
Pfeil10.3.4 Tests auf null
Pfeil10.3.5 Indexbezogene Programmargumente auf Korrektheit prüfen
Pfeil10.4 Vergleichen von Objekten und Ordnung herstellen
Pfeil10.4.1 Natürlich geordnet oder nicht?
Pfeil10.4.2 compareXXX()-Methode der Schnittstellen Comparable und Comparator
Pfeil10.4.3 Rückgabewerte kodieren die Ordnung
Pfeil10.4.4 Beispiel-Comparator: den kleinsten Raum einer Sammlung finden
Pfeil10.4.5 Tipps für Comparator und Comparable-Implementierungen
Pfeil10.4.6 Statische und Default-Methoden in Comparator
Pfeil10.5 Wrapper-Klassen und Autoboxing
Pfeil10.5.1 Wrapper-Objekte erzeugen
Pfeil10.5.2 Konvertierungen in eine String-Repräsentation
Pfeil10.5.3 Von einer String-Repräsentation parsen
Pfeil10.5.4 Die Basisklasse Number für numerische Wrapper-Objekte
Pfeil10.5.5 Vergleiche durchführen mit compareXXX(…), compareTo(…), equals(…) und Hashwerten
Pfeil10.5.6 Statische Reduzierungsmethoden in Wrapper-Klassen
Pfeil10.5.7 Konstanten für die Größe eines primitiven Typs
Pfeil10.5.8 Behandeln von vorzeichenlosen Zahlen *
Pfeil10.5.9 Die Klasse Integer
Pfeil10.5.10 Die Klassen Double und Float für Fließkommazahlen
Pfeil10.5.11 Die Long-Klasse
Pfeil10.5.12 Die Boolean-Klasse
Pfeil10.5.13 Autoboxing: Boxing und Unboxing
Pfeil10.6 Iterator, Iterable *
Pfeil10.6.1 Die Schnittstelle Iterator
Pfeil10.6.2 Wer den Iterator liefert
Pfeil10.6.3 Die Schnittstelle Iterable
Pfeil10.6.4 Erweitertes for und Iterable
Pfeil10.6.5 Interne Iteration
Pfeil10.6.6 Eine eigene Iterable implementieren *
Pfeil10.7 Die Spezial-Oberklasse Enum
Pfeil10.7.1 Methoden auf Enum-Objekten
Pfeil10.7.2 Aufzählungen mit eigenen Methoden und Initialisierern *
Pfeil10.7.3 enum mit eigenen Konstruktoren *
Pfeil10.8 Annotationen in der Java SE
Pfeil10.8.1 Orte für Annotationen
Pfeil10.8.2 Annotationstypen aus java.lang
Pfeil10.8.3 @Deprecated
Pfeil10.8.4 Annotationen mit zusätzlichen Informationen
Pfeil10.8.5 @SuppressWarnings
Pfeil10.9 Zum Weiterlesen
 

Zum Seitenanfang

10.7    Die Spezial-Oberklasse Enum Zur vorigen ÜberschriftZur nächsten Überschrift

Jeder Aufzählungstyp erbt von der Spezialklasse Enum. Nehmen wir erneut die Wochentage:[ 204 ](Mit java.time.DayOfWeek deklariert die Java SE einen Aufzählungstyp für Wochentage inklusive Methoden, der in Produktivsoftware bevorzugt werden sollte. Wir bilden ihn nach, weil er so anschaulich ist. )

Listing 10.35    src/main/java/com/tutego/insel/enums/Weekday.java, Ausschnitt

public enum Weekday {

MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY

}

Der Compiler übersetzt dies in eine Aufzählungsklasse, die etwa so aussieht:

public class Weekday extends Enum {



public static final Weekday MONDAY = new Weekday( "MONDAY", 0 );

public static final Weekday TUESDAY = new Weekday( "TUESDAY ", 1 );

// weitere Konstanten ...



private Weekday( String s, int i ) {

super( s, i );

}



// weitere Methoden ...

}
 

Zum Seitenanfang

10.7.1    Methoden auf Enum-Objekten Zur vorigen ÜberschriftZur nächsten Überschrift

Jedes Aufzählungselement ist ein Objekt und besitzt automatisch einige Standardmethoden, die von der Oberklasse java.lang.Enum kommen. Das sind zum einen überschriebene Methoden aus java.lang.Object, einige neue Objektmethoden und einige statische Methoden (siehe Abbildung 10.9).

Typbeziehung von »Enum«

Abbildung 10.9    Typbeziehung von »Enum«

String-Repräsentation

Den Namen der Konstanten liefert die Methode name(). Dazu gesellt sich die bekannte toString()-Methode, die standardmäßig name() aufruft, aber überschrieben werden kann. Die Methode name() lässt sich nicht überschreiben.

Die vom Compiler generierte Aufzählungsklasse bietet eine statische valueOf(String)-Methode, die das Aufzählungselement liefert, das zur name()-Repräsentation passt. Wird bei valueOf(String) ein String übergeben, zu dem es kein Aufzählungselement gibt, folgt eine IllegalArgumentException. Dazu kommt eine weitere statische Methode Enum.valueOf(Class<T> enumType, String name), die aus der Oberklasse Enum stammt.

[zB]  Beispiel

Die Konvertierung in den String und vom String in das entsprechende Enum-Objekt funktioniert wie folgt:

System.out.println( Weekday.MONDAY.toString() );                       // MONDAY

System.out.println( Weekday.MONDAY.name() ); // MONDAY

System.out.println( Weekday.valueOf( "MONDAY" ).name() ); // MONDAY

System.out.println( Enum.valueOf( Weekday.class, "MONDAY" ).name() ); // MONDAY

Der Unterschied zu den valueOf(…)-Methoden ist wichtig: Während es Enum.valueOf(Class, String) nur einmal gibt, existieren statische valueOf(String)-Methoden einmal in jeder vom Compiler generierten Aufzählungsklasse. Da die Methode also compilergeneriert ist, taucht sie in der folgenden Aufzählung nicht auf:

abstract class java.lang.Enum<E extends Enum<E>>

implements Comparable<E>, Serializable
  • final String name()

    Liefert den Namen der Konstanten. Da die Methode – wie viele andere der Klasse – final ist, lässt sich der Name nicht ändern.

  • String toString()

    Liefert den Namen der Konstanten. Die Methode ruft standardisiert name() auf, weil sie aber nicht final ist, kann sie überschrieben werden.

  • static <T extends Enum<T>> T valueOf(Class<T> enumType, String s)

    Ermöglicht das Suchen von Enum-Objekten zu einem Konstantennamen und einer Enum-Klasse. Sie liefert das Enum-Objekt für die gegebene Zeichenfolge oder löst eine IllegalArgumentException aus, wenn dem String kein Enum-Objekt zuzuordnen ist.

Alle Konstanten der Klasse aufzählen

Eine praktische statische Methode ist values(). Sie liefert ein Array von allen Aufzählungen vom Aufzählungstyp. Nützlich ist das für das erweiterte for, das alle Konstanten aufzählen soll. Eine Alternative mit dem gleichen Ergebnis ist die Class-Methode getEnumConstants():

Listing 10.36    src/main/java/com/tutego/insel/enums/WeekdayDemo.java, Ausschnitt

for ( Weekday day : Weekday.values() )  // oder Weekday.class.getEnumConstants()

System.out.println( "Name=" + day.name() );

Liefert Zeilen mit Name=MONDAY

Ordinalzahl

Von der Oberklasse Enum erbt jede Aufzählung einen geschützten parametrisierten Konstruktor, der den Namen der Konstanten sowie einen assoziierten Zähler erwartet. So wird aus jedem Element der Aufzählung ein Objekt vom Basistyp Enum, das einen Namen und eine ID, die sogenannte Ordinalzahl, speichert. Natürlich kann es auch nach seinem Namen und Zähler gefragt werden.

[zB]  Beispiel

Eine Methode, die die Ordinalzahl eines Elements der Aufzählung liefert oder –1, wenn die Konstante nicht existiert:

Listing 10.37    src/main/java/com/tutego/insel/enums/WeekdayDemo.java, Ausschnitt

static int getOrdinal( String name ) {

try {

return Weekday.valueOf( name ).ordinal();

}

catch ( IllegalArgumentException e ) {

return -1;

}

}

Damit liefert unser getOrdinal("MONDAY") == 0 und getOrdinal("WOCHENTAG") == –1.

Die Ordinalzahl gibt die Position in der Deklaration an und ist auch Ordnungskriterium der compareTo(…)-Methode. Die Ordinalzahl lässt sich nicht ändern und repräsentiert immer die Reihenfolge der deklarierten Konstanten.

[zB]  Beispiel

Kommt Montag wirklich vor Freitag?

System.out.println( Weekday.MONDAY.compareTo( Weekday.FRIDAY ) );   // -4

System.out.println( Weekday.MONDAY.compareTo( Weekday.MONDAY ) ); // 0

System.out.println( Weekday.FRIDAY.compareTo( Weekday.MONDAY) ); // 4

Negative Rückgaben bei compareTo(…) geben immer an, dass das erste Objekt »kleiner« als das zweite aus dem Argument ist.

abstract class java.lang.Enum<E extends Enum<E>>

implements Comparable<E>, Serializable
  • final int ordinal()

    Liefert die zur Konstanten gehörige ID. Im Allgemeinen ist diese Ordinalzahl nicht wichtig, aber besondere Datenstrukturen wie EnumSet oder EnumMap nutzen diese eindeutige ID. Die Reihenfolge der Zahlen ist durch die Reihenfolge der Angabe gegeben.

  • final boolean equals(Object other)

    Die Oberklasse Enum überschreibt equals(…) mit der Logik wie in Object – also den Vergleich der Referenzen –, um sie als final zu markieren.

  • protected final Object clone() throws CloneNotSupportedException

    Die Methode clone() ist final protected und kann also weder überschrieben noch von außen aufgerufen werden. So kann es keine Kopien der Enum-Objekte geben, die die Identität gefährden könnten. Grundsätzlich ist es aber erlaubt, dass eigene Implementierungen von clone() die this-Referenz liefern.

  • final int compareTo(E o)

    Da die Enum-Klasse die Schnittstelle Comparable implementiert, gibt es auch die Methode compareTo(…). Sie vergleicht anhand der Ordinalzahlen. Vergleiche sind nur innerhalb eines Enum-Typs erlaubt.

  • final Class<E> getDeclaringClass()

    Liefert das Class-Objekt von der Aufzählungsklasse zu einem konkreten Enum. Achtung: Die Methode liefert, auf der Aufzählungsklasse selbst angewendet, null. Nur auf den Elementen der Aufzählung liefert sie einen sinnvollen Wert. So wäre Weekday.class.getDeclaringClass() gleich null, aber Weekday.MONDAY.getDeclaringClass() wie gewünscht com.tutego.weekday.Weekday.

[»]  Hinweis

Vom Class-Objekt ist die Methode getEnumConstants() noch interessant, denn auch sie gibt wie values() ein Array mit allen Einträgen zurück. Der Vorteil bei Nutzung des Class-Objekts ist jedoch, dass es allgemein ist; der Aufruf der statischen values()-Methode ist immer mit der Klasse verbunden, getEnumConstants() funktioniert bei jedem Class-Objekt, und selbst wenn es keine Aufzählungsklasse repräsentieren sollte, ist die Rückgabe null.

 

Zum Seitenanfang

10.7.2    Aufzählungen mit eigenen Methoden und Initialisierern * Zur vorigen ÜberschriftZur nächsten Überschrift

Da ein enum-Typ eine besondere Form der Klassendeklaration ist, kann er ebenso Attribute, Methoden, statische bzw. Objekt-Initialisierer und Konstruktoren deklarieren. Jede Aufzählung hat automatisch Methoden wie name() und ordinal(), und Entwickler können auch eigene hinzufügen.

Country mit zusätzlicher Klassenmethode

Ein Aufzählungstyp kann statische Methoden besitzen. Diese Methoden können auf statische Eigenschaften des Aufzählungstyps zugreifen und zum Beispiel Konstanten auswählen. values() ist so eine gegebene statische Methode, die ein Array aller Aufzählungselemente liefert.

[zB]  Beispiel

Deklariere eine Aufzählung Country und zwei statische Methoden, sodass Country.getDefault() GERMANY liefert und Country.random() ein Zufallsland:

public enum Country {

GERMANY, UK, CHINA;

public static Country getDefault() { return GERMANY; }

public static Country random() { return values()[ (int)(Math.random()*3 ) ]; }

}

Zusätzliche statische Initialisierer

Blöcke der Art static { } sind im Rumpf eines Aufzählungstyps erlaubt. Lädt die Laufzeitumgebung einer Klasse, initialisiert sie der Reihe nach alle statischen Variablen bzw. führt die static-Blöcke aus. Die Aufzählungen sind statische Variablen und werden beim Laden initialisiert. Steht der statische Initialisierer hinter den Konstanten, so wird auch er später aufgerufen als die Konstruktoren, die vielleicht auf statische Variablen zurückgreifen wollen, die der static-Block initialisiert. Ein Beispiel:

public enum Country {



GERMANY, UK, CHINA;



{

System.out.println( "Objektinitialisierer" );

}



static {

System.out.println( "Klasseninitialisierer" );

}



private Country() {

System.out.println( "Konstruktor" );

}



public static void main( String[] args ) {

System.out.println( GERMANY );

}

}

Die Ausgabe ist:

Objektinitialisierer

Konstruktor

Objektinitialisierer

Konstruktor

Objektinitialisierer

Konstruktor

Klasseninitialisierer

GERMANY

Die Ausführung und Ausgabe hängt von der Reihenfolge der Deklaration ab, und jede Umsortierung führt zu einer Verhaltensänderung. Jetzt könnten Programmierer auf die Idee kommen, mögliche static-Blöcke an den Anfang zu setzen, vor die Konstanten. Meine Leser sollten das Ergebnis testen … Auf Konstruktoren kommen wir gleich noch zu sprechen.

Country mit zusätzlicher Objektmethode

Geben wir einer Aufzählung Country eine Methode, die den ISO-3166-2-Landescode des jeweiligen Aufzählungselements liefert:

Listing 10.38    src/main/java/com/tutego/insel/enums/Country.java, Ausschnitt

public enum Country {



GERMANY, UK, CHINA;



public String getISO3Country() {

switch ( this ) {

case GERMANY : return "DEU";

case UK : return "GBR";

default : return "CHN";

}

}

}

Die Methode getISO3Country() kann nun auf der Aufzählung aufgerufen werden:

System.out.println( Country.CHINA.getISO3Country() ); // CHN

Die switch-Anweisung ist auf Aufzählungen erlaubt, das ist komfortabel. Schreiben wir ein kleines Demoprogramm:

Listing 10.39    src/main/java/com/tutego/insel/enums/CountryEnumDemo.java, Ausschnitt

Country c = Country.GERMANY;



switch ( c ) {

case GERMANY:

System.out.println( "Aha. Ein Krauti" ); // Aha. Ein Krauti

System.out.println( c.getISO3Country() ); // DEU

break;

default:

System.out.println( "Anderes Land" );

}
 

Zum Seitenanfang

10.7.3    enum mit eigenen Konstruktoren * Zur vorigen ÜberschriftZur nächsten Überschrift

Neben der ersten Variante für getISO3Country() wollen wir eine zweite Implementierung nutzen und nun Konstruktoren hinzuziehen, um das gleiche Problem auf andere Weise zu lösen:

Listing 10.40    src/main/java/com/tutego/insel/enums/Country2.java, Ausschnitt

public enum Country2 {



GERMANY( "DEU" ),

UK( "GBR" ),

CHINA( "CHN" );



private String iso3Country;



Country2( String iso3Country ) {

this.iso3Country = iso3Country;

}



public String getISO3Country() {

return iso3Country;

}

}

Bei der Deklaration der Konstanten wird in runden Klammern ein Argument für den Konstruktor übergeben. Der Konstruktor speichert den String in der internen Variablen iso3Country, auf die dann getISO3Country() Bezug nimmt.

[»]  Hinweis

Konstruktoren von Aufzählungstypen sind immer automatisch privat und können auch keine andere Sichtbarkeit besitzen. Das ist logisch, denn die Konstruktoren sollen von außen nicht aufgerufen werden können. Die Methoden können durchaus unterschiedliche Sichtbarkeiten haben.

enum mit überschriebenen Methoden

In dem Aufzählungstyp lassen sich nicht nur Methoden hinzufügen, sondern auch Methoden überschreiben. Beginnen wir mit einer lokalisierten und überladenen Methode toString():

Listing 10.41    src/main/java/com/tutego/insel/enums/WeekdayInternational.java, Ausschnitt

public enum WeekdayInternational {



SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;



@Override

public String toString() {

return toString( Locale.getDefault() );

}



public String toString( Locale l ) {

return new SimpleDateFormat( "", l ).getDateFormatSymbols()

.getWeekdays()[ ordinal() + 1 ];

}

}

Die erste Methode ist aus unserer Oberklasse Object überschrieben, die zweite als überladene Methode hinzugefügt. Ein Beispiel macht den Aufruf und die Funktionsweise klar:

Listing 10.42    src/main/java/com/tutego/insel/enums/WeekdayInternationalDemo.java, Ausschnitt

System.out.println( WeekdayInternational.SATURDAY ); 

// Samstag

System.out.println( WeekdayInternational.SATURDAY.toString() );

// Samstag

System.out.println( WeekdayInternational.SATURDAY.toString(Locale.FRANCE) );

// samedi

System.out.println( WeekdayInternational.SATURDAY.toString(Locale.ITALY) );

// sabato

An dieser Stelle hören die Möglichkeiten der enum-Syntax aber noch nicht auf. Ähnlich wie die Syntax von inneren anonymen Klassen, die es erlauben, Methoden zu überschreiben, bieten Aufzählungstypen eine vergleichbare Syntax, um gezielt Methoden für eine spezielle Konstante zu überschreiben.

Nehmen wir an, in einem Spiel gibt es eine eigene Währung, den Ponro-Dollar. Nun soll dieser aber zu einer Referenzwährung, dem Euro, in Beziehung gesetzt werden; der Wechselkurs ist einfach 1:2:

Listing 10.43    src/main/java/com/tutego/insel/enums/GameCurrency.java, Ausschnitt

public enum GameCurrency {



EURO() {

@Override public double convertTo( GameCurrency targetCurrency, double value ) {

return targetCurrency == EURO ? value : value / 2;

}

},

PONRODOLLAR() {

@Override public double convertTo( GameCurrency targetCurrency, double value ) {

return targetCurrency == PONRODOLLAR ? value : value * 2;

}

};



public abstract double convertTo( GameCurrency targetCurrency, double value );

}

Der interessante Teil ist die Deklaration der abstrakten convertTo(…)-Methode und die lokale Implementierung bei den einzelnen Konstanten. (Natürlich müssen wir nicht jede Methode im enum abstrakt machen, sondern sie kann auch konkret sein. Dann muss nicht jedes enum-Element die abstrakte Methode implementieren.)

Mit einem statischen Import für die Aufzählung lässt sich die Nutzung und Funktionalität schnell zeigen:

Listing 10.44    src/main/java/com/tutego/insel/enums/GameCurrencyDemo.java, Ausschnitt

System.out.println( EURO.convertTo( EURO, 12 ) );               // 12.0

System.out.println( EURO.convertTo( PONRODOLLAR, 12 ) ); // 6.0

System.out.println( PONRODOLLAR.convertTo( EURO, 12 ) ); // 24.0

System.out.println( PONRODOLLAR.convertTo( PONRODOLLAR, 12 ) ); // 12.0

enum kann Schnittstellen implementieren

Die API-Dokumentation von Enum zeigt an, dass die abstrakte Klasse zwei Schnittstellen implementiert: Comparable und Serializable. Jede in enum deklarierte Konstante ist eine Unterklasse von Enum, also immer vergleichbar und standardmäßig serialisierbar. Neben diesen Standardschnittstellen kann ein enum andere Schnittstellen implementieren. Das ist sehr nützlich, denn so schreibt es für alle Aufzählungselemente ein bestimmtes Verhalten vor – jedes Aufzählungselement bietet dann diese Operationen. Die Operationen der Schnittstelle können auf zwei Arten realisiert werden: Das enum selbst implementiert die Operationen der Schnittstelle im Rumpf, oder die einzelnen Aufzählungselemente realisieren die Implementierungen jeweils unterschiedlich. Oftmals dürfte es so sein, dass die Elemente unterschiedliche Implementierungen bereitstellen.

Unser nächstes Beispiel für ein enum DefaultIcons implementiert die Schnittstelle Icon für grafische Symbole. Da die Symbole alle die gleichen Ausmaße haben, sind die Icon-Operationen getIconWidth() und getIconHeight() immer gleich und werden nur einmal implementiert; die tatsächlichen paintIcon(…)-Implementierungen (die hier nur angedeutet werden) unterscheiden sich.

Listing 10.45    src/main/java/com/tutego/insel/enums/DefaultIcons.java, Ausschnitt

public enum DefaultIcons implements Icon {



WARNING {

@Override public void paintIcon( Component c, Graphics g, int x, int y ) {

// g.drawXXX()

} },

ERROR {

@Override public void paintIcon( Component c, Graphics g, int x, int y ) {

// g.drawXXX()

} };



@Override public int getIconWidth() { return 16; }



@Override public int getIconHeight() { return 16; }

}

Der Zugriff DefaultIcons.ERROR gibt ein Objekt, das unter anderem vom Typ Icon ist und an allen Stellen übergeben werden kann, an denen ein Icon gewünscht ist.

 


Ihre Meinung?

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Java ist auch eine Insel Java ist auch eine Insel

Jetzt Buch bestellen


 Buchempfehlungen
Zum Rheinwerk-Shop: Captain CiaoCiao erobert Java

Captain CiaoCiao erobert Java




Zum Rheinwerk-Shop: Java SE 9 Standard-Bibliothek

Java SE 9 Standard-Bibliothek




Zum Rheinwerk-Shop: Algorithmen in Java

Algorithmen in Java




Zum Rheinwerk-Shop: Objektorientierte Programmierung

Objektorientierte Programmierung




 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und in die Schweiz

InfoInfo



 

 


Copyright © Rheinwerk Verlag GmbH 2021

Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.

Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

 

[Rheinwerk Computing]



Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de



Cookie-Einstellungen ändern