2016-01-13 3 views
0

Я знаю, что это не рекомендуется, но почему я могу объявить переменную-член интерфейса не статической?Java - нестационарная переменная-член интерфейса

А в чем разница между статическим и нестационарным элементом интерфейса? Я вижу, что если я определяю переменный элемент интерфейса как статический, я могу использовать его в реализующем классе в не статическом виде:

Интерфейс:

public interface Pinuz { 
    final static int a; 

    public void method1(); 
} 

Реализация класс:

public class Test implements Pinuz { 
    public static void main(String[] args) { 

     Test t = new Test(); 
     int b = t.a; 
    } 

    @Override 
    public void method1() { 
     // TODO Auto-generated method stub 

    } 
} 

Я вижу только предупреждение с просьбой использовать элемент a статическим способом.

+0

Не уверен, что вы имеете в виду. Все переменные в интерфейсе неявно статичны. – Thilo

+0

Интерфейсы могут иметь только статический член _variables_. Сигнатуры методов обычно нестатические, потому что они должны быть реализованы (на Java 8 существуют статические реализации по умолчанию, но это скорее особый случай). – Thomas

ответ

2

Почему я могу объявить переменную-член интерфейса не статической?

Это неявноstaticfinal) (что означает, что static даже если опустить static ключевое слово), as stated in the JLS:

Каждое объявление поля в теле интерфейса неявно public, static и final. Разрешено избыточно указывать любые или все эти модификаторы для таких полей.

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

Причина, по которой находится static, состоит в том, что член принадлежит интерфейсу, а не экземпляру реализации.

Кроме того, будучи static, вы должны просто передать его с-именем класса (в противном случае вы получите предупреждение компилятора), а не через какую-то ссылку, так int b = t.a; следует просто записать как int b = Test.a;

+0

Спасибо @Thilo, обновлено. –

+0

Хорошо. Я был введен в заблуждение тем фактом, что вы можете получить доступ к статическим переменным, используя этот экземпляр, как и в моем сообщении. Я не знал, что это возможно. – sthor69

0

Вы не можете объявить нестационарная переменная в интерфейсе Java. Каждая переменная в интерфейсе является неявно открытой, статической и конечной.

0

Все переменные-члены интерфейса, объявляющие их статическими или нет, являются статическими