Java 동적 특성

3364 단어
더 읽 기
자바 는 세 가지 특성 이 있 습 니 다. 패키지, 계승 및 다 형 입 니 다.아주 오래 전에 다 형 이라는 특성 에 대해 내 가 알 고 있 는 것 은 바로 방법의 재 업로드, 재 작성 으로 인 한 것 이다.대상 이 하나의 방법 을 호출 할 때, 우 리 는 프로그램 이 실제 실 행 될 때 어떤 방법 을 호출 하 는 지 의문 이 생 길 것 이다.부 류 를 호출 하 는 방법 입 니까? 아니면 자 류 자체 의 방법 입 니까?만약 한 종류 에 여러 개의 리 셋 방법 이 있다 면, 어떤 리 셋 방법 버 전 을 호출 할 지 선택 하 는 것 도 관련된다.
지금 은 자바 의 다 태 를 비교적 깊 은 차원 에서 이해한다.
1. 정적 유형 과 실제 유형
다음 코드 예제 보기:
package xmh0511;

public class Test {

	public static void main(String[] args) {
		Test test = new Test();
		Human man = new Man();
		Human woman = new Woman();
		test.sayHello(man);
		test.sayHello(woman);
	}

	public void sayHello(Human human) {
		System.out.println("I'm a Human");
	}

	public void sayHello(Man man) {
		System.out.println("I'm a man");
	}

	public void sayHello(Woman woman) {
		System.out.println("I'm a woman");
	}

}

class Human {

}

class Man extends Human {

}

class Woman extends Human {

}
 
그 중에서 man 의 정적 유형 은 Human 이 고 실제 유형 은 Man 이다.woman 의 정적 유형 은 Human 이 고, 실제 유형 은 Woman 이다.정적 유형 은 변수의 성명 유형 이 라 고 할 수 있 는데 실제 유형 은 대상 이 실례 화 될 때의 구체 적 인 유형 이다.
2. 리 셋 방법 버 전의 선택 연구
위의 코드 의 실행 결 과 는 무엇 입 니까?프로그램 은 정적 형식 에 따라 리 셋 방법 과 일치 하 는 버 전 입 니까? 아니면 대상 의 실제 유형 에 따라 방법 을 선택 하여 버 전 을 실행 합 니까?
위 코드 의 실행 결 과 는:
I'm a Human
I'm a Human
이 를 통 해 알 수 있 듯 이 정적 유형 에 따라 일치 합 니 다. 실제 매개 변수 (위의 man 대상 과 woman 대상) 의 정적 유형 (모두 Human 형식) 이 방법의 매개 변수 유형 과 일치 하기 때문에 이 프로그램 은 sayHello 방법 을 호출 할 때 sayHello (Human) 를 선택 하여 실 행 됩 니 다. 휴 먼 방법.
3. 다시 한 가지 문 제 를 생각해 보 자. 리 셋 방법 버 전의 선택 은 언제 발생 했 습 니까?프로그램 컴 파일 기간 (원본 파일 을 바이트 코드 파일 로 컴 파일) 입 니까? 프로그램 실행 기간 (프로그램 이 가상 컴퓨터 에서 실행 상태) 입 니까?
사실 컴 파일 러 (예 를 들 어 Sun 회사 의 javac 컴 파일 러) 가 원본 파일 을 컴 파일 할 때 컴 파일 러 는 실제 매개 변수의 정적 형식 (예 를 들 어 위 코드 에서 컴 파일 러 는 컴 파일 할 때 man 과 woman 의 정적 형식 이 Human 임 을 확인 할 수 있 습 니 다) 을 미리 확인 할 수 있 습 니 다. 바이트 파일 로 컴 파일 할 때 어떤 리 셋 버 전 을 호출 할 지 확 정 했 습 니 다.리 셋 방법 버 전의 선택 은 컴 파일 기간 에 이 루어 집 니 다.바이트 파일 에 서 는 어떤 재 업로드 방법 을 호출 하 는 지 이미 확정 되 었 다.
4. 재 작성 방법 버 전의 선택
4.1 아래 코드 보기
public class DynanicTest {
	public static void main(String[] args) {
		DynanicTest dt = new DynanicTest();
		Father father = new Father();
		Father son = new Son();
		father.sayHello();
		son.sayHello();
	}

}

class Father {
	public void sayHello() {
		System.out.println("Father sayHello()");
	}
}
 
Son 류 가 Father 류 를 계승 하면 서 Son 은 부류 의 sayHello () 방법 을 다시 쓴 것 으로 보인다.
프로그램의 실행 결 과 는 다음 과 같다 는 것 을 쉽게 알 수 있다.
Father sayHello()
Son sayHello()
분석:
재 작성 방법 버 전의 선택 과정 은 대체로 다음 과 같다.
먼저 해당 대상 의 Class 대상 을 얻어 해당 대상 의 실제 유형 을 판단 한다.
이러한 계승 관계 에 따라 아래 에서 위로 방법 명 과 매개 변수 유형 에 맞 는 방법 을 찾 습 니 다.
이 방법 에서 호출 된 기호 인용 을 직접 인용 으로 바 꿉 니 다.
위의 예 에서 슨 대상 은 sayHello () 방법 을 호출 합 니 다. 먼저 Son 클래스 에서 sayHello () 방법 이 존재 하 는 지, 찾 으 면 이 방법 을 실행 합 니 다. 그렇지 않 으 면 부모 클래스 나 실 현 된 인터페이스 에서 sayHello () 방법 이 존재 하 는 지 찾 습 니 다.
재 작성 방법 버 전의 선택 은 프로그램 이 실 행 될 때 동적 으로 확 정 됩 니 다. 한 대상 의 실제 유형 이 무엇 인지 미리 모 르 기 때문에 프로그램 이 실 행 될 때 만 대상 의 실제 유형 을 확인 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기