2012-05-13 2 views

답변

13

오버로드 및 재정의는 보완적인 작업이며 오버로드는 동일한 메서드 이름이지만 다른 매개 변수를 의미하며 재정의는 동일한 매개 변수를 사용하는 하위 클래스에서 동일한 메서드 이름을 의미합니다. 오버로드가 다른 매개 변수를 포함하기 때문에 동시에 오버로드 및 오버라이드가 동시에 발생할 수 없습니다.

예 :

class A { 
    public void doSth() { /// } 
} 

class B extends A { 
    public void doSth() { /* method overriden */ } 

    public void doSth(String b) { /* method overloaded */ } 

} 

건배!

+5

원하는 경우 오버로드 된 메서드를 재정의 할 수 있습니다. 그것은 가능한 한 가까이 있습니다. – user845279

+0

이 경우 메서드의 바인딩 (정적 또는 동적)을 담당합니다. 재정의 또는 과부하? – zgulser

5

과부하 및 과부하는 단지 추상화입니다. 오버로딩이란 컴파일러가 호출 할 함수를 지정하기 위해 매개 변수의 유형 및 개수와 함께 이름을 사용한다는 것을 의미합니다. 실제로 메소드 오버로딩은 컴파일러가 함수를 찾기 위해 사용하는 키가 이름과 매개 변수 목록의 조합이므로 다른 이름을 지정하는 것과 다르지 않습니다.

오버라이드는 컴파일러가 super 키워드로 오버라이드 된 기능을 처리 할 수 ​​있다는 점을 제외하면 동일한 원칙입니다.

오버로드 된 함수를 재정의 할 수 있습니까? 예, 오버로드 된 메서드는 컴파일러의 관점에서 완전히 다른 메서드이기 때문에 그렇습니다.

+0

무시가 전혀 다른 것은 아닙니다. 호출 할 메소드에 대한 결정은 런타임으로 연기됩니다. 컴파일러는 그것을 결정하지 않습니다. – EJP

+0

감사합니다. 도움이됩니다. –

+0

@EJP - 궁극적으로 컴파일러는 동적 디스패치를 ​​용이하게하기 위해 vtables 및 vpointer 할당을 통해 추상화 된 경우에도 결정을 내립니다. 바인딩하는 관계는 어딘가에서 초기화되어야합니다. – nsfyn55

1

의미에 따라 다릅니다. 메서드는 수퍼 클래스에서 오버로드 된 메서드에 대한 재정의 일 수 있습니다. 다른 메서드를 사용하여 동시에 재정의하는 메서드를 오버로드 할 수 있습니다.

그러나 new 오버로드와 재정의 중 하나의 방법을 사용할 수 없습니다. 메서드를 재정의하려면 동일한 서명을 가진 다른 메서드가 이미 수퍼 클래스에 있어야합니다. 즉이 메서드는 재정의가 될 수 없습니다.

관련 문제