package com.javarush.test.level24.lesson02.home01;
import com.javarush.test.level24.lesson02.home01.SelfInterfaceMarkerImpl.UnsupportedInterfaceMarkerException;
import java.lang.reflect.Method;
public class Util {
//пример того, как можно использовать интерфейс-маркер
//this method is available only for a SelfInterfaceMarker implementation
public static void testClass(SelfInterfaceMarker interfaceMarker) throws UnsupportedInterfaceMarkerException {
if (interfaceMarker == null) throw new UnsupportedInterfaceMarkerException();
for (Method method : interfaceMarker.getClass().getDeclaredMethods()) {
System.out.println(method);
}
}
}
В 11 строчке есть вызов собственного исключения, находящегося в другом файле как внутренний класс. Компилятор ругается, говорит что это исключение is not an enclosing class.
Если я все правильно понимаю, то тут 2 варианта решения - либо объявить этот класс static, либо вынести это исключение в отдельный файл.
Собственно, вопрос - а что может случиться, если это не статический класс. То ли это я туго соображаю, но не могу придумать, что должно случиться, чтобы статичность класса имела значение в данном случае.Александр Дорофеев
41 уровень
Пояснение требуется
Решен
Комментарии (1)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Александр Колинченко Java Developer в EPAM
21 мая 2018, 15:41полезный
Попробую ответить как понял, вопрос немного неструктурированный по мне, возможно не так понял проблему и ваш уровень понимания темы.
Вообще, в вопросе вы затронули три отдельные темы, скорее всего:
1. Разница между статическими членами класса (переменными, методами и внутренними классами) и стандартными. Самое важное - static = "Один на весь класс и создается, даже если никаких объектов класса не было создано". Отсюда требование - из static методов и классов доступ в обычные не может быть напрямую, только через создание объекта класса. И наоборот, к static переменным, методам и классам извне нужно обращаться просто через название класса -
OuterClass.staticMethod()
, а не
(new OuterClass).staticMethod
2. Обращение к внутренними классам других класов и что такое внутренние классы вообще
Самое важное - Внутренний класс можно рассматривать во многих вопросах как просто другое оформление функционала внешнего класса вместо стандартных методов. Как к методам другого класса, к внутреннему классу можно обращаться только "с разрешения" внешнего класса. Т.е. с его названием, если внутренний класс - static
(SelfInterfaceMarkerImpl.UnsupportedInterfaceMarkerException)
, либо через его объект
SelfInterfaceMarkerImpl simi = new SelfInterfaceMarkerImpl()
SelfInterfaceMarkerImpl.UnsupportedInterfaceMarkerException uime = simi.new UnsupportedInterfaceMarkerException()
3. Ну и статический импорт - это просто сокращение, чтобы можно было обращаться к статическим (!) членам других классов по короткому имени, без упоминания всех регалий.
Если например есть переменная
public static final Integer SOMETHING = 10; в классе SelfInterfaceMarkerImpl, то из другого класса ее можно вызвать так:
SelfInterfaceMarkerImpl.SOMETHING
А можно добавить статический импорт:
import static com.javarush.task.task24.task2401.SelfInterfaceMarkerImpl.SOMETHING
и тогда звать просто по имени:
Integer i = SOMETHING;
Уф...
+1