내부 클래스가 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.touchMe
및 Boom.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
'program tip' 카테고리의 다른 글
C ++ 11 "자동"의미 (0) | 2020.11.15 |
---|---|
숫자 리터럴의 ULL 접미사 (0) | 2020.11.15 |
MongoDB 원거리 페이지 매김 (0) | 2020.11.15 |
Python 팬더의 데이터 프레임에서 matplotlib 산점도 만들기 (0) | 2020.11.15 |
Joda-Time DateTime을 java.util.Date로 또는 그 반대로 변환하는 방법은 무엇입니까? (0) | 2020.11.15 |