2013-09-06 18 views
2

필드는 정적 일 수 없습니까? 단지 마지막 필드는 다음과 같습니다

public class DoIt { 
    public static void main(String[] args) { 
     final class Apple { 
      public static String place = "doIt"; 
     } 
     Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       System.out.println(Constants.place); 
      } 
     }); 
     thread.start(); 
    } 
} 

오류 -이 The field name cannot be declared static in a non-static inner type, unless initialized with a constant expression

+0

Constants.place 란 무엇입니까? 코드에서 Apple 클래스를 어떻게 사용합니까? – arjacsoh

+0

가능한 오류 : [오류 : 필드 이름을 정적으로 선언 할 수 없습니다] (http://stackoverflow.com/questions/18526099/error-field-name-cannot-be-declared-static) –

답변

0
final class Apple { { 
    // you can't define non final field inside the final class 
    // you have to use final with static 

} 

이 문제는 필드가 아닌 최종 점이다

public final static String place = "doIt"; 
6

를 사용할 수있는이 코드에 오류가 정적이 아닌 내부 클래스의 컨텍스트에서 정적이 될 수 있습니다.

자바 tutorials에 따르면
+0

하지만 그 이유는 무엇입니까? 이 메소드에서 필드를 변경하십시오. –

+0

@ JohnnyChen 메서드 범위이기 때문에 다른 클래스에서 해당 클래스로 이동할 수 없습니다. 애플이 거기에서 보이지 않기 때문에'main'의 바깥에'apple.place = "something-else"라고 말할 방법이 없다. 'main' 내부에서 변경이 가능한 경우, 다른 메커니즘을 사용하여 작동하게하십시오. – dasblinkenlight

0

,

A local class can have static members provided that they are constant variables.

그래서 당신은 최종 선언 할 것이다 :

public static void main(String[] args) { 
    final class Apple { 
     public static final String place = "doIt"; 
    } 
    Thread thread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      System.out.println(""); 
     } 
    }); 
    thread.start(); 
} 
1

JLS 8.1.3

Inner classes may not declare static members, unless they are constant variables (§4.12.4), or a compile-time error occurs.

final class Apple { 
    public static final String place = "doIt"; // This is good 
} 

내부 클래스 인스턴스 클래스입니다. 정적 인 멤버를 사용하면 인스턴트 화하지 않고도 직접 호출 할 수 있습니다. 따라서 정적 멤버를 내부 클래스 내부에 허용하는 것은별로 의미가 없습니다. 나는 다음과 같은 오류 용어가 밖으로 추론하기 전에 그러나, 당신은 정전기에

static final class Apple { 
    public static String place = "doIt"; 
} 
0

로 선언 할 수

용어 : 상자의 클래스는 두 가지 범주로 나누어집니다 : 정적 및 비 정적. 정적으로 선언 된 중첩 클래스는 단순히 정적 중첩 클래스라고합니다. 비 정적 중첩 클래스는 내부 클래스 (, 특히 로컬 내부 클래스)라고합니다.

이제 로컬 내부 클래스가 있습니다. 내부 클래스의 인스턴스 인 docsBecause an inner class is associated with an instance, it cannot define any static members itself.

오브젝트에 따르면, 외부 클래스의 인스턴스 내에 존재하고 경우에 당신은 클래스 로딩의 시간에 Apple 클래스에 액세스 할 수있는 반면 클래스가로드 될 때 정적 멤버는로드 변수 place을로드하십시오.

또한 로컬 클래스는 상수 변수를 제공하면 정적 멤버를 가질 수 있습니다.

할 수 있으니 public static final String place = "doIt";