Wrapperklassen und Primitivtypen

Status
Nicht offen für weitere Antworten.

Illuvatar

Top Contributor
In letzter Zeit kamen häufiger Fragen wie "Was ist der Unterschied zwischen Integer und int" oder "Wofür sind Klassen wie Integer, Character und Double gut".
Hier die Erklärung:

Die Typen byte, short, int, long, double, float, boolean und char sind als einzige Ausnahmen in Java nicht objektorientiert, sondern sogenannte primitive Datentypen. Es gibt auch Programmiersprachen wie Eiffel, in denen auch solche Datentypen Objekte sind.
Primitivdatentypen werden "Call by Value" übergeben, d.h.:
Code:
public class CallByValue
{
  public static void main (String[] args)
  {
    int i = 5;
    inc (i);
    System.out.println (i);  //Ausgabe: 5
  }
  private static void inc (int a)
  {
    a++; //Die alte Variable wird nicht verändert
  }
}

Es gibt aber auch die Klassen Byte, Short, Integer, Long, Double, Float, Character und Boolean im Paket java.lang. Sie haben immer eine Primitivvariable des jeweiligen Typs als Membervariable. ßber diese Klassen können auch Strings in andere Darentypen umgewandelt werden. Man kann sich die Klasse vereinfacht so vorstellen:
Code:
public class Integer
{
  private int i;
  public Integer (int i)
  {
    this.i = i;
  }
  public int intValue()
  {
    return i;
  }
}
Da diese Klassen Objekte sind, wird das Objekt übergeben, es wird nicht kopiert. Leider haben sie keine Möglichkeit, den int-Wert zu verändern, deshalb benutze ich zur Verdeutlichung eine eigene Klasse:
Code:
public class CallByReference //Ist kein Call by Reference, siehe Deathbyaclowns Beitrag
{
  public static void main (String[] args)
  {
    int i = 5;
    Integer integ = new Integer (i);
    inc (integ);
    i = integ.intValue();
    System.out.println (i); //Ausgabe: 6
  }
  public static void inc (Integer i)
  {
    i.setValue (i.intValue() + 1); //Das Objekt wird verändert
  }
}
class Integer //Die Hilfsklasse
{
  private int i;
  public Integer (int i)
  {
    this.i = i;
  }
  public int intValue()
  {
    return i;
  }
  public void setValue (int i)
  {
    this.i = i;
  }
}

ßbrigens: die Klassen haben auch immer eine native statische innere Klasse mit dem Namen TYPE, der in der Reflections-API den Primitivtyp repräsentiert.
 
B

bygones

Gast
Anmerkung:
Java kennt kein "Call by reference" !
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben