English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
두 개의 클래스가 있을 때, 하나의 클래스가 다른 클래스를 확장하면, 이 두 클래스가 동일한 메서드를 가지고 있으며, 이 메서드가 파라미터와 반환형(예: 샘플)을 포함하면, 하위 클래스의 메서드는 상위 클래스의 메서드를 오버라이딩합니다.
즉, 상속의 이유로 인해. 하위 클래스를 인스턴스화하면, 상위 클래스의 멤버의 복사본이 하위 클래스 객체에 생성되므로, 이 두 메서드 모두 하위 클래스의 객체에서 사용될 수 있습니다.
하지만, 메서드를 호출하면,( 샘플 )그렇다면, 상위 클래스의 메서드를 오버라이딩하기 위해 하위 클래스의 샘플 메서드를 실행합니다.
class Super{ public static void sample(){ System.out.println("상위 클래스의 메서드"); } } public class OverridingExample extends Super { public static void sample(){ System.out.println("하위 클래스의 메서드"); } public static void main(String args[]){ Super obj1 = (Super) new OverridingExample(); OverridingExample obj2 = new OverridingExample(); obj1.sample(); obj2.sample(); } }
출력 결과
상위 클래스의 메서드 하위 클래스의 메서드
상위 클래스와 하위 클래스가 동일한 메서드(파라미터 포함)를 가지고 있으며, 이 메서드가 정적인지 여부와 관계없이, 상위 클래스의 메서드는 하위 클래스의 메서드에 의해 숨겨집니다.
이 메커니즘은 "메서드 숨기기"라는 단어로 간단히 불리지만, 상위 클래스와 하위 클래스가 동일한 스타일의 메서드를 가지고 있더라도, 이는 오버라이딩으로 간주되지 않습니다.
class Super{ public static void demo() { System.out.println("This is the main method of the superclass"); } } class Sub extends Super{ public static void demo() { System.out.println("이것은 서브 클래스의 주 메서드입니다"); } } public class MethodHiding{ public static void main(String args[]) { MethodHiding obj = new MethodHiding(); Sub.demo(); } }
출력 결과
이것은 서브 클래스의 주 메서드입니다
메서드 오버로딩의 핵심은, 부모 클래스와 자식 클래스가 동일한 서명을 가진 메서드를 가지고 있다면, 자식 클래스 객체에 대해 두 메서드 모두 사용할 수 있습니다. 객체를 저장하는 참조 타입에 따라 해당 메서드가 실행됩니다.
SuperClass obj1 = (Super) new SubClass(); obj1.demo() // 슈퍼 클래스의 demo 메서드를 호출합니다 SubClass obj2 = new SubClass(); obj2.demo() //서브 클래스의 demo 메서드를 호출합니다
그러나, 정적 메서드의 경우, 그들이 어떤 인스턴스에도 속하지 않기 때문에, 클래스 이름을 사용하여 접근해야 합니다.
SuperClass.demo(); SubClass.Demo();
따라서, 부모 클래스와 자식 클래스가 동일한 서명을 가진 정적 메서드를 가지고 있다면, 자식 클래스 객체는 부모 클래스 메서드의 복제를 사용할 수 있습니다. 정적 메서드는 자기 자신을 static으로 지정했기 때문에, 메서드 호출은 컴파일 시 자동으로 해결되며, 정적 메서드는 재정의할 수 없습니다.
그러나, 정적 메서드 복제를 사용할 수 있으므로, 자식 클래스 메서드를 호출하면 다시 정의됩니다/비공개 슈퍼클래스 메서드