2017-09-03 16 views
1

후기 바인딩을 이해하려고합니다. 검색된 결과 : Late Binding : 런타임 중에 변수가 실행될 때까지 유형을 알 수 없습니다. 보통 할당을 통해하지만 형식을 강요하는 다른 수단이 있습니다. 동적 유형 지정 언어는 이것을 기본 기능이라고하지만, 많은 유형의 정적 언어에는 런타임에 바인딩을 구현하는 몇 가지 f}이 있습니다. Java : 늦은 바인딩 및 어디에 사용합니까? 이점은 무엇입니까?

예를

이 같다 :

public class DynamicBindingTest { 

    public static void main(String args[]) { 
     Vehicle vehicle = new Car(); //here Type is vehicle but object will be Car 
     vehicle.start();  //Car's start called because start() is overridden method 
    } 
} 

class Vehicle { 

    public void start() { 
     System.out.println("Inside start method of Vehicle"); 
    } 
} 

class Car extends Vehicle { 

    @Override 
    public void start() { 
     System.out.println("Inside start method of Car"); 
    } 
} 

그러나 이익 차량은 차량 = 새 차 무엇(); 이것을 사용하십시오. 그냥 쓸 것 자동차 자동차 = 새 차(); ? 나에게 설명해주세요?

+0

일반적인 개발, 의존성 주입, 그리고 전체적으로 그것은 경우에 따라 다릅니다. – Transcendent

+0

C.f. [ "인터페이스를 프로그래밍하는 것은 무엇을 의미합니까?"] (https://stackoverflow.com/questions/383947/what-does-it-mean-to-program-to-an-interface) – markspace

+0

@markspace 그것은 좋은 해답을 가지고 있습니다. –

답변

3

하지만 이점은 무엇입니까? 차량용 차량 = 새로운 자동차(); 이것을 사용하십시오. 그냥 car car = new Car();를 써야합니다. ? 나에게 설명해주세요?

네, 그렇게 할 수 있습니다. 이 작은 예에서는 후기 바인딩에서 즉각적인 이점이 거의 없습니다.

하지만이 약간 다른 예는 무엇입니까? 우리가 Vehicle의 더 서브 클래스를 추가 한 경우

public static void main(String args[]) { 
    Vehicle vehicle = (args[0].equals("car")) ? new Car() : new Vehicle(); 
    vehicle.start(); 
} 

... 또는 (말)의 인스턴스를 Car 또는 Truck ...


다른 혜택에 명확하게 될 것이다, 너무있다 프로그래밍에서 경험을 쌓으면서 특히 을 작성하고 큰 프로그램을 유지해야하는 경우에 그렇습니다.


일반적으로 자바는 일반적으로 정적 유형 언어로 분류됩니다. 그리고 당신의 예제와 광산에서의 다형성/후기 바인딩은 정적 타이핑에 의존합니다. 동적 유형 지정은 유형 캐스트, instanceof 및 이와 유사한 유형을 사용하는 경우에만 작동합니다.

유형 검사가 발생하면 정적 유형과 동적 유형의 차이는 약 입니다. 형식 검사가 (대부분) 컴파일 타임에 발생하고 컴파일 타임에 오류가보고되면 언어가 정적으로 검사됩니다.


우리는 또한 Vehicle의 더 서브 클래스를 추가하고, 만들고 main의 소스 코드의 서브 클래스의 이름을 언급하지 않고, 차량의 어떤 종류를 시작하는 main 방법을 수정할 수 있습니다. 이는 후기 바인딩의 또 다른 측면으로, 귀하의 예에서는 분명하지 않습니다.

0

호출 할 메소드는 런타임시 오브젝트의 런타임 유형을 기반으로 모든 경우에 결정됩니다. 컴파일시에 결정되는 것은 최종, 개인 또는 정적 메서드 호출 또는 오버로드 된 메서드 집합 (오버로드 된 메서드가 final, private 또는 static이 아닌 경우 런타임 선택으로 이어질 수 있음)에 대한 호출입니다.

두 번째 질문에 대한 대답 : 왜?

vehicle car= new Car(); 

하지

Car car= new Car(); 

이 다형성이며 자동차와 루프를 사용해야하고 bike.They 모두 우리가 차량 배열을 만들 것입니다, 그래서 여기에 차량이며, 때 상황을 생각한다 두 개체를 저장할 수 있으므로 자전거와 자동차 루프를 다르게 사용할 필요가 없습니다.