Instanzen, wann muss ich Instanzen erzeugen & wo?)

Codix

Bekanntes Mitglied
Ist diese Aussage korrekt? (nur das fettgedruckte)

Wenn man eine nichtstatische Methode hat (die man in der z.B. public class erstellt), dann muss man eine Instanz der Methode erzeugen (in der main class).


Um eine Instanz zu erzeugen, legen wir eine Variable mit dem Typ der Klasse an.

Das Erzeugen der Instanz erfolgt mit dem Operator "new", dem Namen der Klasse und den () Klammern.

Der Zugriff auf die Methoden erfolgt durch den Bezeichner der Variablen für die Instanz, einen trennenden Punkt und den Namen der Methoden.
Einen direkten Zugriff von aussen auf die Instanzvariablen sollten Sie nach Möglichkeit vermeiden.
=
Klassenmethoden gehören nicht zu einer Instanz, sondern zur Klasse an sich. Klassenmethoden lassen sich deshalb auch ohne Instanz aufrufen.
In Klassenmethoden können Sie nur auf Klassenvariablen bzw. lokale Variablen zugreifen.
 
Man kann Instanzen von Klassen erzeugen, nicht von Methoden. Also: Nein, ist nicht korrekt.
Nur von Klassen oder auch von Variablen?

D.h. man muss Instanzen von Klassen (nicht main Klassen, sondern public class) erzeugen, um mit in der Klasse angelegten Methoden, in der main Klasse arbeiten zu können, um sie dort aufrufen zu können über die Instanz der Klasse?
 
Nicht ganz korrekt. Eine Methode wird nicht instanziert. Aber Objekte werden instantiert, das ist richtig.

Beispiel: Du kannst keine Methode gehUndBringMirKaffee() erzeugen, das ist Unsinn.
Du kannst aber ein Objekt der Klasse Butler instantieren, und auf diesem die Methode anwenden, und das Butlerobjekt geht und bringt dir Kaffee.
 
Nicht ganz korrekt. Eine Methode wird nicht instanziert. Aber Objekte werden instantiert, das ist richtig.

Beispiel: Du kannst keine Methode gehUndBringMirKaffee() erzeugen, das ist Unsinn.
Du kannst aber ein Objekt der Klasse Butler instantieren, und auf diesem die Methode anwenden, und das Butlerobjekt geht und bringt dir Kaffee.

und was hat der code:

Code:
int getRandomNumber(){
    return 4;    //choosen by dice roll
}                //guaranteed to be random

damit zu tun?
 
ja.
Um eine Instanz zu erzeugen, legen wir eine Variable mit dem Typ der Klasse an.
Sind das nur Variablen? Was ist mit primitiven Datentypen? Das sind auch Variablen.

Ok:
Eine Variable ist einfach nur ein Stück Speicher, auf dem du schreiben und lesen kannst. Mehr nicht. Speicher wird nicht instantiert (allenfalls wird Speicher alloziiert, d.h. beim Betriebssystem angefragt und von diesem evt. freigegeben, aber damit hast du in Java normalerweise nichts zu tun).

In Java ist es so: Du selber kommst an ein Objekt eigentlich gar nicht heran. Das, was in der Objektvariable steht, ist lediglich eine Referenz auf das Objekt, aber nicht das Objekt selber.


Edit:
Klassen werden instantiiert und da kommen dann Objekte raus.
Ähm...stimmt. Mea culpa.
 
Vielleicht wird es damit etwas deutlicher:

Java:
public class ClassWithInt{
    private int i;
   
    public ClassWithInt(int i){
        this.i = i;
    }
   
    public int getI(){return i;}
}

public static void main(String args[]){
    ClassWithInt someObject;
    ClassWithInt seccondReference;
   
    //Instanciate some objects
    someObject = new ClassWithInt(7);
   
    //Copy the object reference to another object variable
    seccondReference = someObject;
   
    //What does the new object variable do?
    System.out.println(seccondReference.getI());    //Another object variable, but same object
}

Edit:
Ansonsten ist dieses Thema auch sehr gut in "Java von Kopf bis Fuß" aufgearbeitet. Ich kann dir nur raten, es mal zu lesen.
 
danke für alle Antworten, ihr seid mir um Einiges voraus.
Vielleicht wird es damit etwas deutlicher:

Java:
public class ClassWithInt{
    private int i;
  
    public ClassWithInt(int i){
        this.i = i;
    }
  
    public int getI(){return i;}
}

public static void main(String args[]){
    ClassWithInt someObject;
    ClassWithInt seccondReference;
  
    //Instanciate some objects
    someObject = new ClassWithInt(7);
  
    //Copy the object reference to another object variable
    seccondReference = someObject;
  
    //What does the new object variable do?
    System.out.println(seccondReference.getI());    //Another object variable, but same object
}

Edit:
Ansonsten ist dieses Thema auch sehr gut in "Java von Kopf bis Fuß" aufgearbeitet. Ich kann dir nur raten, es mal zu lesen.

Hast du das Buch "Java von Kopf bis Fuß" als PDF? Ich würde es gern kaufen.
 
Nein. Wenn du eine Klasse instantierst, belegst du z.B. auch Speicher für Membervariablen.

Wenn du nur die Methode einer Klasse brauchst solltest du die Methode als static deklarieren, dann mußt du keine Klasse instanzieren.
 
Nein. Wenn du eine Klasse instantierst, belegst du z.B. auch Speicher für Membervariablen.

Wenn du nur die Methode einer Klasse brauchst solltest du die Methode als static deklarieren, dann mußt du keine Klasse instanzieren.

und wo soll ich dann die Methode als Klassenmethode = static methode deklarieren? In der main class (Hauptklasse) oder public class?

bitte guck dir den thread: 2dimensionales array, Lagerverwaltung an.
Dort ist eine aufgabe, ich und temi arebeiten an der Lösung der Aufgabe. es geht um Methoden und Instanziierung.

denkst du wir sollten dort die Methoden als statisch deklarieren?

Danke im Voraus
 
Naja, du hast eine Frage gestellt - und eine Antwort erhalten. Das konkrete Problem ist was anderes, und wenn es so einfach wäre dann wäre temi schon von allein draufgekommen. Der kennt sich besser aus als ich. (Hier kennt sich jeder besser mit Java aus als ich, ich hab vom Programmieren eher wenig Ahnung, ich bin aus einer anderen Profession.)

Aber versuche mal das hier laufen zu lassen und zu verstehen, was static eigentlich macht:

Java:
public class ClassWithStaticInteger{
    private static int i;
   
    public ClassWithStaticInteger(int i){
        this.i = i;
    }
   
    public void setStaticInteger(int i){
        this.i = i;
    }
   
    public int getStaticInteger(){
        return i;
    }
}

public static void main(String args[]){
    ClassWithStaticInteger firstObject;
    ClassWithStaticInteger anotherObject;
   
    //Instanciate the first object.
    firstObject = new ClassWithStaticInteger(3);
   
    //Now instanciate another object. The static variable will be overwritten.
    anotherObject = new ClassWithStaticInteger(7);
   
    //And now, look this. Remember, firstObject was instanciated with 3
    System.out.println("Statisches Integer: " + firstObject.getStaticInteger());
}

Nachtrag: Du kannst das static ja mal rausnehmen und nochmal durchlaufen lassen.
 

Zurück
Oben