Как поля добавляются от интерфейса к классу в Java? - PullRequest
0 голосов
/ 08 апреля 2019
interface Z{ int x = 10;}

Class A implements Z{}

Class B implements Z{}

Как Java использует х в этом случае?

Генерирует ли java одну копию x, потому что x является статическим final? Или разные копии для класса A и класса B?

1 Ответ

2 голосов
/ 08 апреля 2019

Как JLS говорит о статических полях :

Если поле объявлено статическим, существует ровно одно воплощение поля, независимо от того, сколько экземпляров (возможно, ноль)класса в конечном итоге может быть создан.

О наследование полей :

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

Специального случая наследования статических полей не существует, поэтому они должны бытьНаследуется тоже.

Мы не можем написать хороший репрезентативный пример кода с интерфейсом, потому что его переменные неявно объявлены как static final.Итак, давайте напишем пример с суперклассом.Допустим, у нас есть:

class Base {
    static int x = 15;
}

class A extends Base {}

class B extends Base {}

Переменная x является общей частью класса Base.Если мы думаем о наследовании с точки зрения отношений IS-A, то A (или B) равно Base.Тогда x является общей частью A, B и Base.И простая демонстрация:

public class DemoApplication {

    public static void main(String[] args) {
        System.out.println(A.x++);
        System.out.println(B.x);
    }
}

Вывод:

15
16

Как видите, суперкласс разделяет статическую переменную с подклассами.А с интерфейсом на самом деле ничего не меняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...