Переопределение переменной интерфейса?

Как я читал из различных книг и учебников 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 ответов


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

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

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

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


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

public static final ...

Итак, вы не можете переопределить его в любом случае.


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

Если вы объявляете переменную в статическом и окончательном, то есть константе, то она видна исполнителям.