Der Datentyp »char« in Java
Einführende Beispiele
Das folgende Programm gibt ein Schriftzeichen aus.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( 'A' ); }}java.lang.System.out
A
Das folgende Programm gibt eine Zahl als Schriftzeichen aus.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( ( char )97 ); }}java.lang.System.out
a
char
Der Datentyp »char« ist ein elementarer Typ. Er umfaßt Werte von 0 bis 65535, die meist als Kennzahlen für Zeichen interpretiert werden.
Datentypen
Liste der hier bekannten Datentypen
boolean elementarer Typ
char elementarer Typ
double elementarer Typ
int elementarer Typ java.lang.String Referenztyp
char -Literale (vereinfacht)
Das Zeichen »'« heißt „Apostroph“ (der Apostroph).
Literale des Datentyps »char« bestehen aus einem Zeichen zwischen Apostrophen und haben die Kennzahl dieses Zeichens als Wert und den Datentyp »char« als ihren Typ.
So ist »'C'« beispielsweise die Kennzahl des Zeichen »C«, also 67, und hat den Datentyp »char«.
- Wir hatten den Begriff „Literal“ früher als Zeichenfolgenliteral, Numerale, oder Wahrheitsliteral definiert. Nun müssen wir diese Definition erweitern:
- Ein Literal ist ein Zeichenfolgenliteral, ein Numerale, ein Wahrheitsliteral, oder ein Zeichenliteral.
char -Werte
Ein char -Werte wird verwendet, wenn genau ein Schriftzeichen angegeben werden soll. Im Gegensatz dazu wird eine Zeichenfolge verwendet, um eine beliebige Anzahl (auch 0 oder 1) von Schriftzeichen anzugeben.
- Wir hatten den Begriff „Wert“ früher als Zeichenfolge, Zahl, oder Wahrheitswert definiert. Diese Definition können wir beibehalten, weil man ein Zeichen auch noch als Zahl auffassen kann, denn das, was man „Zeichen“ nennt, ist ja eigentlich die Kennzahl eines Zeichens. Man könnte aber Zeichen auch als eigene Wertart auffassen und die Definition von Werten erweitern:
- Ein Wert ist eine Zahl, eine Zeichenfolge, ein Wahrheitswert, oder ein Zeichen.
Schlüsselwörter
»char« ist ein Schlüsselwort.
Die bisher behandelte Schlüsselwörter
- »boolean«, »break«, »case«, »char«, »double«, »else«, »import«, »if«, »public«, »return«, »int«, »final«, »static«, »switch«, »void«, »while«
Typbeförderungen
Bei Anwendungen arithmetischer Operatoren (wie Grundrechenarten und Vorzeichen) und Vergleichsoperatoren werden Operanden vom Typ »char« in den Typ »int« „befördert“.
Die Summe zweier ganzzahliger Zahlenwerte vom Typ »int« oder »char« hat daher immer den Typ »int«.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( 'A' );
java.lang.System.out.println( +'A' ); }}java.lang.System.out
A
65
Ausgabe von char -Werten mit println
Die Ausgabemethoden »print« und »println« geben Werte des Typs »char« als Schriftzeichen aus. Daher erscheint bei der Ausgabe des Wertes »'C'« also nicht der Text »67«, sondern das Schriftzeichen »C«.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( 'C' );
java.lang.System.out.println( 'C' + 1 );
java.lang.System.out.println( 'C' + 'C' );
java.lang.System.out.println( "C" + "C" );
java.lang.System.out.println( 2 * 'C' ); }}java.lang.System.out
C
68
134
CC
134
Typerwartungen
Die folgende Tabelle beschreibt, welchen Typ eine Ausdruck haben darf, wenn ein bestimmter Typ erwartet wird.
Dabei sind folgende Kombinationen von erwarteten Typen und Ausdrucktypen möglich:
- Die Typerwartung wird durch einen Parameter gegeben, und der Ausdruck ist ein Argumentausdruck für diesen Parameter.
- Die Typerwartung wird durch eine Variable gegeben, und der Ausdruck soll zur Initialisierung der Variablen dienen ohne zur Zuweisung eines Wertes an die Variable.
- Die Typerwartung wird durch einen Rückgabetyp gegeben, und der Ausdruck soll der Ausdruck einer return-Anweisung sein.
erwarteter Typ Typ eines Ausdrucks double double, int, char
int int, char
char char boolean boolean java.lang.String java.lang.String
Wie man sieht, ist bei Erwartung eines »char«-Ausdrucks im allgemeinen auch nur ein Ausdruck vom Typ »char« zulässig. Bei Erwartung eines »int« oder »double«-Ausdrucks, ist im allgemeinen auch ein Ausdruck vom Typ »char« zulässig.
Der nächst Abschnitt behandelt jedoch noch einige Sonderregeln zu diesem Thema.
Variablen und Werte
Es ist im allgemeinen nicht erlaubt, einen int -Wert in eine Variablen vom Typ »char« zu schreiben, außer die Implementation kann es direkt erkennen, daß der int -Wert als char -Wert darstellbar ist. Außerdem gibt es Sonderregelungen für einige Operatoren wie »+=« und »++«, die es erlauben, daß ein Zwischenergebnis, das gewissermaßen vom Typ »int« ist, einer char-Variablen zugewiesen wird.
Main.java
public final class Main
{
public static void main( final java.lang.String[] args )
{
char c = 65;
char d = 'A' + 'B';
char e = 'A' + 1;
java.lang.System.out.println( c );
java.lang.System.out.println( d );
java.lang.System.out.println( e );
/* char f = 987654321; /* error: possible loss of precision */
/* char g = c + 1; /* error: possible loss of precision */
/* c = c + 1; /* error: possible loss of precision */
c += 1; /* erlaubt wegen Sonderregelung für "+=" */
c++; ++c; /* erlaubt wegen Sonderregelung für "++" */ }}transcript
A
?
B
Empfehlung zur Vermeidung von »char«
Die normalen Buchstaben eines deutschsprachigen Textes einschließlich der Interpunktion und Buchstaben mit den üblichen Akzenten sind Unicode-1 -Schriftzeichen, während neuere Unicode -Versionen auch etwas exotischere Schriftzeichen, wie beispielsweise das musikalische Doppelkreuz, enthalten.
Ein char -Wert (0..65535) kann ein Unicode-1 -Schriftzeichen darstellen (daher der Name »char«). Die Zeichen der aktuellen Unicode -Versionen (ab Unicode 2 von 1996-07) können aber nicht mehr alle mit einem char -Wert dargestellt werden. Die Darstellung aller Unicode -Zeichen ist in Java aber mit einer Zeichenfolge vom Typ »java.lang.String« möglich. Daher sollte in Java möglichst immer der Typ »java.lang.String« verwendet werden, um ein Zeichen darzustellen, und nicht »char«, außer wenn es sicher ist, daß in dem gegebenen Zusammenhang die Unicode-1 -Zeichen ausreichen. Der Datentyp »char« wurde hier aber trotzdem behandelt, weil er manchmal benötigt wird.
- Geht nicht mit allen Unicode -Zeichen an Stelle von »a«
final char ch = 'a';
- Geht mit allen Unicode -Zeichen an Stelle von »a«
final java.lang.String ch = "a";
Wenn es zu erwarten ist, daß das Unicode-1 -Schriftzeichen »a« in dem obigen Beispiel später nicht durch ein Zeichen ersetzt werden soll, das kein Unicode-1 -Schriftzeichen ist, dann kann auch »char« verwendet werden.
Der »(char)«-cast -Operator
Für den »(char)«-cast -Operator gilt das früher für den »(int)«-cast -Operator Gesagte entsprechend (man muß in den Erklärungen zu »(int)« nur »int« durch »char« ersetzen).
Man spricht oft vom „cast -Operator“, wenn man den »(int)«-cast -Operator oder den »(char)«-cast -Operator meint.
- Durch den festgelegten Datentyp wird auch die aufgerufene Methode ausgewählt
java.lang.System.out.println( ( char )65 ); /* A */
java.lang.System.out.println( ( int )65 ); /* 65 */
java.lang.System.out.println( 65 ); /* 65 */ java.lang.System.out.println( ( char )'A' ); /* A */
java.lang.System.out.println( ( int )'A' ); /* 65 */
java.lang.System.out.println( 'A' ); /* A */ java.lang.System.out.println( ( char )( 65 + 1 )); /* B */
java.lang.System.out.println( ( char )( 'A' + 1 )); /* B */
java.lang.System.out.println( ( int )( 65 + 1 )); /* 66 */
java.lang.System.out.println( ( int )( 'A' + 1 )); /* 66 */ Durch den festgelegten Datentyp wird auch die aufgerufene Methode ausgewählt java.lang.System.out.println( ( char )65 ); /* A */
java.lang.System.out.println( ( int )65 ); /* 65 */
java.lang.System.out.println( 65 ); /* 65 */- Der cast erlaubt die Typwandlung
/* error: possible loss of precision
public static char convert( final int x ){ return x; } */
public static char convert( final int x ){ return( char )x; }- Der cast erlaubt die Verwendung eines int-Literals an der Stelle eines char-Parameters
java.lang.System.out.println( java.lang.Character.isHighSurrogate( ( char )65 ));
- Der cast erlaubt die Verwendung einer int-Variablen auf der rechten Seite einer Zuweisung an eine char-Variable
char ch; ch =( char )i;
Prioritäten (vereinfacht)
- Priorität und Assoziativität der bisher behandelten Operatoren
() Eingeklammerter Ausdruck
() ++ -- [] Aufrufoperator, unaere nachgestellte Operatoren
+ - ! (int) (char) ++ -- Unaere vorangestellte Operatoren
L * / % Multiplikation, Division, Divisionsrest
L + - Addition, Subtraktion
L < > <= >= Vergleiche
L == != Gleichheitspruefungen
L && Und
L || Oder
R = = += -= *= /= %= Zuweisung
Verwendung von Methoden
Auf einem Computer hat jedes Zeichen eine Kennzahl. Die Operation »toLowerCase« akzeptiert als Argument die Kennzahl eines Zeichens. Dadurch kann ihr also ein bestimmtes Zeichen mitgeteilt werden.
Wenn der Argumentwert die Kennzahl einer Versalie (eines „großen“ Buchstabens) ist, dann ist das Ergebnis der Operation "Character.toLowerCase( int )" die Kennzahl der entsprechenden Gemeinen (des entsprechenden „kleinen“ Buchstabens), sonst ist der Argumentwert das Ergebnis.
- Dokumentation
Character.toLowerCase [Method Summary]
java.lang
Class Character
public static int toLowerCase( int codePoint )
Converts the character (Unicode code point) argument
to lowercase using case mapping information from the
UnicodeData file.Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( java.lang.Character.toLowerCase( 65 )); }}- Dokumentation
Character.toLowerCase [Method Summary]
java.lang
Class Character
public static char toLowerCase( char ch )
Converts the character argument to lowercase using
case mapping information from the UnicodeData file.Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( java.lang.Character.toLowerCase( 'A' )); }}- Die Überladungen der Methode »toLowerCase« machen den Argumenttyp „transparent“
java.lang.System.out.println( java.lang.Character.toLowerCase(( char )65 ));
java.lang.System.out.println( java.lang.Character.toLowerCase(( int )65 )); java.lang.System.out.println( java.lang.Character.toLowerCase(( char )'A' ));
java.lang.System.out.println( java.lang.Character.toLowerCase(( int )'A' ));
Beispiel Alphabet ausgeben
Das folgende Programm zeigt die Ausgabe der englischen Buchstaben von A bis Z mit einer Zählschleife.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ char ch = 'A'; while( ch <= 'Z' )
java.lang.System.out.print( ch++ );
java.lang.System.out.println(); }}java.lang.System.out
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Die Verwendung der Operatoren »<=« sowie »++« zeigt wieder einmal, daß »char« wirklich ein numerischer Typ ist!
Das folgende Programm zur Ausgabe des Alphabets ist allerdings kürzer!
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ); }}java.lang.System.out
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Übungsaufgaben
/ Zufallszeichen
Geben Sie einen zufälligen kleinen Buchstaben aus dem Bereich von »a« bis »z« (26 Möglichkeiten) aus.
(Wenn man das Programm wiederholt aufruft, sollte nicht immer derselbe Buchstabe ausgegeben werden.)
/ passwords *
Schreiben Sie ein Programm, das bei jedem Aufruf ein password mit 8 Zeichen generiert, jedes Zeichen soll ein zufällig ausgewählter großer oder kleiner Buchstabe oder eine Ziffer sein.
Schreiben Sie eine Methode, die bei jedem Aufruf ein password ausgibt, jedes Zeichen soll ein zufällig ausgewählter Buchstabe a-z sein, und die Länge des passwords soll als Argument beim Aufruf der Methode angegeben werden können.
/ Zeichentabelle *
Geben Sie eine Tabelle aller druckbaren Zeichen mit ihren Kennzahlen (dezimal) aus.
(Druckbare Zeichen sind Schriftzeichen, die durch ein graphisches Symbol repräsentiert werden – im Gegensatz zu Steuerzeichen, wie dem Zeichen "\n" zum Zeilenabschluß.)
Das Programm sol möglichst kurz sein. Es sollen keine speziellen Programmteile für einzelne Zeichen geschrieben werden. Vielmehr soll eine Schleife verwendet werden und die Druckbarkeit mit einem Standardprädikat ermittelt werden.
/ Verschlüsselung
Schreiben Sie eine Methode, die einen Text mit ROT13 verschlüsselt. (Dabei wird jeder Buchstabe durch den Buchstaben ersetzt, der 13 Positionen weiter im Alphabet folgt. A beispielsweise durch N. Nach Z geht es wieder mit A weiter.)