2014-10-06 2 views
1

나는 아래에 간단한 자바 프로그램이있다. 인스턴스 정수 변수 "x1"및 "x2"선언했다 내 클래스 생성자에서 매개 변수를 초기화하십시오. "x1"과 "x2"의 차이를 계산하는 정수 변수 "diff"도 선언했지만 변수는 0을 반환합니다! 문제가 어디에 있는지, 생성자 매개 변수가 0이 아님을 알 수 없습니다 !!!. 내가 어떤 도움인스턴스 변수를 초기화하는 동안 왜 제로가됩니까?

public class Smallest { 
int x1; 
int x2; 

public Smallest(int a,int b){ 
this.x1=a; 
this.x2=b; 
} 

int diff = x2 - x1; 
public void draw(){ 
    System.out.println("X1= "+ x1 +"\n X2= "+ x2 +"\n diff= " +diff); 
} 

public static void main(String[] args) { 
Smallest small=new Smallest(10,20); 
small.draw(); 
} 
} 

에게 감사합니다 여기 DIFF는 컴파일 시간 동안 설정 한 방법에 있지 않기 때문에 이것은 출력

X1= 10; 
X2= 20; 
diff= 0; 
+0

'diff'는'x2 - x1'의 결과로 생성자를 호출하기 전에 초기화되기 때문에'0'입니다. – BackSlash

+0

그래서 인스턴스 변수가 생성 중에 초기화되지 않으면 인스턴스 변수가 기본값으로 초기화된다는 것을 의미합니까? 내 말은, 그들은 생성자보다 먼저 실행 되는가? 나는 자바 컴파일러가 기본 시퀀스 실행을 따를 것이라고 생각 했는가? –

+0

예, 생성자가 호출되기 전에 * 초기화됩니다. – BackSlash

답변

1

int diff = x2 - x1;constructor 내부에 또는 방법 draw() 내부 (당신이 그것을 수행 할 작업에 따라)해야한다.

기억 : 기본 INT 변수에 의해는 생성자 호출하기 전에 0 으로 초기화되어 생성자를 호출 할 때

x1=0; 
x2=0; 
diff=x1-x2 
    =0-0 
    =0 

당신이 x1x2에 다른 값을 줄을하지만 당신은하지 않습니다 새로 업데이트 된 값에 대해 diff을 계산하십시오.

x1=10; 
x2=20; 
diff=0; // you don't recalculate it, it's not in the constructor or in the draw method. 
+0

이 아니지만 이미 내 x1 및 x2를 초기화 했습니까? 제게 제로가되어서 무슨 일이 일어나는지 분명히 설명해주세요! –

+0

@gikarasojo kinene 생성자를 호출 할 때 x1과 x2 만 초기화합니다. diff를 초기화 한 후에는 diff를 x1-x2로 설정하지 않습니다. 이렇게하려면 다음을 선택해야합니다. 생성자에서 diff를 계산합니다 (이 경우 diff 변수는 x1 및 x2와 같은 인스턴스 변수 여야 함). 호출하는 메서드 draw() 내부에서 diff를 계산합니다. – Alboz

+0

@ gikarasojo kinene 이제 명확한 지 확인하십시오. 답변을 업데이트했습니다. – Alboz

3

입니다. 올바른 값을 얻으려면 생성자 또는 다른 방법으로 이동해야합니다.
예 :

int diff; 
public Smallest(int a,int b){ 
    this.x1=a; 
    this.x2=b; 
    this.diff=x2 - x1; 
} 
1

회원 변수가 생성자가 호출 전에 초기화되어 생성자를 호출 한 후

. 따라서 x1과 x2가 아직 설정되지 않았으므로 diff는 0 - 0과 같습니다.

+0

자바 컴파일러는 순서 코드 실행을 따라 할 것이라고 생각했다. 즉, 빼기를 수행하기 전에 x1 및 x2를 초기화합니다. –

관련 문제