자바 초보 자가 저 지 를 수 있 는 오류
아래 코드 를 보 세 요.절대 바로 실행 하지 말고 잘 생각해 보고 실행 하 세 요.
자바 프로그램 을 실행 하 는 순 서 는 다음 과 같 습 니 다.
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
Tk2v%)gVIgT3
SdM 가 르 치기]D?hvV
U!5}xs 소프트 ZC=v 네트워크 1iz 78C
C\#syntactic 슈 가 야 말로 정말 없 는 곳 이 없다.그래서 C\#초보 자 들 은'전 세계 모든 프로그래머 들 이 저 지 를 수 있 는 잘못'을 저 지 르 기 쉽다.많은 C\#의 책 들 이 C\#문법 을 소개 하면 서 컴 파일 된 MSIL(.NET 의 중간 언어,자바 와 유사 한 Bytecode)의 결 과 를 소개 하지만 자바 의 책 들 은 거의 그렇지 않다.'전 세계 모든 프로그래머 가 저 지 를 수 있 는 잘못'이 라 고 하지만 이 는 당신 이 이 실 수 를 저 지 른 후에 도 돈 을 빌 리 기 좋아 하 는 조계 태 와 마찬가지 로'고 개 를 들 어 가슴 을 펴 고 당당 하 다'는 뜻 은 아니다.마음 만 있 으 면,사실 이런 종류의 잘못 은 여전히 피 할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.