Ответ 1
super
на самом деле не является выражением, и там нет статического типа. super.foo()
имеет тот же доступ, что и this.foo()
; это просто так, что вызов метода переводится по-разному в байтовый код, как "супер-вызов", в отличие от "обычного вызова".
JLS не очень ясно говорит об этом; например в разделе защищенный доступ форма super.protectedMember
не упоминается; но, очевидно, эта форма должна обсуждаться в JLS; и он должен быть доступен. (В разделе показано, что X::m
и X.m
следует обращаться с тем же правом доступа w.r.t.)
В разделе ссылка метода, формулировка также нечеткая; тем не менее, super::clone
должен быть доступен теми же способами, что и super.clone()
.
Создан отчет об ошибке: JDK-8139836: "Нельзя использовать ссылку на метод super:: x при защите x" . Его текущий статус заключается в том, что он будет исправлен в Java 9.