이 항목을 이해하려면 일반적으로 컴파일 및 런타임 프로세스가 무엇인지 알아야합니다. 즉, 앱 컴파일러를 빌드 할 때 모든 코드를 검토하여 일관성, 안전성 및 실행 가능성을 확인하십시오. 컴파일러가 발견 한 오류가 없다면 소스 코드 (java
개)에서 class
개의 파일을 생성합니다. 앱이 실행 중일 때 파일이 메모리에로드되고 JVM이 명령으로 app 명령을 실행한다는 의미입니다. 귀하의 예제에서
:
Person a = new Student(); // Student is a subclass of Person
a.speak();
컴파일 과정 : 컴파일러 확인이 라인 : 형 안전 (호환성)에 대한 Person a = new Student();
. 따라서 학생 is a
컴파일이 다음 행으로 넘어 가면 실패합니다. 다음 줄에서 : a.speak();
컴파일러는 a
유형을보고, Person
이고 speak()
방법을 Person
유형으로 찾습니다. 해당 메소드가 컴파일러에 의해 설정되지 않으면 컴파일 프로세스가 실패합니다.
런타임 프로세스 : JVM이 실행되면 라인 : 저면 (자식 클래스)에 상위 (상위 클래스)에서 초기화 프로세스를 통해가는 Person a = new Student();
한다.다음 라인에서 : a.speak();
JVM 발견 student
참조를 통해 객체 a
은 Student
에있는 경우 speak()
메소드를 찾은 다음 실행합니다. 그렇지 않으면 부모 클래스 Person
에서 speak()
메소드를 실행합니다. 상속 대상에서
또 다른 예 :
class Person {
public void speak() {}
public void think() {}
}
class Student extends Person {
@Override
public void speak() {}
public void speakALot() {}
}
Person a = new Student();
a.speak(); // calling overrided version of speak()
a.think(); // since this method is not overrided in child class it will be called from parent class
a.speakALot(); // since Person doesn't know anything about specific methods of derived classes compilation fails
Student b = new Student();
b.speak(); // calling speak() method of student object
b.think(); // inheritance trick, child class keeps reference to its base class and that's why public and protected fields and methods are available
b.speakALot(); // calling speakALot() method of student object
소프트웨어를 컴파일하는 것이 실행하는 것과 다릅니다. –
* 컴파일러에게'a'는'Student'보다는'Person'으로 취급되어야한다고했기 때문에. 왜 요청한 것과 다른 방식으로 코드를 컴파일해야합니까? 그 다른 전략에 대해 어떤 이점이 있다고 생각합니까? – Holger