Frage von leonardomessi, 82

java Matrix als klasse (array)?

Hallo.

Ich muss eine Klasse erstellen die ein Zweidimensionales Array kreiert.

Hier ist die klasse.

public class Matrix {

int columns;
int rows;


Matrix(){
}

public Matrix(int rows, int columns){
    Matrix [][] marray = new Matrix[columns][rows];
}

}

Und das ist meine Mainmethode.

public class Matrizen { public static void main(String[]args){ int reihe=5; int saule=5;

    Matrix marray = new Matrix(reihe,saule);
    
    for (int i=0; i<3; i++){
        System.out.println(marray);
    }
}

}

Aber ich kriegs nicht zum laufen. Das Problem scheint beim aufrufen der Klasse zu sein. Der Compiler sagt er kann nicht in Arrays auflösen. Sondern in Matrix. Und wenn er in Matrix macht, klappts aber ich habe irgendwie kein richtiges Array.

Expertenantwort
von KnusperPudding, Community-Experte für Java, 47

Das was du machst: Du erstellst eine Klasse mit dem Namen Matrix. Im Konstruktor der Klasse Matrix erstellst du eine zweidimensionale Array als lokale Variable, die nicht weiter verwendet wird.

Anschließend Rufst du den Konstruktor deiner Matrix Klasse in der Main Methode auf. Und das ist bereits der Denkfehler: Dadurch dass sich die lokale Variable im Konstruktor befindet, wird nicht die gleich die ganze Klasse zu einer zweidimensionalen Array.

Wenn deine Klasse eine zweidimensionale Array 'kreieren' soll, bist du garnicht so weit weg von der Lösung.

Deklariere eine zweidimensionale Array als Instanz-Variable.

Im Konstruktor weist du dieser Instanz-Variable dann deine neue Array zu (mit Anzahl Zeilen und Spalten).

Anschließend nimmst du noch einen Getter der dir die zweidimensionale Array zurück liefert.

Kommentar von leonardomessi ,

Instanz-Variable? Könntest du das bitte etwas erläutern.

Und was ist ein Getter?

Kommentar von Gegengift ,

Das Schöne an grundlegenden Grundlagen ist, dass einem da Millionen Foreneinträge, Tutorials, Bücher etc weiter helfen. Sowas sollte man sich erst mal aneignen. Zumindest erst mal lesen und dann die Fragen stellen.

Kommentar von KnusperPudding ,

Eine Instanz-Variable ist eine nicht-statische Variable innerhalb einer Klasse, die eine Gültigkeit innerhalb einer Instanz hat.

private Matrix[][] matrix;

ein Getter ist eine Methode, welche eine Instanz-Variable zurückliefert.

public Matrix[][] getMatrix() {
    return matrix;
}
Antwort
von Etter, 23

Erstmal sehe ich einige Fehler. Wenn die Methode "Matrix" einen Wert zurückgeben soll, musst du das deklarieren. Außerdem fehlt dann entsprechend der return und ich vermute, dass du die Methode als "static" angeben musst.

"System.out.println(marray);"

Dort versuchst du eine Methode aufzurufen, ohne die Parameterangabe. Oder aber dir fehlen Anführungsstriche.

"Matrix(){}"

Was versuchst du da?

Antwort
von Gegengift, 54
for (int i=0; i<3; i++){
   
System.out.println(marray);
}

Warum gibts du 3 mal das gleiche aus (nämlich den Namen des Objekts marray)?

Kommentar von leonardomessi ,

überreste vom test gewesen.

Kommentar von Gegengift ,

Ja und wo  ist dann der Code, der hier beurteilt werden soll - nämlich die Verwendung der Klasse?

Kommentar von leonardomessi ,

Das ist die Frage. :DDDDD

Mein aktuelles Problem ist, ich will ein 2 dimensionales Array mithilfe einer Klasse kreieren. Und das klappt mit dem gegebenen Code nicht.

Das weitere programmieren in der Main ist dafür unwichtig.

Kommentar von Gegengift ,

Alles klar.

Matrix [][] marray = new Matrix[columns][rows];

Du erstellst also ein Matrix Objekt, das ein zweidimensionales Array enthält, in dem man wiederum Matrix Objekte speichern kann. Sinn?

Mein aktuelles Problem ist, ich will ein 2 dimensionales Array mithilfe einer Klasse kreieren

Wenn es darum geht ein Array durch eine Klasse zu kapseln, dann initialisierst du im Konstruktor nur ein einfaches int-Array. Dieses int-Array muss ein Feld in der Klasse sein. Dann kannst du noch Methoden definieren, um darauf zuzugreifen.



Kommentar von leonardomessi ,

Ich glaube es kommt so ein bisschen raus, das ich noch nicht ganz vertraut mit der Materie bin.

Alles was ich will, ist ein Array zu konstruieren. Und zwar mit einer Klasse.

Zwei Inputs für die Größe des Arrays. Und daraus soll dann das Programm ein Array erstellen.

Ich weis einfach nur nicht, wie ich das bewerkstelligen kann.

Liegt der Fehler in der main oder in der Klasse?

Was muss ich in der Main eingeben, damit er das macht was ich will?

Kommentar von Gegengift ,

Im Konstruktor erstellst du ja korrekterweise das Array. Nur dass es kein Array für Matrix-Objekte sein soll, sondern ein Array für einfache int-Werte.

Du erstellst also ein int-Array. Und speichern tust du das in einer Variablen der Klasse (die musst du noch anlegen)

Kommentar von Etter ,

"nämlich den Namen des Objekts marray"

Ich bin mir sicher, dass man mit Aufruf einer Methode innerhalb einer Konsolenausgabe nicht den Namen ausgibt (außer vll. man würde das in Anführungsstriche fassen).

Auch wenn ich sagen muss, dass da ein Haufen Fehler im Quellcode ist (da fehlt z.B. die Parameterübergabe oder wenn es "marray" ausgeben soll, dann fehlen die Anführungsstriche).

Kommentar von Gegengift ,

Ich bin mir sicher, dass man mit Aufruf einer Methode innerhalb einer Konsolenausgabe nicht den Namen ausgibt

Doch dabei wird halt automatisch die toString-Methode des Objekts aufgerufen. Und die gibt in der Standardimplementierung den vollqualifizierten Namen des Objekts zurück.

Kommentar von Etter ,
public class Test {
public static void main(String[] args) {
System.out.println(Matrix(1,2));
}
public static int Matrix(int test1, int test2) {
return (test1+test2);
}
}

Dann dürfte das ja auch nicht funzen. Ausgabe ist aber 3. Vll. reden wir auch aneinander vorbei.

Wenn man jetzt die Parameterübergabe beim Syso weglässt, dann bekommt man eine Fehlermeldung.

Kommentar von Gegengift ,

Du übergibst ja kein Objekt sonder einen int-Wert.

Oben wird aber ein Objekt der Klasse Matrix übergeben (bzw. ein Array-Objekt mit Matrix Objekten). Und wenn man ein Objekt dem Konsolenaufruf übergibt, dann wird die toString-Methode aufgerufen und die gibt den Namen des Objekts zurück.

Z.B. so etwas:

[[LMyClass$Matrix;@74a14482
Kommentar von Etter ,

Vielen Dank für die Erklärung ;)

Keine passende Antwort gefunden?

Fragen Sie die Community