Java 프로그램의 실행에는 컴파일 및 실행 (해석)의 두 단계가 필요하며 Java는 객체 지향 프로그래밍 언어입니다. 서브 클래스와 상위 클래스가 동일한 메소드를 갖는 경우 서브 클래스는 상위 클래스 메소드를 대체합니다. 프로그램이 런타임에 메소드를 호출 할 때, 상위 클래스의 메소드가 호출되었는지 또는 서브 클래스가 재정의되는지 여부는 Java를 배우기 시작했을 때 발생하는 문제가되어야합니다. 여기서 먼저이 호출을 결정하기 위해 어떤 방법을 구현하거나 가변화 할 방법을 결정합니다.
Java에는 두 가지 결합 방법이 있으며, 하나는 정적 결합이며, 조기 결합이라고도합니다. 다른 유형은 동적 결합이며, 늦은 바인딩이라고도합니다.
프로그램 바인딩의 개념 :
바인딩은 메소드 호출과 메소드가있는 클래스 (메소드 본문)의 연관성을 나타냅니다. Java의 경우, 결합은 정적 결합 및 동적 결합으로 나뉩니다. 또는 초기 바인딩 및 늦은 바인딩이라고합니다.
정적 결합 (초기 결합 컴파일러 결합) :
이 방법은 프로그램이 실행되기 전에 바인딩되었으며 컴파일러 또는 기타 연결 프로그램에 의해 구현됩니다. 예를 들어 : C. Java의 경우 프로그램 컴파일 기간 동안 바인딩으로 이해할 수 있습니다. 특히 Java의 유일한 방법은 사전 바인딩 인 최종, 정적, 개인 및 생성자입니다.
동적 바인딩 (런타임 중 후기 바인딩) :
나중에 바인딩 : 런타임시 특정 객체의 유형에 따라 바인딩됩니다.
언어가 늦은 바인딩을 구현하는 경우 작동 중에 물체의 유형을 결정하고 적절한 방법을 별도로 호출하기위한 일부 메커니즘을 제공해야합니다. 다시 말해, 컴파일러는 여전히 현재 객체 유형을 알지 못하지만 방법 호출 메커니즘은 자체적으로 조사하고 올바른 메소드 본문을 찾을 수 있습니다. 언어마다 늦은 바인딩을 구현하는 방법이 다릅니다. 그들은 모두 특정 특수 유형의 정보를 객체에 삽입해야한다고 생각할 수 있습니다.
동적 바인딩 프로세스 :
바인딩에 대한 요약 :
세 가지의 개념을 이해 한 후, 우리는 Java가 늦은 바인딩에 속한다는 것을 알았습니다. Java에서는 거의 모든 방법이 늦은 바인딩이며 동적 바인딩 방법은 런타임시 서브 클래스 또는 기본 클래스입니다. 그러나 특별한 기능도 있습니다. 정적 방법과 최종 방법을 상속받을 수 없으므로 컴파일 시간에 해당 값을 결정할 수 있습니다. 그들은 초기 바인딩에 속합니다. 특히, 개인으로 선언 된 방법과 멤버 변수는 서브 클래스에 의해 상속 될 수 없으며, 모든 개인 메소드는 최종적으로 암시 적으로 지정됩니다 (이로부터 최종 유형으로 선언 된 방법은 메소드가 덮어 쓰는 것을 방지하고 Java에서 동적 결합을 효과적으로 닫는 것임을 알고 있습니다). Java의 사후 바인딩은 JVM에 의해 구현됩니다. 명시 적으로 선언 할 필요는 없지만 C ++는 다릅니다. 우리는 메소드에 바인딩이 있다고 명시 적으로 선언해야합니다. Java의 상향 변환 또는 다형성은 동적 결합을 통해 달성되므로 동적 결합을 이해하는 것은 상향 변환 및 다형성을 의미합니다.
조기 바인딩 인 최종, 정적, 개인 및 생성자를 제외하고 Java의 방법의 경우, 다른 모든 방법은 동적 결합입니다. 전형적인 동적 바인딩은 부모 클래스 및 아동 클래스의 전환 선언에서 발생합니다.
예를 들어 : 부모 p = 새로운 어린이 ();
특정 프로세스는 다음과 같습니다.
1. 컴파일러는 객체의 선언 유형 및 메소드 이름을 확인합니다. xf (args) 메소드를 호출하고 x가 클래스 C의 객체로 선언되었다고 가정하면 컴파일러는 클래스 C에서 f라는 모든 메소드와 클래스 C의 슈퍼 클래스에서 상속 된 메소드를 나열합니다.
2. 다음으로 컴파일러는 메소드 호출에 제공된 매개 변수 유형을 확인합니다. 이름 F가있는 모든 메소드 중 하나의 매개 변수 유형이 호출에 의해 제공된 매개 변수 유형과 일치하면이 메소드가 호출됩니다. 이 프로세스는 "과부하 파싱"이라고합니다.
3. 프로그램이 실행되고 동적 바인딩에 통화 메소드를 사용하면 가상 머신은 x에 의해 가리키는 객체의 실제 유형과 일치하는 메소드 버전을 호출해야합니다. 실제 유형이 d (c의 서브 클래스)라고 가정하면 클래스 d가 f (string)를 정의하면 메소드가 호출되며, 그렇지 않으면 메소드 f (문자열)가 d의 슈퍼 클래스에서 검색됩니다.
질문 생각 :
메소드 사용자에게 작업을 완료하는 메소드를 제공하는 방법. 사용자가 특별한 요구 사항이있는 경우 자신의 방법을 사용자 정의해야합니까?
관련된 지식 :
아동 부모 클래스, 인터페이스, 상향 변환, 동적 바인딩
특정 코드 :
패키지 com.chengxuyuanzhilu; public interface myinterfaces {void doting ();} 패키지 com.chengxuyuanzhilu; public class 음료는 myinterfaces {@override public void doting () {system.out.println ( "I 'm water water"); }} package com.chengxuyuanzhilu; 공개 클래스 Eat MyInterfaces {@override public void doting () {System.out.println ( "I 'm eating"); }} 패키지 com.chengxuyuanzhilu; public class run은 myinterfaces {@override public void doting () {System.out.println ( "I 'm Running"); }} 패키지 com.chengxuyuanzhilu; public class testdynamicbind {public static void main (string [] args) {myinterfaces my = null; my = new eat (); 바인딩 (내); my = new drink (); 바인딩 (내); my = new run (); 바인딩 (내); } static void bind (myinterfaces my) {my.doting (); }}위의 내용은이 기사에 관한 모든 것입니다. 모든 사람의 학습에 도움이되기를 바랍니다.