2016-08-05 4 views
0

Постоянный пул класса имеет символическую ссылку на поля и методы. Имеет ли константный пул класса символические ссылки для методов, определенных только в классе или ссылках методов, определенных в его суперклассе.java constant pool символическая ссылка

+3

Вы прошли через это сообщение? - http://stackoverflow.com/questions/10209952/what-is-the-purpose-of-the-java-constant-pool – JavaHopper

+0

попробуйте "javap -verbose ", чтобы увидеть постоянный пул любого класса –

+0

@javahopper I Прошел этот пост, я только начинаю с java, так что собрал столько, сколько смогу. Из сообщения и ссылок я понял, что постоянный пул класса будет иметь только символические ссылки на методы, определенные в этом классе, а не наследованные методы. Просто хочу подтверждение, если мое понимание верное. – cloud

ответ

0

Вы смешиваете ссылки и объявления. Постоянный пул содержит только ссылки методам и полям, поэтому вопрос о том, содержит ли константный пул ссылки на метод , объявленный в суперклассе, не может дать окончательного ответа.

Пул постоянного класса может содержать, ссылаясь на метод суперкласса, если они переданы каким-либо образом, например. если класс вызывает методы суперкласса. Аналогично, постоянный пул классов может содержать ссылки на свои объявленные методы, если они используются внутри. Но если класс не вызывает один из своих собственных методов и не ссылается на него иначе, он не будет ссылаться на него в пуле констант.

Напротив, файл класса содержит список его объявленных методов, включая информацию, такую ​​как их код реализации или аннотации, чьи записи обмениваются информацией с постоянным пулом, но это не, содержащихся в постоянном пуле.

Чтобы быть более конкретным, ссылка метода в пуле констант состоит из двух ссылок на другие записи пула, один из которых указывает класс объявления, а другой - запись типа «name &», снова состоящая из двух ссылок на другой пул записи, указывающие имя метода и подпись типа. Напротив, объявленный метод, явно не требующий указания класса объявления, имеет две прямые ссылки на пул, указав имя и подпись типа.

Так когда класс объявляет метод void foo(), будет две постоянные записи пула для имени foo и типа подписи ()V, что декларация относится. Если класс также имеет ссылку на этот метод, который не является обязательным, также будет запись «name &», указывающая на две записи, описанные выше, и ссылку на ссылку метода, ссылающуюся на запись «имя &» и запись класса, определяющая класс this как класс объявления.


Резюмируя, постоянный пул может содержать ссылки на методы произвольных классов, в том числе тех, которые объявлены в собственной иерархии классов, но не надо. Список объявленных методов, которые не следует путать с пулом констант, будет содержать только методы, объявленные в этом классе, включая те, которые переопределяют методы суперкласса, но не унаследованные методы.

Смежные вопросы