2012-08-16 19 views
6

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

interface inter{ 

     int a=10; // It becomes final static by default 

     public void interFunc(); 
} 

class cls implements inter{ 

     public void interFunc(){ 

      System.out.println("In Class Method WITH a's Value as --> "+a); 
     } 
} 

class Test{ 

     public static void main(String[] args){ 

      inter in= new cls(); 

      in.interFunc();  
      } 
} 

Спасибо заранее !!!

+0

Дубликат http://stackoverflow.com/questions/2430756/why-are-interface-variables-static-and-final-by-default –

ответ

4

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

0

Интерфейсные переменные являются статическими, поскольку интерфейсы Java не могут быть созданы сами по себе; значение переменной должно быть назначено в статическом контексте, в котором не существует экземпляра. Окончательный модификатор гарантирует, что значение, присвоенное переменной интерфейса, является истинной константой, которая не может быть повторно назначена программным кодом. и имейте в виду, что интерфейс используется, чтобы показать, «что» вам нужно реализовать, а не как. поэтому переменные должны быть окончательными (поскольку нестатические переменные не связаны со всей спецификацией класса).

+0

Пожалуйста, включите ссылку на источник цитаты. Кроме того, markup '> stuff' можно использовать для цитирования« stuff ». –

+0

ok .. Хорошо спасибо другу .. Это что-то хорошее объяснение очищает некоторые веб-страницы здесь ... :) – AnkitChhajed

0

Переменные члена Java должны быть окончательными по умолчанию, поскольку интерфейсы не должны быть созданы. По умолчанию они также статичны. Таким образом, вы не можете изменить свою ценность, а также не можете переназначить их после их назначения. Here's что-то на интерфейсах. Надеюсь, поможет.

11

Интерфейс не является классом, он представляет собой набор правил и не может быть создан, то он не может содержать какой-либо испаряемый контейнер данных внутри. Внутри интерфейса могут быть установлены только константы, хотя это не рекомендуется, поскольку декларирование констант в интерфейсах violates encapsulation approach.

+2

+1 для «не делай этого» :) –

+0

Не связано с вопросом, но я не вижу как константа, объявленная в интерфейсе (общие знания), нарушает инкапсуляцию. Если предоставление интерфейсов также является нарушением инкапсуляции. Однако в ссылке все объясняется: объявляйте как можно больше переменных в интерфейсе - просто используйте «статический импорт» вместо реализации/расширения. – uvsmtid

0

Java- Не реализует множественное наследование Но по интерфейсу мы можем достичь.

interface i1{ 
    int a=1; 
} 

interface i2{ 
    int a=2; 
} 

class exampleInterface implements i1,i2{ 
    public static void main(String...a){ 

     //As interface members are static we can write like this 
     //If its not static then we'll write sysout(a) ... which gives ambiguity error. 
     //That's why it is static. 

     System.out.println(i2.a); 
    } 
} 

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

class x{ 
    static int r=10; 
} 

class y extends x{ 
    static void fun(){ 
     x.r=20; 
     System.out.println(x.r); 
    } 
} 

class m extends x{ 
    void fun(){ 
     System.out.println(x.r); 
    } 
} 

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

     y.fun(); 
     m obj=new m(); 
     obj.fun(); 
    } 
} 
Смежные вопросы

 Смежные вопросы