public class Twisted {
private final String name;
public Twisted(String name) {
this.name = name;
}
private String getName() {
return this.name;
}
private void reproduce() {
new Twisted("reproduce") {
private void print() {
System.out.println(getName());
}
}.print();
}
public static void main(String[] args) {
new Twisted("main").reproduce();
}
}
Сначала я подумал, что она совсем не скомпилируется. Потом подумал, что по логике должно напечатать "reproduce". Но и тут чувствуется подвох...
Так было бы, если бы getter не был бы
private
. Согласно спецификации (JLS 8.2) приватные члены класса никогда не наследуются. Следовательно, из метода print
будет вызван метод внешнего (outer) класса, т.е. того класса, экземпляр которого мы создали с именем "main". Соответственно, будет напечатано "main".Авторы напоминают совет из головоломки 6: если вы не можете с первого взгляда сказать, что делает некая программа, то возможно она делает совсем не то, что вы от нее хотите.
Комментариев нет:
Отправить комментарий