Java Object

port29

deus.Server
Hallo Leute,

einmal kurz vorab: Ich komme eigentlich aus der C# Welt, wo ich daran gewöhnt bin, dass alles von "Object" abgeleitet wird. Aber soweit ich weiß, gibt / gab? es bei Java eine Trennung zwischen den Datentypen.

Denn soweit ich weiß gab es bei Java primitive Datentypen wie byte, short, int, float, double, etc. (alles kleingeschrieben) und diese Datentypen waren neben anderen von Object abgeleiteten Datentypen vorhanden.

Code:
int abc = 5;
Object bla = abc;

Doch nun habe ich heute die oben beschriebene Zeile gesehen. Doch was genau steckt in den beiden Zeilen? Wird abc zuerst als (Integer) gecastet und dann dem bla Object zugewiesen? Oder ist int nun auch von Object abgeleitet?

Und nun habe ich noch eine andere Frage zum GC und primitiven Typen. Nehmen wir mal an, ich habe folgende ganz tolle methode

Code:
public void nix(){
int i=1;
Object j = new Object()
}

Also bei j weiß ich, dass ein neues Object entstanden ist und im Speicher auch bleibt, nachdem die methode durchgelaufen ist. Irgendwann wenn der GC läuft, wird dieses Object gelöscht. Aber wie ist es mit i?
 
Zu deiner ersten Frage gibts folgende einfach Antwort:
Java:
public static void main(String[] args) throws Exception {
	int abc = 5;
	Object bla = abc;
	System.out.println(bla.getClass());
}

Ausgabe:
class java.lang.Integer

Seit Java 1.5 gibt es Autoboxing/Unboxing wodurch primitive wenn benötigt in ihre entsprechenden Wrapper-Objekte umgewandelt werden. Siehe auch: http://www.galileocomputing.de/open...03_008.htm#mjec4af6307bfc36ef8f2fb6eaac599701

Auch i wird direkt weggeräumt, denn i wird nur in dieser Methode verwendet. Übergibst du i an eine andere Methode wird es kopiert (Call-by-value).
 
Hallo,

Also eigentlich wird alles erst weggeräumt, wenn der GC aktiv wird. Vorausgesetzt, dass es keine Referenz auf das Object gibt.

MFG

Sascha
 
Also eigentlich wird alles erst weggeräumt, wenn der GC aktiv wird. Vorausgesetzt, dass es keine Referenz auf das Object gibt.

Sorry, ich habe es aber immernoch nicht 100%ig verstanden.

Also es gibt zwei Arten von Datentypen. Einmal die primitiven (die keine Methoden implementiert haben) und die von Object abgeleiteten, komplexen Datentypen. Aber wieso werden die Daten eigentlich standardmäßig per Call by Value übergeben und nicht wie bei komplexen Datentypen per Call by Reference?
 
Ich kann dir keinen Grund nennen, aber ich kenne das nur so. Es ist ja nicht nur bei Java so.

MFG

Sascha
 
Übergibst du i an eine andere Methode wird es kopiert (Call-by-value).

Das ist nicht ganz richtig. Java ist da etwas eigen - das ist weder call by reference noch call by value. Du kannst nämlich problemlos die Referenz verändern und die Änderung schläg auch nach aussen durch. Was nur nicht geht, ist die Referenz auszutauschen. Das ganze ist also ähnlich wie bei "final".
Java:
public class Foo {

    private String name;


    public Foo(String name) {

        this.name = name;
    }


    public void setName(String name) {

        this.name = name;
    }


    public String toString() {

        return "Foo: " + name;
    }


    public static void resetNameBySetter(Foo foo) {

        foo.setName("");
    }


    public static void resetNameByChangingReference(Foo foo) {

        foo = new Foo("");
    }


    public static void main(String[] args) {

        Foo foo = new Foo("bar");

        Foo.resetNameBySetter(foo);
        System.out.println(foo);

        foo = new Foo("bar");

        Foo.resetNameByChangingReference(foo);
        System.out.println(foo);
    }
}

Wenn man das Autoboxing mit in Betracht zieht kann man für primitive Datentypen ebenso argumentieren. Jedes int ist automatisch ein Integer. Deshalb wäre die Zuweisung i = 5 äquivalent zu i = new Integer(5). Austauschen der Referenz geht aber nicht, daher sieht das aus wie call by value.

Alle Klarheiten beseitigt? ;)

REINHAUN!
 
Zurück