English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

왜 부모 클래스의 스타틱 메서드가 Java의 자식 클래스에서 숨겨지는지요?

두 개의 클래스가 있을 때, 하나의 클래스가 다른 클래스를 확장하면, 이 두 클래스가 동일한 메서드를 가지고 있으며, 이 메서드가 파라미터와 반환형(예: 샘플)을 포함하면, 하위 클래스의 메서드는 상위 클래스의 메서드를 오버라이딩합니다.

즉, 상속의 이유로 인해. 하위 클래스를 인스턴스화하면, 상위 클래스의 멤버의 복사본이 하위 클래스 객체에 생성되므로, 이 두 메서드 모두 하위 클래스의 객체에서 사용될 수 있습니다.

하지만, 메서드를 호출하면,( 샘플 )그렇다면, 상위 클래스의 메서드를 오버라이딩하기 위해 하위 클래스의 샘플 메서드를 실행합니다.

예제

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으로 지정했기 때문에, 메서드 호출은 컴파일 시 자동으로 해결되며, 정적 메서드는 재정의할 수 없습니다.

그러나, 정적 메서드 복제를 사용할 수 있으므로, 자식 클래스 메서드를 호출하면 다시 정의됩니다/비공개 슈퍼클래스 메서드

좋아하는 것을 추천