JavaRush/Java блог/Архив info.javarush/Вопрос про интерфейсы
dimaMJ
25 уровень

Вопрос про интерфейсы

Статья из группы Архив info.javarush
участников
Встретил в задании такой интерфейс public interface Planet { static String SUN = "sun"; static String MOON = "moon"; static String EARTH = "earth"; } у меня вопрос, какая разница будут ли константы статические или не статические ?
Комментарии (10)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Gopnik
Уровень 12
16 сентября 2015, 16:58
Кто силен в английском? Не могу понять смысл одного из правил переопределения методов, объявленных в интерфейсе. Взято тут.

Checked exceptions should not be declared on implementation methods other than the ones declared by the interface method or subclasses of those declared by the interface method.
kkr
Уровень 23
17 сентября 2015, 00:40
Это значит примерно следующее (Интерфейс и класс в разных файлах).

Правильно:
public interface IFace {
    void someMethod();
}

public class Impl implements IFace {
    void someMethod() { /* Реализация*/ }
}
</code>
Неправильно:
<code>
public interface IFace {
    void someMethod();
}

public class Impl implements IFace {
    void someMethod() throws Exception {
        /* Реализация*/
    }
}
Gopnik
Уровень 12
17 сентября 2015, 08:46
Спасибо. Но я бы хотел получить максимально точный перевод.
Я это перевел так: Проверяемое исключение не пожет быть объявлено в реализации метода, если оно, или его наследник не были обявлены в методе интерфейса. Я близок к истине?
Т.е. такой код

public interface IFace {
    void someMethod() throws Exception;
}

public class Impl implements IFace {
    void someMethod() throws Exception {
        /* Реализация*/
    }
}

не нарушает это правило?
Но я никогда не видел, чтобы иключения упоминались в интерфейсах.
kkr
Уровень 23
17 сентября 2015, 16:45
Такой не нарушает.
dimaMJ
Уровень 25
13 января 2015, 15:51
у меня еще вопрос не про интерфейсы, статические переменные объявленные в классе, инициализируются при любом условии? то есть допустим есть класс Main и класс Cat, в классе Main есть метод main, то есть точка входа и этот класс никак не связан с классом Cat, ни наследует ни создает обькты ничего, статические переменные в классе Cat всеравно инициализируются или инициализация произойдет только через вызов, допустим Cat.catscount?;
rory-breaker
Уровень 9
13 января 2015, 18:01
Судя по результатам отладчика переменная b не инициализируется если закоментировать строку 1

<code>
public class A {    
    public static void main(String[] args) {
        System.out.println("start");
        System.out.println(Const.b); // 1
    }   
}

class B {
    static String b = "b";
}</code>
rory-breaker
Уровень 9
13 января 2015, 12:44
Все поля в интерфейсах даже если это не сделано явно становятся static final.
А вообще использовать интерфейс для описания констант плохая практика, с точки зрения ООП интерфейс должен описывать поведение.
dimaMJ
Уровень 25
13 января 2015, 13:30
это я знаю, тоже немного сбивает когда интерфейсы описывают не поведение или способ взаимодействия, ну значит static писать не обязательно, спасибо за ответ)
dimaMJ
Уровень 25
13 января 2015, 12:03
что никто не ответит ?)
dimaMJ
Уровень 25
12 января 2015, 21:54
они же всеравно все final, их нельзя изменить, поясните пожалуйста)