Ich kann schreiben:
AClass[] array = {object1, object2}
Ich kann auch schreiben:
AClass[] array = new AClass[2];
...
array[0] = object1;
array[1] = object2;
aber ich kann nicht schreiben:
AClass[] array;
...
array = {object1, object2};
Warum wird dies von Java blockiert?
Ich weiß, wie man es umgeht, aber von Zeit zu Zeit wäre es einfacher.
Beispielsweise:
public void selectedPointsToMove(cpVect coord) {
if (tab == null) {
if (arePointsClose(coord, point1, 10)) {
cpVect[] tempTab = {point1};
tab = tempTab;
} else if (arePointsClose(point2, coord, 10)) {
cpVect[] tempTab = {point2};
tab = tempTab;
} else {
cpVect[] tempTab = {point1,point2};
tab = tempTab;
}
}
}
Diese einfache Frage nervt mich, seit ich gelernt habe, wie man mit Arrays in Java spielt.
Antworten:
Sie müssten die Java-Designer fragen. Es könnte einen subtilen grammatikalischen Grund für die Einschränkung geben. Beachten Sie, dass einige der Konstrukte zur Array-Erstellung / -Initialisierung nicht in Java 1.0 enthalten waren und (IIRC) in Java 1.1 hinzugefügt wurden.
Aber "warum" ist unerheblich ... die Einschränkung ist da und man muss damit leben.
Sie können dies schreiben:
quelle
{o1()}
es sich um einen gültigen Ausdruck und{o1();}
einen gültigen Anweisungsblock handelt. Der Parser muss zum '}' oder ';' gelangen. bevor es die beiden Fälle unterscheiden kann. Das grammatikalische Problem ist überhaupt nicht subtil !!Ich werde versuchen, die Warum-Frage zu beantworten: Das Java-Array ist im Vergleich zu Klassen wie ArrayList, die dynamischer sind, sehr einfach und rudimentär. Java möchte zur Deklarationszeit wissen, wie viel Speicher für das Array zugewiesen werden soll. Eine ArrayList ist viel dynamischer und kann im Laufe der Zeit unterschiedlich groß sein.
Wenn Sie Ihr Array mit der Länge zwei initialisieren und sich später herausstellt, dass Sie eine Länge von drei benötigen, müssen Sie das, was Sie haben, wegwerfen und ein ganz neues Array erstellen. Daher das 'neue' Schlüsselwort.
In Ihren ersten beiden Beispielen geben Sie zur Deklarationszeit an, wie viel Speicher zugewiesen werden soll. In Ihrem dritten Beispiel wird der Arrayname zu einem Zeiger auf gar nichts. Wenn Sie ihn initialisieren, müssen Sie daher explizit ein neues Array erstellen, um die richtige Speichermenge zuzuweisen.
Ich würde sagen, dass (und wenn jemand es besser weiß, bitte korrigieren Sie mich) das erste Beispiel
bedeutet eigentlich
Die Java-Designer haben es jedoch schneller gemacht, es zu schreiben, wenn Sie das Array zur Deklarationszeit erstellen.
Die vorgeschlagenen Problemumgehungen sind gut. Wenn die Zeit- oder Speichernutzung zur Laufzeit kritisch ist, verwenden Sie Arrays. Wenn dies nicht kritisch ist und Sie Code wünschen, der einfacher zu verstehen und zu verarbeiten ist, verwenden Sie ArrayList.
quelle
{
und und}
... zählt, genau wie bei den zulässigen Initialisierungsformularen.Ich kann den Warum-Teil nicht beantworten.
Aber wenn Sie etwas Dynamisches wollen, warum ziehen Sie dann nicht Collection ArrayList in Betracht?
ArrrayList kann von einem beliebigen Objekttyp sein.
Und wenn Sie es als Zwang als Array wollen, können Sie die toArray () -Methode verwenden.
Beispielsweise:
Ich hoffe das könnte dir helfen.
quelle
Für diejenigen unter Ihnen, die diese monströse
new AClass[] { ... }
Syntax nicht mögen , hier etwas Zucker:Verwenden Sie diese kleine Funktion, wie Sie möchten:
quelle