답변
최종 변수를 한 번만 초기화해야합니다.
- 생성자
- 에서 인스턴스 초기화 블록의 : 인스턴스 변수에 대해 그렇게하는 방법은 세 가지가 있습니다. 각각의 경우에
public class X { private final int a; private final int b; private final int c = 10; { b = 20; } public X(final int val) { a = val; } }
당신이
new X(...)
를 호출하고 그 중 하나를 호출 할 수있는 방법이 없을 때 코드가 한 번 실행됩니다 : - 당신은 여기
이 세 가지의 예입니다 선언 할 때 다시 말해 인스턴스마다 한 번만 발생하는 초기화 요구 사항을 충족시킵니다.
선언 중에 초기화되지 않은 최종 변수를 최종 최종 변수라고하며 on all constructor either explicitly or by calling this()
으로 초기화해야합니다. 마지막 변수 만 초기화 또는 할당 문을 통해 중, 한 번 초기화 할 수 있습니다 위키 백과
당으로
"final variable (name) might not be initialized".
으로 이렇게하지 않으면 컴파일러는 불평 할 것이다. 선언 시점에서 초기화 할 필요가 없습니다.이 변수를 "blank final"
변수라고합니다. 클래스의 빈 최종 인스턴스 변수는 선언 된 클래스의 모든 생성자 끝에 명확하게 할당되어야합니다. 마찬가지로, 공백으로 끝나는 정적 변수는 선언 된 클래스의 정적 초기화 프로그램에 반드시 지정되어야합니다. 그렇지 않으면 컴파일 타임 오류가 두 경우 모두 발생합니다. 예 : 자세한 내용은
public class Sphere {
// pi is a universal constant, about as constant as anything can be.
public static final double PI = 3.141592653589793;
public final double radius;
public final double xPos;
public final double yPos;
public final double zPos;
Sphere(double x, double y, double z, double r) {
radius = r;
xPos = x;
yPos = y;
zPos = z;
}
[...]
}
는 위키 페이지를 왜 http://en.wikipedia.org/wiki/Final_(Java)
하지를 참조하십시오. 이와 같이
public class GenericFoo{
final int var;
GenericFoo(){
var = 100;
}
}
생성자가 완료되기 전에 최종 인스턴스 변수를 초기화 할 수 있습니다. JSL
빈 최종 인스턴스 변수가 확실히 선언 된 클래스의 모든 생성자의 마지막에 할당해야합니다에 따르면
; 그렇지 않으면 컴파일 타임 오류가 발생합니다. 자바
빈 최종 변수는
그래서 그것을 할 수있는 2 가지 방법이 있습니다 선언하면서 초기화되지 않은 최종 변수입니다.
방법 1 :
class Program {
final int i3;
Program() {
i3 = 10;
}
}
생성자에서 방법 2 예에서
class Program {
final int i3;
{
i3 = 10;
}
}
final
값 블록은 한번만 설정하고 만 생성자 수이다. 원하는 값으로 생성자가 설정할 수없는 이유는 없습니다.
모든 인스턴스에 대해 상수가 되길 원하는 값이 있다면 static final
이 될 것이므로 생성자에서 설정할 수 없습니다. 아마도 당신은이 두 가지를 혼동하고있을 것입니다.
정적 최종 멤버를 의미하는 경우 정적 초기화 사용할 수 있습니다 인해 JVM이 내부적으로 작동하는 방식과 자바가 디자인 된 방식
class Example {
public final static Map<String,Object> C;
static {
C = new HashMap<>();
C.put("hi", 5);
}
}
이 가능합니다.
코드가 컴파일 된 후 생성되는 .class 파일에는 코드의 바이트 코드 표현이 포함됩니다. 클래스 파일은 JVM에 의해 해석 될 수있는 정의 된 순서로 구조화 된 바이트 묶음 일뿐입니다. 당신이 뭔가를 찾을 수있을 것입니다 클래스 파일 구조에서
클래스가로드 될 때 JVM에 의해 사용되는 상징적 참조 테이블에 불과하다 상수 풀을했다. 마지막 변수는 초기화 되었든 리터럴이 아니든 여기에서 찾을 수 있습니다.이제이 사실을 알았으니 최종 수정자가 의미하는 바를 생각해 봅시다. JVM에게이 경우 변수에 값이 할당되고 일단 완료되면이를 나타 내기위한 방법을 의미합니다. 그 변수에 대한 재 할당 조작은 허가되지 않기 때문에, Java 언어 문서에 말하자면, 최종 변수에는 한 번만 값을 할당 할 수 있습니다. 당신의 변수 (의미없는 클래스 멤버가 아닌 객체 또는 원시적 형, 최종 변수에 값이
여부 : 이제 당신이 직접 질문에 대답하기 위해, 이러한 배경을 가지고
정적)은 객체의 런타임 상수 풀에있는 값을 사용하여 JVM에 의해 자동으로 설정됩니다. 또는이 변수가 선언시 초기화되지 않으면 생성자가 실행될 때 설정해야합니다. 이 모든 것이 가능합니다. 왜냐하면 하드 코딩을 피하고 최종 참조에 객체를 할당하는 방법을 제공하기 위해 프로그래머에게 변수 할당에 대한 유연성을 제공하기 위해 Java가 이렇게 설계 되었기 때문입니다.
마지막 팁으로 C++에서 최종 변수를 상수로 생각하지 마십시오. 그들은 비슷하게 보일지 모르지만 완전히 다른 방식으로 다루어집니다.
인스턴스 변수는 클래스 객체에만 연결되어 있습니다. 변수 앞에있는 마지막 키워드는 변수의 값을 변경할 수 없으므로 객체가 만들어 질 때만 변수가 존재하므로 최종 변수 값을 3으로 지정할 수 있습니다 객체의 생성하기 전에 위에서 언급 한 바와 같이 방법 (예를 들면. 당신이 선언 정적 블록에 의해) 또는 객체의 생성시 (예. 생성자를 통해)
예, 작성중인 클래스 객체의 생성자를 초기화 . –
당신은 자바가 어떻게 생성자에서 할당을 허용 할 수 있는가를 의미합니까 ?? –
일반적으로 http://sscce.org/에 게시해야합니다. 스택 오버플로가 더 효과적이기 때문입니다.몇 가지 코드를 게시하고 달성하려는 내용과 얻은 내용을 설명하십시오. 앞으로이 마음을 지키십시오. –