자바 초보 자가 저 지 를 수 있 는 오류

프로 그래 밍 과정 에서 우 리 는 이상 한 상황 을 만 날 수 있 습 니 다.이런 괴이 한 원인 들 은 당신 이 JAVA 에 대해 잘 알 고 있 는 정도 입 니 다.
아래 코드 를 보 세 요.절대 바로 실행 하지 말고 잘 생각해 보고 실행 하 세 요.
 
자바 프로그램 을 실행 하 는 순 서 는 다음 과 같 습 니 다.
1.클래스 에 static 변수 가 있 으 면 코드 의 앞 뒤 순서에 따라 static 구성원 변 수 를 실행 합 니 다.
   특히 staitc 의 초기 화 는 한 번 만 실 행 될 수 있 고 첫 번 째 클래스 에서 만 실 행 될 수 있 습 니 다.그 후 에는 집행 하지 않 는 다.
2.비 static 변 수 를 다시 실행
3.구조 방법 재 집행
 재 미 있 는 거 보 자.static 의 변 수 를 더 잘 알 고 있 을 것 입 니 다.
//  1
class Singleton {
	private static Singleton obj = new Singleton();
	public static int counter1;
	public static int counter2 = 0;

	private Singleton() {
		System.out.println("counter1:"+counter1);
		System.out.println("counter2:"+counter2);
		counter1++;
		counter2++;
		System.out.println("counter1:"+counter1);
		System.out.println("counter2:"+counter2);
	}

	public static Singleton getInstance() {
		return obj;
	}
}
//  2
public class MyMain {
	public static void main(String[] args) {
		Singleton obj = Singleton.getInstance();
		System.out.println("obj.counter1:"+obj.counter1);
		System.out.println("obj.counter2:"+obj.counter2);
	}
}

 
 
실행 결 과 는 무엇 입 니까?너 이 결과 에 깜짝 놀 랐 지?잘 분석 해 봐.
 
사실 프로그램 1 이 컴 파일 된 프로그램 은 다음 프로그램 3 과 같 아야 합 니 다.
class Singleton {
	private static Singleton obj;
	public static int counter1;
	public static int counter2;
	
	//    class constructor
	static { 
		//     class constructor  ,class   JVM     ,
		//    static field       0,    reference  null
		//     counter1 counter2    0, singleton null
		
		//           ,         
		obj = new Singleton(); 
		// counter1        0
		counter2 = 0; // counter2      0(       )
	}

	private Singleton() { //   instance constructor
		System.out.println("counter1:"+counter1);
		System.out.println("counter2:"+counter2);
		counter1++;
		counter2++;
		System.out.println("counter1:"+counter1);
		System.out.println("counter2:"+counter2);
	}

	public static Singleton getInstance() {
		return obj;
	}
}

class 가 static 을 가지 고 있 을 때 field,그리고 선고 처 에서'=...'방식 으로 값 을 설정 할 때 컴 파일 러 는 자동 으로 이 서술 을 class 로 옮 깁 니 다. constructor 내.마찬가지 로 클 라 스 가 인 스 턴 스 를 가지 고 있 을 때 field,그리고 선고 처 에서'=...'방식 으로 값 을 설정 할 때 컴 파일 러 는 자동 으로 이 서술 을 intance 로 옮 깁 니 다. constructor 내.이 프로그램 은 class 에 있 습 니 다. constructor 내 static field 초기 화 시(이때 counter 1 과 counter 2 는 0)인 스 턴 스 를 호출 합 니 다. constructor,인 스 턴 스 constructor 가 static 을 변경 하 다 니. field 의 값 은 counter 1 과 counter 2 를 모두 1 로 만 듭 니 다.그리고 인 스 턴 스 constructor 실행 완료,class 로 돌아 가기 constructor,counter 2 의 값 을 0 으로 설정 합 니 다(단,counter 1 은 변 하지 않 습 니 다).마지막 결과:counter 1 은 1 이 고 counter 2 는 0 이다.프로그램 을 고 치 려 면 1,방법 은 세 가지 가 있 습 니 다.-방법 1:singleton 을... field 의 선 고 는 counter 1 과 counter 2 로 바 뀌 었 습 니 다. field 이후.이것 이 가장 좋 은 방법 이다.방법 2:counter 2=0 의 선고 에서'=0'의 부분 을 삭제 합 니 다.이 방법 은 희망 에서 만 가능 합 니 다.-방법 3:초기 화 된 동작 을 class 로 옮 깁 니 다. constructors 에 서 는 컴 파일 러 에 의존 하지 않 고 자체 적 으로 작성 합 니 다.이것 은 가장 안전 한 방법 이다.어떻게 하면'전 세계 모든 프로그래머 가 저 지 를 수 있 는 실 수 를 피 할 수 있 습 니까?'라 는 제 가 여러분 에 게 자바 프로그래머 의 건 의 는:-자바 숙독 입 니 다. Language Specification-의문 이 있 을 때 J2SDK 가 제공 하 는 자바 p 를 사용 하여 자바 를 역 번역 합 니 다. Bytecode,컴 파일 된 결 과 를 직접 관찰 합 니 다.다음은 제 가 자바 p 로 번역 프로그램 1 을 역 구성 하 는 시범 입 니 다.C:\>자바 p -c -classpath . SingletonCompiled from MyMain.javaclass Singleton extends java.lang.Object {public static int counter1;public static int counter2;public static Singleton getInstance();static {};}Method Singleton()0 aload_01 invokespecial #1 4 getstatic #2 7 iconst_18 iadd9 putstatic #2 12 getstatic #3 15 iconst_116 iadd17 putstatic #3 20 returnMethod Singleton getInstance()0 getstatic #4 3 areturnMethod static {}0 new #5 3 dup4 invokespecial #6 7 putstatic #4 10 iconst_011 putstatic #3 14 return.사실 자바 의 syntactic. 설탕 은 많 지 않 지만,
 
Tk2v%)gVIgT3
SdM 가 르 치기]D?hvV
U!5}xs 소프트 ZC=v 네트워크 1iz 78C
C\#syntactic 슈 가 야 말로 정말 없 는 곳 이 없다.그래서 C\#초보 자 들 은'전 세계 모든 프로그래머 들 이 저 지 를 수 있 는 잘못'을 저 지 르 기 쉽다.많은 C\#의 책 들 이 C\#문법 을 소개 하면 서 컴 파일 된 MSIL(.NET 의 중간 언어,자바 와 유사 한 Bytecode)의 결 과 를 소개 하지만 자바 의 책 들 은 거의 그렇지 않다.'전 세계 모든 프로그래머 가 저 지 를 수 있 는 잘못'이 라 고 하지만 이 는 당신 이 이 실 수 를 저 지 른 후에 도 돈 을 빌 리 기 좋아 하 는 조계 태 와 마찬가지 로'고 개 를 들 어 가슴 을 펴 고 당당 하 다'는 뜻 은 아니다.마음 만 있 으 면,사실 이런 종류의 잘못 은 여전히 피 할 수 있다.

좋은 웹페이지 즐겨찾기