저는 오늘 최종 방법에서 최대 reading입니다. 그리고 클래스 최종을 선언하는 것은 모든 메소드를 최종적으로 선언하기위한 짧은 손일뿐입니다.
방법 최종 선언의 장점은 컴파일러가 메소드를 디스패치 할 때 가상 테이블 룩업을 이용하여 회피 할 수 있다는 것이다 -. 즉,이 방법에서 찾아 볼 수있는 클래스를 정확하게 알고
Java 메소드는 기본적으로 가상 메소드이며, C++에서는 그 반대가 사실입니다. Java에서 가상이 아닌 유일한 메소드는 정적 메소드와 최종 메소드입니다.
최종 메서드를 명시 적으로 선언함으로써 얻는 성능상의 이점에 대해서는 논쟁의 여지가 있습니다. 훌륭한 JIT 컴파일러는 코드를 분석하고 유용하다고 판단되는 최적화를 수행 할 수 있습니다. 클래스 A에 현재로드 된 하위 클래스가없는 경우 자주 호출되는 경우 JIT 컴파일러는 A 인스턴스의 메서드를 호출하는 코드 경로를 최적화하도록 결정할 수 있습니다. 여기에는 vtable 조회를 없애거나 메소드 호출을 인라이닝하는 것이 포함됩니다.
예 : 다음 코드 경로는 메서드를 빠르게 실행하면 최적화 할 수있는 좋은 방법입니다. 방법을 재정의하는의 서브 클래스가 이후에로드 된 경우
public void run(A instance) {
while (true) {
instance.method();
}
}
다음 JIT 컴파일러는 메소드의 호출에 관하여 한 모든 최적화를 무효화 할 수 있습니다.
본질적으로 훌륭한 JIT는 실제로 최종적인 것을 선언하지 않고도 최종 선언문의 모든 장점을 제공 할 수 있습니다. 그리고 우리는 최종적인 것을 선언 할 필요가 없기 때문에 어떤 클래스 나 메소드가 최종적인 것인지 걱정할 필요없이 완전히 객체 지향적 인 접근 방식으로 자유롭게 개발할 수 있습니다. 따라서 final은 문서화 목적으로 만 사용해야합니다. 한 가지 예외는이 필드를 사용하여 메모 작성의 후보로 표시된 모든 계산 즉, 결과를 캐싱하고 계산을 다시 수행하는 대신 캐시 된 결과를 사용한다는 것입니다.
JVM 구현 문제 - 내부적으로 메모리를 처리하는 방법과 가비지 수집에 영향을 미칠 수 있습니까? 이는 메모리가 Java에 어떻게 표시되는지와 다릅니다. – user611942