2012-06-11 5 views

답변

8

Java는 기본 생성자를 사용하여 인스턴스 변수에 기본값을 지정합니다.

아니요. 생성자를 실행하기 전에 모든 구성원에게 기본값을 자동으로 할당합니다.

그러나 우리는 (우리가 다음 우리의 생성자를 작성할 때, 다음 기본 생성자가 추가되지 않기 때문에) 자바는 기본값을 주는가하는 방법 다음 우리 자신의 생성자를 정의하는 경우.

여전히 모든 구성원에게 기본값이 할당됩니다.

class Test { 

    int i; 
    Object ref; 

    Test() { 
     System.out.println(i); 
     System.out.println(ref); 
    } 


    public static void main(String[] args) { 
     new Test(); 
    } 
} 

출력 :

0 
null 
+0

기본 생성자에 값이 제공 될 필요는 없습니다. – swdeveloper

+0

추가하기 만하면 생성자의 중단 점을 보려는 경우 생성자의 before 문이 실행되므로 eclispe 디버거는 모든 멤버 변수를 통해 실행을 초기화합니다. 좋은 대답 +1 – mprabhat

+1

기본 생성자에서 주어진 값은 JVM에 의해 제공되는 기본값을 덮어 쓰는 것입니다. 위에서 말한 코드처럼 말하자면, 나는 기본적으로 20이 되길 원하지만 JVM은 항상 그것을 0으로 초기화 할 것이므로 생성자에서 i = 20으로 표시됩니다. – mprabhat

0

여기 객체가 new를 사용하여 생성 될 때 발생하는 상황; 개체에 대한 JLS 12.5

  1. 공간이 힙에 할당하고, 객체의 크기와 클래스가 객체와 연관된 참조하십시오.

  2. 개체의 모든 필드가 기본값으로 설정됩니다. 즉 null 또는 참조 유형이며 기본 유형에 대해서는 0 또는 False입니다.

  3. 인수가있는 경우 super 또는 this 인수에 대한 인수식이 계산되고 생성자 체인이 재귀 적으로 호출됩니다.

  4. 아직 평가되지 않은 경우 (this 체인을 통해),이 클래스의 모든 인스턴스 필드 초기화 프로그램과 이니셜 라이저 블록이 순서대로 평가/실행됩니다.

  5. 나머지 개체 생성자 (있는 경우)가 실행되어 개체 초기화가 완료됩니다.

명시 적으로 선언 된 생성자 또는 기본 생성자가 있는지에 관계없이 동일한 절차가 사용됩니다. 기본 생성자는 단지 super()을 호출하는 생성자에 대한 간단한 설명입니다.

그래서

....

자바는 기본 생성자를 사용하여 인스턴스 변수에 기본값을 지정합니다.

사실, 기본값이 그 전에 할당하고, (실제로) 초기화 등은 (비어 있음) 기본 생성자가 실행 전에 실행됩니다.

기본 생성자는 기본 초기화를 수행하지 않습니다. 따라서 호출되지 않는다는 사실은 중요하지 않습니다.

0

aioobe의 답변이 맞습니다. 난 그냥 말하고 싶은 이유/그것은 그런 식으로 방법 :

당신이 기본 또는 자신의 생성자를 가지고 있는지의

독립은, 자바 컴파일러에 대한 인스턴스 초기화 "방법"을 구성 각각 (와 무효 <init>라고 생성자의 매개 변수 - 디 컴파일 된 바이트 코드를 조사하려는 경우).

<init> "방법"의 구조는 다음

  • 다른 생성자의 호출
  • 인스턴스 변수 초기화 (인스턴스 변수 초기화뿐만 아니라 인스턴스 이니셜)
  • 생성자 체.

자세한 내용은 the JLS and JVMSin this nice introduction에서 찾을 수 있습니다.

0
public class DefaultValue { 

    private boolean BOOLEAN; 

    private byte BYTE; 

    private short SHORT; 

    private int INT ; 

    private long LONG; 

    private float FLOAT; 

    private double DOUBLE; 

    private char CHAR; 

    private Object OBJECT; 

    public DefaultValue() { 
     System.out.println("I did nothing!"); 
    } 

    public static void main(String args[]) { 
     DefaultValue dv = new DefaultValue(); 
     System.out.println(dv.BOOLEAN); 
     System.out.println(dv.BYTE); 
     System.out.println(dv.SHORT); 
     System.out.println(dv.INT); 
     System.out.println(dv.LONG); 
     System.out.println(dv.FLOAT); 
     System.out.println(dv.DOUBLE); 
     System.out.println(dv.CHAR); 
     System.out.println(dv.OBJECT); 
    } 

}

기본 생성자를 다시 작성합니다. 비록 내가 생성자에서 아무것도하지 않았지만 변수가 할당되었습니다.

관련 문제