Почему переменные интерфейса статические и финальные по умолчанию? - PullRequest
244 голосов
/ 12 марта 2010

Почему переменные интерфейса статические и финальные по умолчанию в Java?

Ответы [ 14 ]

0 голосов
/ 23 сентября 2016

Только что попробовал в Eclipse, переменная в интерфейсе по умолчанию является окончательной, поэтому вы не можете ее изменить. По сравнению с родительским классом переменные однозначно изменяемы. Зачем? С моей точки зрения, переменная в классе - это атрибут, который будет наследоваться детьми, и дети могут изменять его в соответствии с их реальной потребностью. Напротив, интерфейс определяет только поведение, а не атрибут. Единственная причина для добавления переменных в интерфейс - это использовать их как константы, связанные с этим интерфейсом. Хотя, согласно следующей выдержке, это не очень хорошая практика:

«Размещение констант в интерфейсе было популярной техникой в ​​первые дни Java, но сейчас многие считают это отвратительным использованием интерфейсов, поскольку интерфейсы должны иметь дело с услугами, предоставляемыми объектом, а не его данными. константы, используемые классом, обычно являются деталями реализации, но размещение их в интерфейсе превращает их в общедоступный API класса ".

Я тоже пробовал либо ставить статический, либо вообще ничего не меняет. Код как ниже:

public interface Addable {
    static int count = 6;

    public int add(int i);

}

public class Impl implements Addable {

    @Override
    public int add(int i) {
        return i+count;
    }
}

public class Test {

    public static void main(String... args) {
        Impl impl = new Impl();

        System.out.println(impl.add(4));
    }
}
0 голосов
/ 23 июля 2015

Подумайте о веб-приложении, в котором вы определили интерфейс и другие классы реализуют его. Поскольку вы не можете создать экземпляр интерфейса для доступа к переменным, вам нужно иметь статическое ключевое слово. Поскольку оно статическое, любое изменение значения будет отражаться для других экземпляров, которые его реализовали. Поэтому, чтобы предотвратить это, мы определяем их как окончательные.

0 голосов
/ 15 апреля 2015

Интерфейс может быть реализован любыми классами, и что, если это значение будет изменено одним из реализующих классов, это может ввести в заблуждение другие реализующие классы. Интерфейс в основном является ссылкой для объединения двух связанных, но различных сущностей. Поэтому по этой причине объявленная переменная внутри интерфейса будет неявно конечной, а также статической, поскольку интерфейс не может быть создан.

0 голосов
/ 09 апреля 2015

В Java интерфейс не позволяет вам объявлять какие-либо переменные экземпляра. Использование переменной, объявленной в интерфейсе в качестве переменной экземпляра, вернет ошибку времени компиляции.

Вы можете объявить постоянную переменную, используя static final, которая отличается от переменной экземпляра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...