Переопределение переменной интерфейса? - PullRequest
10 голосов
/ 11 января 2012

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

Я сделал простой код для проверки

interface A_INTERFACE
{ 
    int var=100; 
}

class A_CLASS implements A_INTERFACE
{ 
    int var=99; 
    //test
    void printx()
    {
        System.out.println("var = " + var);
    }
}

class hello
{

    public static void main(String[] args)
    {
        new A_CLASS().printx();
    }
}

и распечатывает var = 99

Переопределено ли var? Я полностью сбит с толку. Спасибо за любые предложения!


Большое спасибо всем! Я довольно новичок в этом интерфейсе. «Тень» - ключевое слово, чтобы понять это. Я смотрю соответствующие материалы и понимаю это сейчас.

Ответы [ 4 ]

12 голосов
/ 11 января 2012

Он не переопределяется, а затеняется, что приводит к дополнительной путанице, поскольку константа в интерфейсе также является статической.

Попробуйте это:

A_INTERFACE o = new A_CLASS();
System.out.println(o.var);

Вы должны получить предупреждение во время компиляции о доступе к статическому полю нестатическим способом.

А теперь это

A_CLASS o = new A_CLASS();
System.out.println(o.var);
System.out.println(A_INTERFACE.var);  // bad name, btw since it is const
10 голосов
/ 11 января 2012

Вы не переопределили переменную, вы затеняли ее новой переменной экземпляра, объявленной в более конкретной области видимости. Это переменная, напечатанная в вашем методе printx.

4 голосов
/ 11 января 2012

Подпись по умолчанию для любой переменной в интерфейсе:

public static final ...

Так что вы все равно не можете переопределить его.

0 голосов
/ 11 января 2012

Переменная, которую вы объявили в этом интерфейсе, не видна классу, который ее реализовал.

Если вы объявляете переменную в static и final, то есть в константе, ТОГДА она видна разработчикам.

...