이것은 구현의 "기능"입니다. 메모리,이 때문에 다음과 같습니다 당신이 B
의 인스턴스에 i
에 액세스 할 때
a:
pointer to class A
int i
b:
pointer to class B
int i (from A)
int i (from B)
는, 자바는 의미있는 변수를 알 필요가있다. 그것은 할당해야 모두 B
에서 방법을 원하는 반면 클래스 A
의 방법은 자신의 필드 i
에 액세스 할 것이기 때문에 자신의 i
(당신이 B
에 새 필드 i
을 만드는 대신 B
에 A.i
볼 만들기로 결정했습니다부터). 즉, 두 개의 i
이 있고 표준 공개 규칙이 적용됩니다. 둘 중 어느 쪽이 더 가깝습니까?
이제 A a=new B();
이라고 말하면 Java는 "오른쪽에서 결과를 A
인 것처럼 취급합니다"라고 알려주기 때문에 약간 까다 롭습니다.
메서드를 호출하면 Java가 클래스 포인터 (메모리의 개체에서 첫 번째 것)를 따릅니다. 거기에서 메소드 목록을 찾습니다. 메소드가 서로 겹쳐 쓰므로 메소드 show()
을 찾을 때 B
에 정의 된 메소드를 찾습니다. 메소드 접근을 빠르게 만든다. 클래스 B
의 (내부) 메소드 목록에있는 모든 보이는 메소드를 간단하게 합칠 수 있으며 각 호출은 그리스트에 대한 단일 액세스를 의미한다. 모든 클래스를 검색 할 필요가 없습니다.
필드 액세스가 비슷합니다. Java는 검색을 좋아하지 않습니다. 따라서 B b = new B();
이라고 말하면 B
에서 b.i
이 분명합니다. 그러나 당신은 A a = new B()
에게 자바에게 새로운 인스턴스를 A
타입으로 취급하는 것을 선호한다고 말했습니다. Java는 게으르다. A
을 조사하고, 필드가 i
인 것을 확인하고, 그 필드를 볼 수 있고 더 이상 a
의 실제 유형을 보지 않아도된다. (느릴 것이기 때문에) 느리고 b) 캐스팅하여 두 필드 모두에 액세스하지 못하도록합니다.
결국 Java는 필드 및 메소드 조회를 최적화하기 때문입니다.
클래스 선언에 대한 내 노트를 확인하십시오. –