Zitat von
Kirgo
Soll ich "Matrix" mit double ersetzen?
Falls in dem Array Elemente des Typs double gespeichert werden sollen, ist das richtig!
double[][] marray = new Matrix[columns][rows];
Eine Kleinigkeit fehlt noch, denn rechts von dem new müsste anstelle von Matrix ebenfalls double stehen:
Code:
double[][] marray = new double[columns][rows];
Warum?
Du möchtest doch per new... ein Array mit Elementen vom Typ double (nicht vom Typ Matrix) erzeugen. Und darauf möchtest du mit marray zugreifen.
Was new zurückgibt, ist eine Referenz auf das Array. Mit dieser wird marray initialisiert. double[][] kennzeichnet bloß den Typ von marray, denn was links vom Gleichzeichen steht, ist nur eine Deklaration. Insgesamt findet aber durch die Zuweisung des Arrays an marray eine Initialisierung statt. Dabei wird jedoch nicht das Array kopiert, sondern bloß seine Referenz, welche marray erhält.
"Richtige" Objekte werden (im Gegensatz zu einfachen Variablen), per "=", nicht als solche kopiert, sondern nur ihre Referenz. Diese Referenzen kann man ziemlich sorglos kreuz und quer durch den Code schmeißen, weil immer dasselbe Objekt referenziert wird. Es kommt zu keinerlei versehentlichen Duplikaten und der Garbage Collector weiß, dass er das Objekt abräumen darf, sobald keine Referenzen mehr an dieses bestehen und nicht vorher. Das (und die Abwesenheit von Zeigern) macht Java besonders einsteigerfreundlich.
Die seltsame Endlosrekursion (s.o.), indem du im Konstruktor von Matrix eine Instanz von Matrix erzeugen willst, also wieder diesen Konstruktor aufrufst, hätte natürlich nicht funktioniert.
Mit...
Code:
. . . new double[columns][rows];
...legst du ein zweidimensionales Array vom Typ double an. Alle Felder dieses Arrays werden automatisch mit 0.0d initialisiert (hab's im letzten Beitrag korrigiert).
Ein Array ist (wie jedes "richtige" Objekt) - im Gegensatz zu byte, int, double usw. (Variablen) - von einem Referenztyp. Mit...
...wird ein Array deklariert, wobei marray ein Name ist, welcher ein Array referenzieren soll. Bei einer reinen Deklaration, wie hier, erfolgt die Initialisierung später.
Mit...
Code:
marray = new double[columns][rows];
...wird marray endlich als Referenz auf das mit new... angelegte Array initialisiert. Dieses lässt sich nun mit dem Namen marray ansprechen.
Das geht auch alles in einem Zuge (s.o.):
Code:
double[][] marray = new double[columns][rows];
Wenn du das aber so in deinen Konstruktor packst, ist das marray nur in diesem Konstruktor gültig, denn außerhalb seines Scopes (was zwischen den geschweiften Klammern steht) ist der Name marray weder bekannt noch ansprechbar. Das ist auch gut so, denn wenn der Scope verlassen wird, darf (und soll irgendwann) der Garbage Collector das Array zerstören (den Speicher freigeben).
Also muss das Array auch außerhalb des Konstruktors referenziert sein, um zugreifbar zu sein und weiterzuexistieren. Du möchtest es als Feld in der Klasse Matrix haben, also...
Code:
public class Matrix {
// Das vorangestellte "m" wie "member" wurde zur Vereinheitlichung von marray übernommen,
// wenngleich das von der Lesbarkeit her nicht optimal ist.
// Felder machst du alle jeweils private, sobald die Zugriffsmethoden fertig sind
public double[][] marray;
public int mrows;
public int mcolumns;
public Matrix(){
}
public Matrix(int rows, int columns){
marray = new double[rows][columns]; // rows und columns sinnvoll vertauscht
mrows = rows; // mrows mit der Anzahl der Zeilen initialisieren
mcolumns = columns; // mcolumns mit der Anzahl der Spalten initialisieren
}
}
Auf die Elemente des Arrays zugreifen?
Ich dachte an zwei Indexvariablen die immer auf die verschiedenen Segmente zeigen können.
marray[2][1] = 4;
So etwa.
Innerhalb der Klasse geht das natürlich. Um von außerhalb zuzugreifen, müsstest du deiner Klasse Zugriffsmethoden verpassen. Auf Felder, die als public gekennzeichnet sind, kannst du aber auch von außen zugreifen. Sinn der Kapselung ist das natürlich nicht, aber solange die Zugriffsmethoden fehlen, ist das die einzige Möglichkeit. Für den Zugriff auf einen Member einer Klassensinstanz brauchst du den Punktoperator. Wie das geht, weißt du doch, oder?
Die Matrixklasse soll doch später noch Methoden für Matrixoperationen erhalten, nehme ich mal an... (?)
Du hattest nämlich über die Aufgabenstellung viel zu wenig verraten. "Eine Klasse, die ein Array kreiert" kann nämlich vieles bedeuten. Also bin ich davon ausgegangen, dass alles zusammen später als Matrixklasse einen Sinn ergeben soll.