program tip

내부 클래스가 private final 메서드를 재정의 할 수있는 이유는 무엇입니까?

radiobox 2020. 11. 15. 11:06
반응형

내부 클래스가 private final 메서드를 재정의 할 수있는 이유는 무엇입니까?


private 메서드도 final로 선언하는 것이 합리적 일까 생각했는데 말이 안된다고 생각했습니다. 그러나 나는 독점적 인 상황이 있다고 상상하고 그것을 알아내는 코드를 작성했습니다.

public class Boom {

    private void touchMe() {
        System.out.println("super::I am not overridable!");
    }

    private class Inner extends Boom {

        private void touchMe() {
            super.touchMe();
            System.out.println("sub::You suck! I overrided you!");
        }
    }

    public static void main(String... args) {
        Boom boom = new Boom();
        Boom.Inner inner = boom.new Inner();
        inner.touchMe();
    }
}

그것은 컴파일되고 작동했습니다. "나는 touchMe ()를 최종적으로 만들어야한다"라고 생각하고 해냈다.

public class Boom {

    private final void touchMe() {
        System.out.println("super::I am not overridable!");
    }

    private class Inner extends Boom {

        private void touchMe() {
            super.touchMe();
            System.out.println("sub::You suck! I overrided you!");
        }
    }

    public static void main(String... args) {
        Boom boom = new Boom();
        Boom.Inner inner = boom.new Inner();
        inner.touchMe();
    }
}

그리고 그것은 또한 작동하고 나에게 말한다

chicout@chicout-linlap:~$ java Boom
super::I am not overridable!
sub::You suck! I overrided you!

왜?


private 메서드는 재정의 할 수 없습니다 (private 메서드는 상속되지 않습니다!). 실제로 private 메서드를 final로 선언하더라도 차이가 없습니다.

두 가지 방법은 당신이 선언 한 Boom.touchMeBoom.Inner.touchMe두 가지 완전히 분리 방법 그냥 같은 식별자를 공유하는 일. super.touchMe와 다른 방법 참조하는 사실은 그림자touchMe 때문이 아니라 Boom.Inner.touchMe 그림자 Boom.touchMe 때문입니다.

이것은 여러 가지 방법으로 입증 될 수 있습니다.

  • 당신이 자신을 발견으로 당신이 방법은 공개로 변경하는 경우가 있기 때문에, 컴파일러는 불평 하는 갑자기 최종 메소드를 오버라이드 (override)하려고합니다.

  • 메소드를 비공개로 유지하고 @Override주석을 추가 하면 컴파일러가 불평합니다.

  • alpian이 지적했듯이 Boom.Inner객체를 Boom객체 ( ((Boom) inner).touchMe()) 캐스트하면 Boom.touchMe이 호출됩니다 (실제로 재정의 된 경우 캐스트는 중요하지 않습니다).

관련 질문 :


여기에 실제로 두 가지 별도의 방법이 있다는 사실은 다음과 같이 메인을 변경하여 멋지게 보여줍니다.

public static void main(String... args) {
    Boom boom = new Boom();
    Boom.Inner inner = boom.new Inner();
    inner.touchMe();
    System.out.println("And now cast it...");
    ((Boom)(inner)).touchMe();
}

이제 다음과 같이 인쇄됩니다.

super::I am not overridable!
sub::You suck! I overrided you!
And now cast it...
super::I am not overridable!

And the reason that the call to super works in Inner is because you're looking up a method called touchMe in your super-class (Boom) which indeed exists and is visible to Inner as it is in the same class.


Private methods are invisible to subclasses, or indeed any other class, so they can have the same name, but are not over-riding one another.

Try adding the @Override annotation - you will get a compiler error.


You can override the method because it is private to each class.


You have just declared another method with same name. You are able to call private member of the class because inner class is itself member of class. Hope this modification will explain it in details.

public class Boom {

    private final void touchMe() {
        System.out.println("super [touchMe] ::I am not overridable!");
    }

    public void overrideMe(){
        System.out.println("super [overrideMe]::I am overridable!");
    }

    private class Inner extends Boom {

        private void touchMe() {
            super.touchMe();
            System.out.println("sub [touchMe]::You suck! I overrided you!");
        }

        public void overrideMe(){
            System.out.println("sub [overrideMe] ::I overrided you!");
        }
    }

    public static void main(String... args) {
        Boom boom = new Boom();
        Boom.Inner inner = boom.new Inner();

        inner.touchMe();

        Boom newBoom = inner;
        newBoom.touchMe();
        newBoom.overrideMe();
    }
}



super [touchMe] ::I am not overridable!
sub [touchMe]::You suck! I overrided you!
super [touchMe] ::I am not overridable!
sub [overrideMe] ::I overrided you!

참고URL : https://stackoverflow.com/questions/9524025/why-inner-class-can-override-private-final-method

반응형