다음을 고려하여 정적 메서드를 최종적으로 만드는 것에 대해 생각할 수있는 위치에있을 수 있습니다.
다음과 같은 수업이 있습니다.
class A {
static void ts() {
System.out.print("A");
}
}
class B extends A {
static void ts() {
System.out.print("B");
}
}
이제 이러한 메서드를 호출하는 '올바른'방법은 다음과 같습니다.
A.ts();
B.ts();
결과적으로 발생 AB
하지만 인스턴스에서 메서드를 호출 할 수도 있습니다.
A a = new A();
a.ts();
B b = new B();
b.ts();
그 결과 AB
도 마찬가지입니다.
이제 다음을 고려하십시오.
A a = new B();
a.ts();
인쇄 A
됩니다. 실제로 클래스의 객체를 가지고 있기 때문에 놀랄 수도 있습니다 B
. 이 유형의 참조에서 호출하고 있기 때문에 그러나 A
, 그것은 호출합니다 A.ts()
. B
다음 코드로 인쇄 할 수 있습니다 .
A a = new B();
((B)a).ts();
두 경우 모두 당신이 가진 객체는 실제로 class에서 가져온 것 B
입니다. 그러나 객체를 가리키는 포인터에 따라에서 A
또는에서 메서드를 호출 B
합니다.
이제 당신이 클래스의 개발자이고 A
서브 클래스를 허용하고 싶다고 가정 해 봅시다 . 그러나 당신은 정말로 method를 원한다 ts()
. 심지어 서브 클래스에서 호출 될 때조차, 그것이 당신이 원하는 일을하고 서브 클래스 버전에 의해 숨겨지지 않도록하는 것이다. 그런 다음 그것을 만들고 final
하위 클래스에서 숨겨지지 않도록 할 수 있습니다 . 그리고 다음 코드가 클래스에서 메서드를 호출 할 것임을 확신 할 수 있습니다 A
.
B b = new B();
b.ts();
좋아, 그것은 어떻게 든 구성되었지만 어떤 경우에는 의미가있을 수 있습니다.
인스턴스에서 정적 메서드를 호출하지 말고 클래스에서 직접 호출하면 문제가 발생하지 않습니다. 또한 예를 들어 IntelliJ IDEA는 인스턴스에서 정적 메서드를 호출하고 정적 메서드를 최종적으로 만들면 경고를 표시합니다.