2011-11-03 5 views
2

나는 다음과 같은 클래스가있다 :정적() 메소드가

public abstract class A() 
{ 
    public static final SomeString = null; 

    static() 
    { 
     SomeString = "aaa"; 
    } 
} 

이 정적 메소드가 호출 어떻게하면?

이러한 정적 메서드 (이름/반환 형식 제외)를 만들 때 목적은 무엇입니까?

답변

0

구문이 잘못되었습니다. 그것은 같아야

public abstract class A() 
{ 
    public static final String SomeString; 

    static 
    { 
     SomeString = "aaa"; 
    } 
} 

static 블록은 정적 변수는 그 초기화 단순히 = something; 이상의 합병증 인 경우는 클래스가로드 될 때 초기화 될 수있다. 방법 아니다

Reference

6

, 그것은 정적 초기화 블록, 그리고 당신의 구문은 당시 자바 필드 (정적 또는 인스턴스)를 초기화

public abstract class A() 
{ 
    public static String SomeString = null; 

    static 
    { 
     SomeString = "aaa"; 
    } 
} 

가장 쉬운 방법은 잘못 그들의 선언은 호환 가능한 데이터 유형의 컴파일 시간 상수 값을 제공하는 것입니다. 예를 들어

public class InitializationWithConstants{ 

public static int staticIntField = 100; 
private boolean instanceBoolField = true; 

} 

초기화이 타입의 단순하기 때문에 그 한계를 가지고 있으며, 심지어 어떤 적당히 복잡한 논리에 기초하여 초기화를 지원할 수 없음 -에 대한 약간의 논리를 사용하여 복소 배열의 선택된 요소들을 초기화처럼 고리.

정적 및 인스턴스 필드를 각각 초기화하기위한 정적 초기화 블록 및 초기화 프로그램 블록이 필요합니다.

이 코드는 중괄호 안에 'static'키워드가 붙은 일반 코드 블록입니다. 이러한 블록은 필드 정의 또는 메소드 정의가 가능한 클래스 정의의 어느 위치 에나있을 수 있습니다. Java 런타임은 모든 정적 초기화 블록이 소스 코드에 나타나는 순서대로 호출되고 이것이 메모리에 클래스를로드하는 동안 발생한다는 것을 보장합니다. 그들은 우리가 그들의 초기 값을 얻기 위해 몇 가지 논리적 처리 할 것을 요구 심지어 정적 필드를 초기화 할 수 있도록 정적 초기화 블록 이후

public class InitializationWithStaticInitBlock{ 

public static int staticIntField; 
private boolean instanceBoolField = true; 

static{ 
//compute the value of an int variable 'x' 
staticIntField = x; 
} 
} 

실제로 코드 블록입니다.

0

구문은 제쳐두고, 당신은 정적 이니셜 라이저 블록을보고 있습니다. 그들은 here라고 언급되어 있습니다.

기본적으로 정적 이니셜 라이저 블록은 클래스가로드 될 때 실행되는 코드 조각으로 클래스의 정적 필드를 초기화하는 데 사용할 수 있습니다.

예 :

public abstract class A 
{ 
    public static final String SomeString; 

    static 
    { 
     System.out.println("static{}");  
     SomeString = "aaa"; 
    }  

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

출력 :이 방법이 아니다

static{} 
main 
0

찬성. 정적 블록이고 소유자 클래스가로드 될 때 한 번 평가됩니다.
동적 변수 초기화에 동적으로 사용할 수 있습니다 ...