2012-02-22 9 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(); 
     } 
    } 
} 

En el programa anterior, la estática Point gama de inicialización falla, el informe de errores:matriz de objetos estáticos

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"}; 

embargo, la String matriz estática tiene éxito. ¿Cual es la diferencia entre ellos?

Realmente necesito una matriz de objetos estáticos, porque es fácil de consultar sin instanciar la clase externa.

Gracias

Respuesta

4

Se necesitaría para hacer Point una clase anidada estática, así:

static class Point { 
1

Point[] debe haber matriz o Point"3,4" no es instancia de Point y hacer la clase de punto estático de este error

1

Aquí está la explicación del 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.

Además, no se puede acceder desde dentro de los miembros estáticos del tipo envolvente, ya que requiere un una instancia de existir.

1

declarar una clase Point como estática:

... 
static class Point 
{ 
    ... 
} 

Es necesario porque Point es una clase interna (no es String).

Sin embargo, {new Point(1, 2), "3,4"}; es su próximo problema. Supongo que debería ser {new Point(1, 2), Point(3, 4)};

+0

Gracias. Quiero "3,4" para activar el punto (cadena). Parece que no puede hacerlo. – pengguang001

+0

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

0

Es posible que desee hacer una clase anidada de Point Static.

static class Point { 

} 

cheque this

5

Hay que hacer tres cosas para hacer que su código funcione. Yo los explicaré. Primero vea la versión de trabajo.

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]); 
     } 
    } 
} 

Los siguientes son los tres cambios que debe realizar.

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

Sabemos que un array puede contener elementos de tipos similares. Aquí está declarando una matriz llamada p del tipo Point. Eso significa que puede contener elementos del tipo Point solamente (o sus subtipos). Pero el segundo elemento "3,4" es del tipo String y tiene una discrepancia. Por lo tanto, debe especificar new Point("3,4") o new Point(3,4) para obtener elementos del tipo Point.

2. Usted necesita para hacer su Point clase static

De 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. 

Aquí su clase Point es una clase interna y debe tener acceso a todos los miembros de Array clase. Para eso, cada objeto de la clase Point debe estar asociado a un objeto de la clase Array. Pero, la matriz p que está creando está en el contexto static. Por lo tanto, debe hacer que la clase Point sea static o hacer que la matriz p sea no estática.

3. parseInt no es un método de String clase

parseInt es un método estático de Integer clase y no de String clase. Entonces debe llamarlo como Integer.parseInt(stringValue).

Espero que esto ayude :)

+0

Gracias por su amable recordatorio. Ahora mi programa funciona – pengguang001

Cuestiones relacionadas