Разделите переменную между функциями в реализации интерфейса - PullRequest
2 голосов
/ 24 сентября 2019

Рассмотрим интерфейс и его реализацию,

interface A {
    int a;
    default void add() {
        a = a+10;
    }
    public void sub();
}

class X implements A {
    public sub() {
        a = a-5;
    }
}    

Я должен использовать переменную a в sub() функции класса X.Как я могу это сделать?

Ответы [ 4 ]

3 голосов
/ 24 сентября 2019

Все переменные, объявленные внутри интерфейса, являются неявно открытыми статическими конечными переменными (константами).

Из часто задаваемых вопросов по разработке интерфейса Java от Филиппа Шоу:

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

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

Следовательно, если вообще существует переменная интерфейса, она будет неявно статической, окончательно и очевидно публично !!!

2 голосов
/ 24 сентября 2019

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

Интерфейсы donнет государства.Абстрактные занятия могут.

abstract class A {
    protected int a;

    public void add() {
        a += 10;
    }
    public abstract void sub();
}

final class X extends A {
    public void sub() {
        a -= 5;
    }
}
0 голосов
/ 24 сентября 2019

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

Код с интерфейсом

Код с абстрактным классом

0 голосов
/ 24 сентября 2019

Я бы использовал абстрактный класс вместо интерфейса.Таким образом, переменная может быть изменена расширяющим классом.

abstract class A{
    int a=10;
    void add(){
        a=a+10;
    }
    public abstract void sub();
}
class X extends A{
    public void sub(){
        a=a-5;
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...