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

Trong chương trình trên, tĩnh Point mảng khởi thất bại, báo cáo lỗi:tĩnh đối tượng mảng

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

Tuy nhiên, String mảng tĩnh thành công. Sự khác nhau giữa chúng là gì?

Tôi thực sự cần một mảng đối tượng tĩnh, vì nó dễ tham khảo mà không cần khởi tạo lớp bên ngoài.

Cảm ơn

Trả lời

4

Bạn sẽ cần phải thực hiện một Point lồng lớp tĩnh, như thế này:

static class Point { 
1

Point[] phải mảng hoặc Point"3,4" không phải là thể hiện của Point và làm cho lớp Point tĩnh cho lỗi này

1

Dưới đây là giải thích từ 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.

Ngoài ra nó không thể được truy cập từ bên trong các thành viên tĩnh của các loại kèm theo, vì nó đòi hỏi một một thể tồn tại.

1

Khai báo lớp Point của bạn như tĩnh:

... 
static class Point 
{ 
    ... 
} 

Nó là cần thiết vì Point là một lớp bên trong (String không).

Tuy nhiên, {new Point(1, 2), "3,4"}; là vấn đề tiếp theo của bạn. Tôi đoán nó phải là {new Point(1, 2), Point(3, 4)};

+0

Cảm ơn. Tôi muốn "3,4" để kích hoạt điểm (String). Có vẻ như nó không thể làm như vậy. – pengguang001

+0

'Điểm (Chuỗi xy) {Chuỗi [] tmp = xy.split (", "); x = Integer.parseInt (tmp [0]); y = Integer.parseInt (tmp [1]); } '? – khachik

0

Bạn có thể muốn tạo lớp lồng nhau Point Static.

static class Point { 

} 

séc this

5

Bạn phải làm ba điều cần làm cho mã của bạn để làm việc. Tôi sẽ giải thích chúng. Đầu tiên xem phiên bản làm việc.

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

Sau đây là ba thay đổi bạn phải thực hiện.

1. thay đổi "3,4"-new Point("3,4") hoặc new Point(3,4)

Chúng ta biết rằng một mảng có thể chứa các mặt hàng các loại tương tự. Ở đây bạn đang khai báo một mảng có tên là p loại Point. Điều đó có nghĩa là nó có thể chứa mục loại Point chỉ (hoặc các kiểu con của nó). Nhưng phần tử thứ hai "3,4" thuộc loại String và bạn không khớp. Vì vậy, bạn phải chỉ định hoặc là new Point("3,4") hoặc new Point(3,4) để nhận các mục thuộc loại Point.

2. Bạn cần phải thực hiện lớp học của bạn Pointstatic

Từ 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. 

đây lớp Point của bạn là một lớp bên trong và nó phải được quyền truy cập vào tất cả các thành viên của Array lớp học. Đối với điều đó, mỗi đối tượng của lớp Point phải được liên kết với đối tượng của lớp Array. Tuy nhiên, mảng p bạn đang tạo nằm trong ngữ cảnh static. Vì vậy, bạn phải tạo một lớp Point một static một hoặc làm cho mảng p là một không tĩnh.

3. parseInt không phải là một phương pháp String lớp

parseInt là một phương pháp tĩnh của Integer lớp và không thuộc về String lớp. Vì vậy, bạn phải gọi nó là Integer.parseInt(stringValue).

Hy vọng điều này sẽ giúp :)

+0

Cảm ơn lời nhắc của bạn. Bây giờ chương trình của tôi hoạt động. – pengguang001

Các vấn đề liên quan