나는 다음과 같은 클래스가있다 :정적() 메소드가
public abstract class A()
{
public static final SomeString = null;
static()
{
SomeString = "aaa";
}
}
이 정적 메소드가 호출 어떻게하면?
이러한 정적 메서드 (이름/반환 형식 제외)를 만들 때 목적은 무엇입니까?
나는 다음과 같은 클래스가있다 :정적() 메소드가
public abstract class A()
{
public static final SomeString = null;
static()
{
SomeString = "aaa";
}
}
이 정적 메소드가 호출 어떻게하면?
이러한 정적 메서드 (이름/반환 형식 제외)를 만들 때 목적은 무엇입니까?
구문이 잘못되었습니다. 그것은 같아야
public abstract class A()
{
public static final String SomeString;
static
{
SomeString = "aaa";
}
}
static
블록은 정적 변수는 그 초기화 단순히 = something;
이상의 합병증 인 경우는 클래스가로드 될 때 초기화 될 수있다. 방법 아니다
, 그것은 정적 초기화 블록, 그리고 당신의 구문은 당시 자바 필드 (정적 또는 인스턴스)를 초기화
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;
}
}
실제로 코드 블록입니다.
구문은 제쳐두고, 당신은 정적 이니셜 라이저 블록을보고 있습니다. 그들은 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
찬성. 정적 블록이고 소유자 클래스가로드 될 때 한 번 평가됩니다.
동적 변수 초기화에 동적으로 사용할 수 있습니다 ...