Mit einer Klasse Objekte für eine andere Klasse erstellen.

New2Java

Grünschnabel
Hallo, folgendes Problem.

Ich habe eine Klasse mit:
Code:
public Room(int Bla, String Blub, String Blob, int Ic, int Jc)

und eine zweite Klasse mit:
Code:
public Area(int Bla, String Blub, String Blob)




In der Klasse "Area" sollen 16 Objekte für die Klasse Room erzeugt werden.


Code:
public void create()
    {
       
     Room[] r = new Room[5]; 
     for (int i=0; i < 4; i++) {
     for (int j=0; j < 4; j++)  {
     r[i] = new Room(0, "0", "0",i,j);
     System.out.print(new Room(0, "0", "0",i,j));

                                }
                               }
    }

Als Ausgabe bekomme ich:
Room@54a6af6e
Room@4f2b3349
......
Ist diese Ausgabe normal?

Ich hätte es mir eher so vorgestellt:
Room@00000
Room@00001
Room@00002
Room@00003
Room@00010
....

Aber habe ich mit diesem Code wirklich Objekte der Art Room(0, "0", "0",i,j) erstellt?

Bzw. wie kann ich nun auf die einzelnen Objekte zugreifen?
Schließlich kann ich sie mit
Code:
int c= j*4+i+1
als {1;2;3;4;...} eindeutig erkennen.


Gruß New2Java
 
Du erstellst sogar 2 neue Room Objekte.
Java:
 r[i] = new Room(0, "0", "0",i,j);
     System.out.print(new Room(0, "0", "0",i,j));
somit ist das in der Ausgabe ein anderes als das was du ins Array steckst.
2. ist die Ausgabe das Objekt und nicht das was du sehen willst. Du koenntest in deiner Room Klasse eine toString Methode erstellen. In der du dann die Variablen ausgibst.
Java:
System.out.print("Bla: " + bla + " Blub: " + blub);
Und dann nach deiner Zuweisung im Array das neue Objekt ausgeben mit der toString Methode
Java:
 r[i] = new Room(0, "0", "0",i,j);
     System.out.print((r[i]).toString());
Habs jetzt mal so hingeschrieben und net getestet, aber so in etwa duerfte es das sein was du sehen wolltest? Das beantwortet dann auch direkt wie du auf die einzelnen Objekte zugreifen kannst
r[i], wobei i die Stelle im Array ist.

Noch ne Sache du schreibst 4 mal auf die gleiche Stelle im Array. Da sich in der 2. for-Schleife dein i nicht aendert.
 
Also mein funktion zum erstellen von 16 neuen Objekten namens Raum in der Klasse Area, sieht wie folgt aus:

PHP:
public void create()
    //erstellt 16 Räume
    {
       
     Room[][] r = new Room[5][5]; 
     for (int i=0; i < 4; i++) {
     for (int j=0; j < 4; j++)  {
     int c= j*4+i+1;
     r[i][j] = new Room(0, "0", "0",i,j);
     System.out.print("[Room " + i + "/"+ j+ "] mit id:" + c + "  ");
     System.out.print((r[i][j]).toString());

                                }
     System.out.println();
                               }
    }


PHP:
System.out.print((r[i][j]).toString());
gibt das gleiche aus wie
PHP:
System.out.print((r[i][j]));
nämlich
Code:
Room@23309e87
.

Muss ich erst eine Funktion toString() erstellen, eigentlich gibt die Funktion toString() das Objekt doch als String aus und ist in Java implementiert?


Meine Klasse Room sieht wie folgt aus:

PHP:
public class Room
{
    private int a;
    private String b;
    private String c;
    private int i;
    private int j;

    public Room(int A, String B, String C, int I, int J)
    {
        a = A;
        b = B;
        c = C;
        i = I;
        j = J;
    }}


Ich habe die Befürchtung, das i und j bei den neuen Räumen verloren gehen bzw. das Objekt gar nicht richtig in der Schleife aufgefüllt wird?!


Gruß New2Java.
 
Als Ausgabe bekomme ich:
Room@54a6af6e
Room@4f2b3349
......
Ist diese Ausgabe normal?

Ich hätte es mir eher so vorgestellt:
Room@00000
Room@00001
Room@00002
Room@00003
Room@00010
....

Mach dir keine Sorgen die Ausgabe passt so wie sie ist.
Der Teil nach dem @ ist nämlich keine Nummerierung der einzelnen Objekte sondern der Hashwert der Objekte, der zur Identifizierung und auch zum Vergleichen benutzt wird.
Denn zwei Instanzen sind nur dann identisch wenn auch der Hashwert identisch ist.
 
DDu koenntest in deiner Room Klasse eine toString Methode erstellen. In der du dann die Variablen ausgibst.
Java:
System.out.print("Bla: " + bla + " Blub: " + blub);
[...]

Muss ich erst eine Funktion toString() erstellen, eigentlich gibt die Funktion toString() das Objekt doch als String aus und ist in Java implementiert?
Anscheinend net gut gelesen? Wie ich sagte, du musst dann eine toString erstellen um die Ausgabe so zu haben wie du sie moechtest.
Ansonsten koenntest du auch getter erstellen und dann in deiner System out einfach
Code:
(r[i][j]).getI(), (r[i][j]).getA()
etc machen. In deiner Room Klasse koennte dann auch eine Methode getID sein in dieser gibst du das Ergebnis aus j*4+i+1; zurueck. :)

PS: In deiner Klasse Room solltest du darauf achten, dass man variablen in Java klein schreibt.


EDIT: Achja, die API hilft :D Java Object
 
Zuletzt bearbeitet:
Hier mal mein neuer Code mit der Erstellung neuer Objekte einer Klasse, als nächstes versuche ich es mit erstellen von Objekten einer anderen Klasse.


PHP:
public class Area
{
    private int a;
    private String bla;
    private String blub;
    private int i;
    private int j;
    private int c;
    

    Area(int a, String bla, String blub, int i, int j, int c){
        this.a = a;
        this.bla = bla;
        this.blub = blub;
        this.i = i;
        this.j = j;
        this.c = c;
    }


    @Override
    public String toString(){
        return 
          "Objektnummer:[" + a + "]" 
        + "  Name:[" + bla + "]" 
        + "  Beschreibung:[" + blub + "]"
        + "  Koordinaten[" + i + "/" + j + "]"
        + "  ID in Area:[" + c + "]";
    }


    public static void main(String[] args)
    {
       
     Area[][] r = new Area[5][5]; 
     for (int i=0; i < 4; i++) {
     for (int j=0; j < 4; j++)  {
     int c= j*4+i+1;
     r[i][j] = new Area(0, "Name", "Desc", i, j, c);

     System.out.print((r[i][j]).toString());

                                }
     System.out.println();
                               }
    }


}

Gruß New2Java
 
Zuletzt bearbeitet:
Okay alles klar, ich habe es hinbekommen.


PHP:
public class Room
{

    private int a;
    private String b;
    private String d;
    private int i;
    private int j;
    private int c;


    public Room(int a1, String b1, String d1, int i1, int j1, int c1)

    {
        this.a = a1;
        this.b = b1;
        this.d = d1;
        this.i = i1;
        this.j = j1;
        this.c = c1;
    }

    
    public int a() {return a;}
    public String b() {return b;}
    public String d() {return d;}
    public int i() {return i;}
    public int j() {return j;}
    public int c() {return c;}
       
       
    @Override
    public String toString(){
        return 
          "Objektnummer:[" + a() + "]" 
        + "  Name:[" + b() + "]" 
        + "  Beschreibung:[" + d() + "]"
        + "  Koordinaten[" + i() + "/" + j() + "]"
        + "  ID in Area:[" + c() + "]";

    }

    

}

PHP:
public class Area
{

    private Room room;
    
    public static void main(String[] args)
    {
       
     Room[][] r = new Room[5][5];
     int c = 1;
     for (int i=0; i < 4; i++) {
     for (int j=0; j < 4; j++, c++)  {
     r[i][j] = new Room(0, "Name", "Desc", i, j, c);

     System.out.println(r[i][j].toString());

                                }
     System.out.println();
                               }
    }


}


Dann werde ich mal als nächstes probieren auf die einzelnen Objekte zuzugreifen.

Gruß New2Java
 
Zuletzt bearbeitet:
Okay ich verzweifel wieder ein wenig...

ich möchte jetzt die arrays in einer Methode ausgeben, aber wie?

PHP:
public class Area
{
    private int id;
    private String name;
    private String description;
    private Room room;
    
    
    public Area(int id, String name, String description)

    {
        this.id = id;
        this.name = name;
        this.description = description;


                int n = 4;  
                Room[][] r = new Room[n][n];
                int c = 1;
                for (int i=0; i < n; i++) 
                {
                        for (int j=0; j < n; j++)  
                        {    c=i*4+j+1;
                             r[i][j] = new Room(0, "name", "description", i, j, c);
                        }
                }
    }
    
    public int     id()          {return id;}
    public String  name()        {return name;}
    public String  description() {return description;}   

    

    public void look()
    {
        int n = 4;  
        int c = 1;
        for (int i=0; i < n; i++) 
                {
                        for (int j=0; j < n; j++, c++)  
                        {
                            System.out.println(r[i][j].toString());
                        }
                     System.out.println();
                }
    }

}


Wie kann ich dem compiler klar machen, was ich mit r[i][j] in der Methode meine :D?


MfG New2Java
 
Hi,

Die Variable "r" existiert weder global noch in der Methode.
Eines von beiden musst ändern. ;)

EDIT: Die beiden Variablen "n" und "c" in deiner look-Methode sind unnötig.
Du kannst auch einfach in der ersten for-Schleife
Java:
i < r.length
und in der zweiten
Java:
j < r[i].length
schreiben.

Gruß,
Martin
 
c und n stehen nur da wegen copy&paste :p

Ich weiß, dass das genau das Problem. Ich weiß nicht wie ich r definieren soll! Mir fehlt einfach die Grundlage dafür...

Ich kann doch nicht einfach...

PHP:
Room[][] r;
...da hinhauen, dann gibt er mir auf jedenfall eine NullPointerException als Fehler

Ein Moment ich poste gleich.. ich glaube der Fehler liegt bei
PHP:
Room[][] r = new Room[n][n];

Gruß New2Java
 
Zuletzt bearbeitet:
Zurück