자바 에서 구조 기 내부 의 다 중 방법 에 대한 행위 사례 분석

본 고 는 자바 에서 구조 기 내부 의 다 중 방법의 행위 조작 을 실례 로 서술 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
이 글 은 구조 기 에서 구조 중인 대상 의 동적 연결 방법 을 호출 할 때 나타 나 는 상황 을 주로 다 루 고 있다.그 전에 우 리 는 구조 기 가 어떻게 복잡 한 차원 구조 에서 작 동 하 는 지 알 아야 한다.비록 구조 방법 은 다 형 성 을 가지 지 않 지만 사실은 static 방법 이 고 암시 적 인 성명 의 static 에 불과 하기 때문이다.
복잡 한 계층 구조 에서 구조 기의 호출 순서
기본 클래스 의 구조 기 는 항상 내 보 내기 클래스 의 구조 과정 에서 호출 되 고 계승 단계 에 따라 점차적으로 위로 연결 되 어 모든 기본 클래스 의 구조 기 를 호출 할 수 있 도록 한다.이렇게 하 는 것 은 자바 류 에서 우 리 는 보통 필드 를 private 형식 으로 설정 하기 때 문 입 니 다.즉,하위 클래스 에 서 는 기본 필드 에 직접 접근 할 수 없습니다.그러면 기본 클래스 의 구조 기 를 호출 해 야 기본 대상 의 요 소 를 초기 화 할 수 있 습 니 다.그러면 모든 구조 기 가 호출 되 어야 완전한 대상 을 정확하게 구성 할 수 있 습 니 다.다음 예 1 은 조합 과 계승 관 계 를 포함 하 는 각종 구조 기의 호출 순 서 를 보 여 준다. 
예 1:

class Meal {
   Meal() { System.out.println("Meal()"); }
}
class Bread {
   Bread() { System.out.println("Bread()"); }
}
class Cheese {
   Cheese() { System.out.println("Cheese()"); }
}
class Lettuce {
   Lettuce() { System.out.println("Lettuce()"); }
}
class Lunch extends Meal {
   Lunch() { System.out.println("Lunch()"); }
}
class PortableLunch extends Lunch {
   PortableLunch() { System.out.println("PortableLunch()");}
}
public class Sandwich extends PortableLunch {
   private Bread b = new Bread();
   private Cheese c = new Cheese();
   private Lettuce l = new Lettuce();
   public Sandwich() { System.out.println("Sandwich()"); }
   public static void main(String[] args) {
    new Sandwich();
   }
}

예 1 은 Meal,Lunch,Sandwich 간 의 3 층 계승 관계(Object 류 포함 하지 않 음)와 Bread,Cheese,Lettuce 와 Sandwich 의 조합 관 계 를 나 타 냈 다.main 함수 에서 Sandwich 대상 을 만 들 면 출력 결 과 를 볼 수 있 습 니 다. 

이것 은 복잡 한 차원 구조 에서 구조 기의 호출 이 따 르 는 순서 가 다음 과 같다 는 것 을 설명 한다. 
**1.기본 구조 기 를 호출 합 니 다.이 절 차 는 끊임없이 반복 적 으로 돌아 갈 것 이다.먼저 이런 차원 구조의 뿌리 를 구성 한 다음 에 다음 층 의 도 출 류 등 이 있 고 최저 층 의 도 출 류 까지 이다.
2.성명 의 순서에 따라 구성원 의 초기 화 방법 을 호출 합 니 다.
3.내 보 내기 구조 기의 주 체 를 호출 합 니 다.**
구조 기 내부 의 다 중 방법 행위
그렇다면 이제 우 리 는 글 의 시작 부분 에서 언급 한 문제 로 돌아 가 구조 기 에서 구조 되 고 있 는 대상 의 특정한 동적 연결 방법 을 호출 하면 어떤 상황 이 발생 할 까?동적 바 인 딩(또는 후기 바 인 딩)방법의 호출 은 실행 할 때 결정 되 는 것 임 을 알 고 있 습 니 다.대상 이 프로그램 이 실행 되 기 전에 자신 이 기본 적 인 대상 인지 내 보 내기 대상 인지 알 수 없 기 때 문 입 니 다.만약 에 기본 클래스 의 구조 기 내부 에서 특정한 동적 바 인 딩 방법 을 호출 하면 이 방법 은 내 보 내기 클래스 로 덮 여 있 기 때문에 예측 하기 어 려 운 결 과 를 초래 할 수 있 습 니 다.이 내 보 내기 클래스 의 대상 은 아직 완전히 구성 되 지 않 았 지만 그 방법 은 호출 되 었 습 니 다.우 리 는 예 2 를 통 해 문제 의 소 재 를 볼 수 있다.
예 2:

class Glyph {
   void draw() { System.out.println("Glyph.draw()"); }
   Glyph() {
    System.out.println("Glyph() before draw()");
    draw();
    System.out.println("Glyph() after draw()");
   }
}  
class RoundGlyph extends Glyph {
   private int radius = 1;
   RoundGlyph(int r) {
    radius = r;
    System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius);
   }
   void draw() {
    System.out.println("RoundGlyph.draw(), radius = " + radius);
   }
}  
public class PolyConstructors {
   public static void main(String[] args) {
    new RoundGlyph(5);
   }
}

실행 결과:

실행 결과 에서 우 리 는 기본 Glyph 의 구조 기 에서 이불 류 RoundGlyph 가 덮어 쓰 는 draw()방법 을 호출 하고 radius=0 을 출력 한 것 을 보 았 다.이것 은 분명히 오류 이다.왜냐하면 이'0'은 다른 모든 사물 이 발생 하기 전에 시스템 이 대상 에 게 분배 하 는 저장 공간의 초기 값 인 2 진법 의 0 이지 우리 가 설정 하고 자 하 는 초기 값'1'이 아니 기 때문이다.하위 클래스(RoundGlyph)대상 을 만 들 때 기본 클래스(Glyph)의 구조 기 대상 을 먼저 호출 하고,기본 클래스 의 구조 기 에 서 는 이불 류 가 덮 인 동적 바 인 딩 방법(draw()을 호출 하기 때 문 입 니 다.이 방법 은 하위 클래스 의 초기 화 되 지 않 은 구성원(radius)을 조종 하여 재난 을 초래 할 수 있 습 니 다.컴 파일 러 가 틀 리 지 않 았 음 에 도 불구 하고.
따라서 구조 기 를 작성 하 는 데 효과 적 인 준칙 이 있 습 니 다."가능 한 한 간단 한 방법 으로 대상 을 정상 상태 로 들 어가 게 합 니 다."가능 하 다 면 다른 방법 을 사용 하지 마 세 요.구조 기 에서 유일 하 게 안전하게 호출 할 수 있 는 것 은 기본 클래스 의 final 방법(private 방법 포함)입 니 다.이 방법 들 은 하위 클래스 에 덮어 쓰 지 못 하고 상기 문제 가 발생 하지 않 기 때 문 입 니 다.
더 많은 자바 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 고 에서 말 한 것 이 여러분 의 자바 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기