2013-09-03 1 views
5

개체 생성시 클래스의 최종 변수를 초기화 할 수있는 방법은 무엇입니까?개체를 만들 때 최종 변수를 초기화 할 수 있습니까?

누구나 어떻게 설명 할 수 있습니까? ...

+2

예, 작성중인 클래스 객체의 생성자를 초기화 . –

+0

당신은 자바가 어떻게 생성자에서 할당을 허용 할 수 있는가를 의미합니까 ?? –

+0

일반적으로 http://sscce.org/에 게시해야합니다. 스택 오버플로가 더 효과적이기 때문입니다.몇 가지 코드를 게시하고 달성하려는 내용과 얻은 내용을 설명하십시오. 앞으로이 마음을 지키십시오. –

답변

15

최종 변수를 한 번만 초기화해야합니다.

  1. 생성자
  2. 에서 인스턴스 초기화 블록의 : 인스턴스 변수에 대해 그렇게하는 방법은 세 가지가 있습니다. 각각의 경우에

    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(...)를 호출하고 그 중 하나를 호출 할 수있는 방법이 없을 때 코드가 한 번 실행됩니다 :

  3. 당신은 여기

이 세 가지의 예입니다 선언 할 때 다시 말해 인스턴스마다 한 번만 발생하는 초기화 요구 사항을 충족시킵니다.

5

선언 중에 초기화되지 않은 최종 변수를 최종 최종 변수라고하며 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)

+0

감사합니다 변수를 정의 할 때 변수가 변할 수 없다면 어떻게 가능합니까? 빈 마지막 멤버 변수를 설명 할 수 있습니까? – shivam

+0

user1118930 @ 나는 당신의 요구 사항에 따라 응답을 – AurA

+0

감사 대답을 업데이트 한 – shivam

0

하지를 참조하십시오. 이와 같이

public class GenericFoo{ 

    final int var; 

    GenericFoo(){ 
     var = 100; 
    } 

} 
0

생성자가 완료되기 전에 최종 인스턴스 변수를 초기화 할 수 있습니다. JSL

빈 최종 인스턴스 변수가 확실히 선언 된 클래스의 모든 생성자의 마지막에 할당해야합니다에 따르면
; 그렇지 않으면 컴파일 타임 오류가 발생합니다. 자바

빈 최종 변수는

그래서 그것을 할 수있는 2 가지 방법이 있습니다 선언하면서 초기화되지 않은 최종 변수입니다.

방법 1 :

class Program { 
    final int i3; 
    Program() { 
     i3 = 10; 
    } 
} 

생성자에서 방법 2 예에서

class Program { 
     final int i3; 
     { 
      i3 = 10; 
     } 
    } 
0

final 값 블록은 한번만 설정하고 만 생성자 수이다. 원하는 값으로 생성자가 설정할 수없는 이유는 없습니다.

모든 인스턴스에 대해 상수가 되길 원하는 값이 있다면 static final이 될 것이므로 생성자에서 설정할 수 없습니다. 아마도 당신은이 두 가지를 혼동하고있을 것입니다.

0

정적 최종 멤버를 의미하는 경우 정적 초기화 사용할 수 있습니다 인해 JVM이 내부적으로 작동하는 방식과 자바가 디자인 된 방식

class Example { 
    public final static Map<String,Object> C; 

    static { 
    C = new HashMap<>(); 
    C.put("hi", 5); 
    } 
} 
0

이 가능합니다.

코드가 컴파일 된 후 생성되는 .class 파일에는 코드의 바이트 코드 표현이 포함됩니다. 클래스 파일은 JVM에 의해 해석 될 수있는 정의 된 순서로 구조화 된 바이트 묶음 일뿐입니다. 당신이 뭔가를 찾을 수있을 것입니다 클래스 파일 구조에서

클래스가로드 될 때 JVM에 의해 사용되는 상징적 참조 테이블에 불과하다 상수 풀을했다. 마지막 변수는 초기화 되었든 리터럴이 아니든 여기에서 찾을 수 있습니다.

이제이 사실을 알았으니 최종 수정자가 의미하는 바를 생각해 봅시다. JVM에게이 경우 변수에 값이 할당되고 일단 완료되면이를 나타 내기위한 방법을 의미합니다. 그 변수에 대한 재 할당 조작은 허가되지 않기 때문에, Java 언어 문서에 말하자면, 최종 변수에는 한 번만 값을 할당 할 수 있습니다. 당신의 변수 (의미없는 클래스 멤버가 아닌 객체 또는 원시적 형, 최종 변수에 값이

여부 : 이제 당신이 직접 질문에 대답하기 위해, 이러한 배경을 가지고

정적)은 객체의 런타임 상수 풀에있는 값을 사용하여 JVM에 의해 자동으로 설정됩니다. 또는이 변수가 선언시 초기화되지 않으면 생성자가 실행될 때 설정해야합니다. 이 모든 것이 가능합니다. 왜냐하면 하드 코딩을 피하고 최종 참조에 객체를 할당하는 방법을 제공하기 위해 프로그래머에게 변수 할당에 대한 유연성을 제공하기 위해 Java가 이렇게 설계 되었기 때문입니다.

마지막 팁으로 C++에서 최종 변수를 상수로 생각하지 마십시오. 그들은 비슷하게 보일지 모르지만 완전히 다른 방식으로 다루어집니다.

0

인스턴스 변수는 클래스 객체에만 연결되어 있습니다. 변수 앞에있는 마지막 키워드는 변수의 값을 변경할 수 없으므로 객체가 만들어 질 때만 변수가 존재하므로 최종 변수 값을 3으로 지정할 수 있습니다 객체의 생성하기 전에 위에서 언급 한 바와 같이 방법 (예를 들면. 당신이 선언 정적 블록에 의해) 또는 객체의 생성시 (예. 생성자를 통해)