Из JLS Java SE 7 Edition §15.11.1:
Отсутствие динамического поиска для доступа к полям позволяет программам эффективно запускаться с помощью простых реализаций. Возможность позднего связывания и переопределения доступна, но только при использовании методов экземпляра.
blockquote>Ответы Оливера Чарльворта и Марко Топольника верны, я хотел бы подробнее рассказать о почему часть вопроса:
В Java члены класса являются доступными в соответствии с типом ссылки, а не типом фактического объекта. По той же причине, если у вас есть
someOtherMethodInB()
в классеB
, вы не сможете получить к нему доступ изaRef
после запускаaRef = b
. Идентификаторы (т. Е. Имена классов, переменных и т. Д.) Разрешаются во время компиляции, и поэтому компилятор полагается на ссылочный тип для этого.Теперь в вашем примере при запуске
System.out.println(aRef.intVal);
он печатает значениеintVal
, определенный вA
, потому что это тип ссылки, которую вы используете для доступа к ней. Компилятор видит, чтоaRef
имеет типA
, и этоintVal
, к которому он будет обращаться. Не забывайте, что у вас есть оба поля в экземплярахB
. JLS также имеет пример, похожий на ваш, «15.11.1-1. Статическая привязка для доступа к полям», если вы хотите взглянуть.Но почему методы ведут себя по-другому? Ответ заключается в том, что для методов Java использует позднюю привязку. Это означает, что во время компиляции он находит наиболее подходящий метод для поиска во время выполнения. Поиск включает случай переопределения метода в некотором классе.
Apache Сеть палаты общин имеет org.apache.commons.net.util.SubnetUtils
, который, кажется, удовлетворяет Ваши потребности. Похоже, что Вы делаете что-то вроде этого:
SubnetInfo subnet = (new SubnetUtils("10.10.10.0", "255.255.255.128")).getInfo();
boolean test = subnet.isInRange("10.10.10.10");
Примечание, как carson указывает, тот Apache, который Сеть палаты общин имеет ошибка , который препятствует тому, чтобы он дал корректный ответ в некоторых случаях. Carson предлагает использовать версию SVN для предотвращения этой ошибки.
Можно также попробовать
boolean inSubnet = (ip & netmask) == (subnet & netmask);
или короче
boolean inSubnet = (ip ^ subnet) & netmask == 0;