Как поля добавляются из интерфейса в класс в Java?

interface Z{ int x = 10;}

Class A implements Z{}

Class B implements Z{}

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

Создает ли java единственную копию x, потому что x является статическим конечным? Или разные экземпляры для класса А и класса В?

Было бы легко проверить! Попытайся.

olivergregorius 08.04.2019 06:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

If a field is declared static, there exists exactly one incarnation of the field, no matter how many instances (possibly zero) of the class may eventually be created.

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

A class inherits from its direct superclass and direct superinterfaces all the non-private fields of the superclass and superinterfaces that are both accessible to code in the class and not hidden by a declaration in the class.

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

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

class Base {
    static int x = 15;
}

class A extends Base {}

class B extends Base {}

Переменная x является общей частью класса Base. Если мы подумаем о наследовании с точки зрения отношений ЯВЛЯЕТСЯ-А, то 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

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

Возможно, вы захотите обновить свои ссылки JLS до текущей версии (12). Только очень незначительное замечание.

Zabuzard 08.04.2019 08:49

@ Zabuza Я немного отстал от жизни ) Спасибо, обновил.

ilinykhma 08.04.2019 09:04

Другие вопросы по теме