2010-12-31 6 views
2

i das Array auf Instanzebene initialisieren initialisiert werden soll, aber ich bin nicht in der Lage, hier zu initialisieren, um den Codekann ich ein Array außerhalb der Methode initialisieren wie wir ein Mitglied/Feldvariable

public class Arrays { 

    /** Creates a new instance of Arrays */ 

     int []arr2=new int[2]; 
     arr2[0]=20;//error at compile time 
     arr2[1]=30;//error 


    public Arrays() {  } 
    public static void main(String []args) 
    { 
     System.out.println("Element at 0th position is "+arr2[0]); 
     System.out.println("Element at 1th position is "+arr2[1]); 
    } 


} 

Antwort

6

, wenn Sie initilize wollen, während er erklärt, als Mitglied es dieses tun Klasse wie

class MyClass{ 
    int []arr2={20,30}; 
} 

folgt eine Erklärung, können Sie keine Anweisung an der Stelle schreiben Sie

arr2[0]=20;//error at compile time 
zu tun versuchen
5

Dies ist die Art und Weise

int[] arr2 = { 20, 30 }; 
+0

Ich kenne den Weg, aber die Sache ist, kann ich dies auf Instanz Ebene –

3

Der Vollständigkeit zu initialisieren, nicht prettiness werden folgende Arbeiten:

public class Arrays { 

     int []arr2=new int[2]; 
     // this is a field definition 

     { // and this is a dynamic initializer, 
      // it runs after the constructor's 
      // first line 
      arr2[0]=20; 
      arr2[1]=30; 
     } 
} 

Aber natürlich ist es besser, Praxis das Array zu initialisieren, wie in den anderen Antworten gezeigt .


Und die Frage zu beantworten:

auf Klassenebene, sind die folgenden nur erlaubt:

  • Constructor Definitionen
  • Methode Definitionen
  • Inner Klassendefinitionen (einschließlich Schnittstellen und enums)
  • Felddefinitionen
  • Initializer Blöcke (statisch oder dynamisch/instance)

Aussagen nicht erlaubt sind, müssen sie in einem der oben verschachtelt werden.


In Bezug auf Adriaan Koster Kommentar:

Sie werden Instanzeninitialisierung Blöcke genannt. Das Gegenteil von 'statisch' ist 'Instanz' in OO, nicht 'dynamisch'.

Wahr, Beispiel ist der bessere OO-Ausdruck. Aber sprachlich ist Dynamik das Gegenteil von Statik, also bleibe ich dynamisch.

Instanzinitialisierungsblöcke werden vom Compiler in jeden Konstruktor kopiert und VOR dem Konstruktorcode ausgeführt, nicht danach.

Tatsächlich werden sie in den Konstruktor nach der ersten Zeile (die implizit oder explizit oder this()super() call) kopiert. Also technisch sind wir entweder beide richtig oder beide falsch (der Initialisierer läuft NACH der ersten Zeile und VOR dem Rest).

Zur Klarstellung (in Bezug auf die erste Zeile):

  • Jede Klasse hat mindestens einen Konstruktor. Wenn Sie keinen hinzufügen, fügt der Compiler einen öffentlichen Konstruktor ohne Argumente hinzu.
  • Jeder Konstruktor beginnt mit einem Aufruf eines anderen Konstruktors derselben Klasse this(args) oder eines Konstruktors der Superklasse (super(args)). Wenn Sie keine dieser Zeilen schreiben, fügt der Compiler einen Aufruf super() ohne Parameter ein. Jeder Konstruktor hat also mindestens eine Anweisung. Initialisierungen werden nach dieser ersten Anweisung ausgeführt.

Referenz:

+0

initialisieren Sie werden Instanz Initialisierungsblöcke genannt. Das Gegenteil von 'statisch' ist 'Instanz' in OO, nicht 'dynamisch'. Instanzeninitialisierungsblöcke werden vom Compiler in jeden Konstruktor kopiert und VOR dem Konstruktorcode ausgeführt, nicht danach. –

+0

@Adriaan danke für deine Kommentare, ich habe meine Antwort bearbeitet –

+0

@SeanPatrickFloyd Ich habe den Punkt, aber bisher hat niemand erklärt, warum es nicht möglich ist, OOPS Konzepte/Objekterstellungskonzepte oder können wir einfach sagen, dass Java nicht ermöglichen. – ranjan

0

-Code wie arr2[0]=20; kann nicht auf Klassenebene platziert werden, hat es innerhalb einer Methode oder Codeblock sein. Glücklicherweise erlaubt Java int [] arr = {20, 10};

+0

danke euch allen meine Freunde helfen mir nur so –

Verwandte Themen