[면접 문제]자바 류 로드 메커니즘 탐색

5436 단어 자바
[면접 문제]자바 류 로드 메커니즘 탐색
참고 문장
참고 문장 2
면접 문제 1:
class SingleTon {
	private static SingleTon singleTon = new SingleTon();
	public static int count1;
	public static int count2;

	private SingleTon() {
		count1++;
		count2++;
	}

	public static SingleTon getInstance() {
		return singleTon;
	}
}

public class Test {
	public static void main(String[] args) {
		SingleTon singleTon = SingleTon.getInstance();
		System.out.println("count1=" + singleTon.count1);
		System.out.println("count2=" + singleTon.count2);
	}
}

자주 볼 수 있 는 한 마디:이것 은 하나의 사례 모델 로 classLoader 체 제 를 통 해 다 중 스 레 드 동기 화 문 제 를 피 할 수 있 습 니 다.
콘 솔 인쇄 결과 먼저 보기:
count1=1
count2=1

뻔 한 답 인 것 같다.OK,문제 가 막 시작 되 었 습 니 다.
문제 1.어떻게 classLoader 체 제 를 통 해 다 중 스 레 드 동기 화 문 제 를 피 합 니까?
답:여러 스 레 드 가 getInstance()방법 을 동시에 호출 할 때 이 예 에서 SingleTon 인 스 턴 스 대상 이 존재 하지 않 으 면 클래스 의 초기 화 를 촉발 합 니 다.클래스 초기 화가 존재 하면 바로 호출 합 니 다.
jvm      (    ):

1.  new,getstatic,putstatic,invokestatic 4       ,          ,
            。
    3   : new       、             (    final       ,
             )、           。

2.  java.lang.reflect.*              ,
            ,      。

3.         ,             ,         。

4. jvm   ,              (  static void main(String[] args)    ),
 jvm         。

5. Class.forName(String className);       ,         。
  :ClassLoader loadClass(String className);           ,          。

면접 문제 2:
class SingleTon {
	private static SingleTon singleTon = new SingleTon();
	public static int count1;
	public static int count2 = 0;

	private SingleTon() {
		count1++;
		count2++;
	}

	public static SingleTon getInstance() {
		return singleTon;
	}
}

public class Test {
	public static void main(String[] args) {
		SingleTon singleTon = SingleTon.getInstance();
		System.out.println("count1=" + singleTon.count1);
		System.out.println("count2=" + singleTon.count2);
	}
}

면접 문 제 를 또 베 낀 거 아니 냐 고 물 어보 시 네요.다시 자세히 봐.
네,저 는 count 2 를 초기 화 했 을 뿐 입 니 다.
public static int count2 = 0;

당신 이 생각 하 는 결 과 는 이 럴 수 있 습 니 다.
count1=1
count2=1

그러나 결 과 는:
count1=1
count2=0

count 2 에 대한 초기 화 에 불과 한데 왜 결과 가 바 뀌 었 을 까?정 답:클래스 초기 화 순 서 는 static 를 먼저 불 러 오고 구조 기 를 만 드 는 것 이기 때 문 입 니 다.
초기 화 는 값 을 부여 하 는 과정 입 니 다.
예 를 들 어 본 예:
private static SingleTon singleTon = new SingleTon();
	public static int count1;
	public static int count2=0 ;

첫 번 째 줄 을 초기 화하 고 new SingleTon()대 count 1 을 호출 합 니 다.count 2 대 값 은 count 1=1,count 2=1 입 니 다.
두 번 째 줄 은 할당 이 없 기 때문에 count 1=1 은 변 하지 않 습 니 다.
세 번 째 줄 의 할당 count 2 는 0 입 니 다.
그러므로 답 은 count 1=1,count 2=0 이다.좋아,모두 방법 이 야.
면접 문제 3.여기 서 궁금 한 점 이 있 습 니 다.위의 답 을 맞 출 수 있 는 사람 은 이 질문 이 거의 없 을 것 입 니 다.
new SingleTon()을 초기 화 할 때 count 1,count 2 는 언제 메모리 공간 을 분배 합 니까?
먼저 추정 해 보 세 요.초기 화 할 때 메모리 공간 을 분배 하 는 것 이 아 닙 니 다.구조 방법 을 먼저 실행 할 때 count 값 을 설정 할 수 있 기 때 문 입 니 다.이 럴 때 는 이미 분배 가 다 되 었 을 것 이다.OK,추측 하지 않 겠 습 니 다.
바로 주제 로 돌아 가기:
먼저 이론 을 늘어놓다.
              ,         ,
           :   、  、  、  、   、       7   。
  ,   、               (linking) 。 

이론 을 알 고 나 면:
1)불 러 오기:자바 더미 에서 클 라 스 클래스 대상 을 만 듭 니 다.
2)준비:준비 단 계 는 클래스 의 정적 변 수 를 위해 메모 리 를 할당 하고 기본 값 으로 초기 화 하 는 것 입 니 다.이 메모 리 는 모두 방법 영역 에서 분 배 됩 니 다.예 를 들 어 이 예 는 count 1,count 2 메모 리 를 분배 하고 기본 값 0,0 을 부여 합 니 다.(int 형식 기본 값)
3)초기 화:먼저 static,재 구성 기.static 의 방법 내 순서에 따라.
OK,기본적으로 문 제 는 다 대답 했다.count 1,count 2 의 분배 메모리 가 준비 단계 에 있다 는 것 도 알 았 고 초기 화 할 때 이 두 개의 메모리 공간 이 있 었 다.
면접 문제 4,부류,하위 클래스 로 딩 순서.
처음에는 부 류 를 계승 하 는 클래스 의 초기 화 순 서 를 언급 하지 않 았 는데,함께 섞 여 있 기 때문에 비교적 복잡 해 보 였 다.
지금 예 를 들 면:
부류 A:
public class A{
	static{
		System.out.println("  -     ");
	}
	{
		System.out.println("  -      ");
	}
	public A(){
		System.out.println("  -    ");
	}
}

하위 클래스 B:
public class B extends A{
	static{
		System.out.println("  -     ");
	}
	{
		System.out.println("  -      ");
	}
	public B(){
		System.out.println("  -    ");
	}
}

테스트 해 보기:
public class Test{
	public static void main(String[] args) {
		B b = new B();
	}
}

효과 보기:
  -     
  -     
  -      
  -    
  -      
  -    

이 를 보면 초기 화 자 류 가 부 류 를 먼저 초기 화 할 줄 안다.순 서 는 부모 클래스 정적-하위 클래스 정적-부모 클래스 비 정적 코드 블록-부모 클래스 구조 방법-하위 클래스 비 정적 코드 블록-하위 클래스 구조 방법 입 니 다.
원인 은 여기에 있다.
3.         ,             ,         。

마지막 으로 사고 문 제 를 남 겨 주세요.
public class Main {
 public static void main(String[] args){
 System.out.println("  main  ,   Super    i:"+Sub.i);
 Sub sub = new Sub();
 }
}
class Super{
 {
 System.out.println("  Super   ");
 }
 public Super(){
 System.out.println("  Super    ");
 }
 {
 int j = 123;
 System.out.println("  Super       j:"+j);
 }
 static{
 System.out.println("  Super   ");
 i = 123;
 }
 protected static int i = 1;
}
class Sub extends Super{
 static{
 System.out.println("  Sub   ");
 }
 public Sub(){
 System.out.println("  Sub    ");
 }
 {
 System.out.println("  Sub   ");
 }
}

좋은 웹페이지 즐겨찾기