2012-02-22 13 views
6
public class Array                
{ 
    static String[] a = new String[] {"red", "green", "blue"}; 
    static Point[] p = new Point[] {new Point(1, 2), "3,4"}; 

    public static void main(String[] args) 
    { 
     System.out.println("hello"); 
    } 

    class Point 
    { 
     int x; 
     int y; 

     Point(int x, int y) 
     { 
      this.x = x; 
      this.y = y; 
     } 

     Point(String s) 
     { 
      String[] a = s.split(","); 
      x = a[0].parseInt(); 
      y = a[1].parseInt(); 
     } 
    } 
} 

Nel programma precedente, la statica Point inizializzazione si guasta, la segnalazione degli errori:oggetto matrice statica

Array.java:4: non-static variable this cannot be referenced from a static context 
    static Point[] p = new Point[] {new Point(1, 2), "3,4"}; 

Ma, la String matrice statica riesce. Qual è la differenza tra loro?

Ho davvero bisogno di un array di oggetti statici, perché è facile fare riferimento a senza istanziare la classe esterna.

Grazie

risposta

4

Avresti bisogno di fare Point una classe innestata statica, in questo modo:

static class Point { 
1

Point[] deve essere array o Point"3,4" non è un'istanza di Point e rendere classe Point statico per questo errore

1

Ecco la spiegazione dal Oracle Online Reference

Inner Classes

As with instance methods and variables, an inner class is associated with an instance of its enclosing class and has direct access to that object's methods and fields. Also, because an inner class is associated with an instance, it cannot define any static members itself.

Objects that are instances of an inner class exist within an instance of the outer class. Consider the following classes:

class OuterClass { 
    ... 
    class InnerClass { 
     ... 
    } 
} 

An instance of InnerClass can exist only within an instance of OuterClass and has direct access to the methods and fields of its enclosing instance.

Inoltre non sono accessibili dall'interno membri statici della tipo contenitore, in quanto richiede un un'istanza di esistere.

1

Dichiarare la classe Point come statica:

... 
static class Point 
{ 
    ... 
} 

E 'necessaria perché Point è una classe interna (String non è).

Tuttavia, {new Point(1, 2), "3,4"}; è il tuo prossimo problema. Suppongo che dovrebbe essere {new Point(1, 2), Point(3, 4)};

+0

Grazie. Voglio "3,4" per attivare il punto (stringa). Sembra che non sia in grado di farlo. – pengguang001

+0

'Point (String xy) {String [] tmp = xy.split (", "); x = Integer.parseInt (tmp [0]); y = Integer.parseInt (tmp [1]); } '? – khachik

0

Si potrebbe desiderare di rendere la classe annidata Point Static.

static class Point { 

} 

controllo this

5

Devi fare tre cose per rendere il vostro codice funzioni. Li spiegherò. Per prima cosa vedi la versione funzionante.

public class Array { 
    static String[] a = new String[]{"red", "green", "blue"}; 
    static Point[] p = new Point[]{new Point(1, 2), new Point("3,4")}; 

    public static void main(String[] args) { 
     System.out.println("hello"); 
    } 

    static class Point { 
     int x; 
     int y; 

     Point(int x, int y) { 
      this.x = x; 
      this.y = y; 
     } 

     Point(String s) { 
      String[] a = s.split(","); 
      x = Integer.parseInt(a[0]); 
      y = Integer.parseInt(a[1]); 
     } 
    } 
} 

Le seguenti sono le tre modifiche da apportare.

1. cambiamento "3,4"-new Point("3,4") o new Point(3,4)

Sappiamo che un array può contenere oggetti di tipi simili. Qui si dichiara una matrice denominata p di tipo Point. Ciò significa che può contenere solo elementi di tipo Point (o i suoi sottotipi). Ma il secondo elemento "3,4" è di tipo String e si verifica una mancata corrispondenza. Quindi è necessario specificare new Point("3,4") o new Point(3,4) per ottenere elementi di tipo Point.

2. È necessario rendere il vostro Point classe static

Da Java Tutorial:

An instance of InnerClass can exist only within an instance of OuterClass 
and has direct access to the methods and fields of its enclosing instance. 

Qui la classe Point è una classe interna e deve essere dato accesso a tutti i membri della Array classe. Per questo, ogni oggetto della classe Point deve essere associato a un oggetto della classe Array. Ma l'array p che si sta creando è nel contesto static. Quindi, devi rendere la classe Point uno static o rendere l'array p uno non statico.

3. parseInt non è un metodo di String classe

parseInt è un metodo statico della classe Integer e non di String classe. Quindi devi chiamarlo come Integer.parseInt(stringValue).

Spero che questo aiuti :)

+0

Grazie per il tuo gentile ricordo. Ora il mio programma funziona. – pengguang001

Problemi correlati