Primitive Java-Konvertierungen

Java Primitive Conversions

1. Einführung

Java ist eine typisierte Sprache, die das Konzept der Typen verwendet. Es gibt zwei verschiedene Typgruppen:

  1. primitive Datentypen

  2. abstrakte Datentypen.

In diesem Artikel konzentrieren wir uns auf die Konvertierung primitiver Typen.

2. Übersicht der Grundelemente

Das erste, was wir wissen müssen, ist, welche Werte mit primitiven Typen verwendet werden können. Es gibt acht primitive Typen:

  • byte - 8 Bit und vorzeichenbehaftet

  • short - 16 Bit und vorzeichenbehaftet

  • char - 16 Bit und ohne Vorzeichen, damit es Unicode-Zeichen darstellen kann

  • int - 32 Bit und vorzeichenbehaftet

  • long - 64 Bit und signiert

  • float - 32 Bit und vorzeichenbehaftet

  • double - 64 Bit und signiert

  • boolean - es ist nicht numerisch, kann nurtrue oderfalse Werte haben

Dies soll keine ausführliche Diskussion über Grundelemente sein, und wir werden ein wenig mehr über deren Details sprechen, wenn dies während der Konvertierungen erforderlich ist.

3. Primitive Conversions erweitern

Wenn wir von einem Grundelement konvertieren müssen, das einfacher oder kleiner als der Zieltyp ist, müssen wir dafür keine spezielle Notation verwenden:

int myInt = 127;
long myLong = myInt;

Während der Verbreiterung der Konvertierung wird der kleinere Grundwert über einen größeren Container gelegt, was bedeutet, dass der gesamte zusätzliche Platz links vom Wert mit Nullen gefüllt wird. Dies kann auch verwendet werden, um von der Ganzzahlgruppe zum Gleitkomma zu gelangen:

float myFloat = myLong;
double myDouble = myLong;

Dies ist möglich, weil beim Übergang zu einem breiteren Grundelement keine Informationen verloren gehen.

4. Eingrenzen der primitiven Konvertierung

Manchmal müssen wir einen Wert anpassen, der größer ist als der in der Variablendeklaration verwendete Typ. Dies kann zu Informationsverlust führen, da einige Bytes verworfen werden müssen.

In diesem Fall müssen wir ausdrücklich darauf hinweisen, dass wir uns der Situation bewusst sind, und wir stimmen dem zu, indem wir eine Besetzung verwenden:

int myInt = (int) myDouble;
byte myByte = (byte) myInt;

5. Erweiterung und Verengung der primitiven Umwandlung

Diese Situation tritt invery specific case when we want to convert from a byte to a char auf. Die erste Umwandlung ist die Erweiterung derbyte aufint und wird dann von denint aufchar eingegrenzt.

Ein Beispiel soll diesen Punkt verdeutlichen:

byte myLargeValueByte = (byte) 130;   //0b10000010 -126

Die Binärdarstellung von 130 ist für -126 gleich, der Unterschied ist die Interpretation des Signalbits. Konvertieren wir nun vonbyte nachchar:

char myLargeValueChar = (char) myLargeValueByte;
  //0b11111111 10000010 unsigned value
int myLargeValueInt = myLargeValueChar; //0b11111111 10000010 65410

Die Darstellung vonchar ist ein Unicode-Wert, aber die Konvertierung inint zeigte einen sehr großen Wert, dessen untere 8 Bits genau gleich -126 sind.

Wenn wir es erneut inbyte konvertieren, erhalten wir:

byte myOtherByte = (byte) myLargeValueInt; //0b10000010 -126

Der ursprüngliche Wert, den wir verwendet haben. Wenn der gesamte Code mitchar begann, sind die Werte unterschiedlich:

char myLargeValueChar2 = 130; //This is an int not a byte!
  //0b 00000000 10000010 unsigned value

int myLargeValueInt2 = myLargeValueChar2; //0b00000000 10000010  130

byte myOtherByte2 = (byte) myLargeValueInt2; //0b10000010 -126

Obwohl die Darstellung vonbytedieselbe ist, nämlich -126, gibt uns die Darstellung voncharzwei verschiedene Zeichen.

6. Boxing/Unboxing Conversion

In Java haben wir eine Wrapper-Klasse für jeden primitiven Typ. Dies ist eine clevere Methode, um Programmierern nützliche Verarbeitungsmethoden zur Verfügung zu stellen, ohne den Aufwand, alles als Schwergewichts-Objektreferenz zu haben. Seit Java 1.5 wurde die Fähigkeit zur automatischen Konvertierung in / von einem Grundelement in ein Objekt und zurück aufgenommen und durch einfache Zuordnung erreicht:

Integer myIntegerReference = myInt;
int myOtherInt = myIntegerReference;

7. String-Konvertierungen

Alle primitiven Typen können über ihre Wrapper-Klassen, die dietoString()-Methode überschreiben, inString konvertiert werden:

String myString = myIntegerReference.toString();

Wenn wir zu einem primitiven Typ zurückkehren müssen, müssen wir eine Analysemethode verwenden, die durch die entsprechende Wrapper-Klasse definiert ist:

byte  myNewByte   = Byte.parseByte(myString);
short myNewShort  = Short.parseShort(myString);
int   myNewInt    = Integer.parseInt(myString);
long  myNewLong   = Long.parseLong(myString);

float  myNewFloat  = Float.parseFloat(myString);
double myNewDouble = Double.parseDouble(myString);
boolean myNewBoolean = Boolean.parseBoolean(myString);

Die einzige Ausnahme hiervon ist dieCharacter-Klasse, da auf diese Weise ohnehin einString auschars besteht, wenn man bedenkt, dass wahrscheinlich dieString aus einem einzelnencharbestehen. s können wir diecharAt()-Methode derString-Klasse verwenden:

char myNewChar = myString.charAt(0);

8. Numerische Aktionen

Um eine Binäroperation ausführen zu können, müssen beide Operanden hinsichtlich der Größe kompatibel sein.

Es gibt eine Reihe einfacher Regeln:

  1. Wenn einer der Operandendouble ist, wird der andere zudouble heraufgestuft

  2. Wenn andernfalls einer der Operandenfloat ist, wird der andere zufloat heraufgestuft

  3. Wenn andernfalls einer der Operandenlong ist, wird der andere zulong heraufgestuft

  4. Andernfalls werden beide alsint betrachtet

Sehen wir uns ein Beispiel an:

byte op1 = 4;
byte op2 = 5;
byte myResultingByte = (byte) op1 + op2;

Beide Operanden wurden aufint heraufgestuft und das Ergebnis muss erneut aufbyte herabgestuft werden.

9. Fazit

Die Konvertierung zwischen Typen ist eine sehr häufige Aufgabe bei täglichen Programmieraktivitäten. There is a set of rules that govern the ways in which statically typed languages operate those conversions. Die Kenntnis dieser Regeln kann viel Zeit sparen, wenn Sie herausfinden möchten, warum ein bestimmter Code kompiliert wird oder nicht.

Der in diesem Artikel verwendete Code lautetover on GitHub.