interface Z{ int x = 10;}
Class A implements Z{}
Class B implements Z{}
Как java использует x в этом случае?
Создает ли java единственную копию x, потому что x является статическим конечным? Или разные экземпляры для класса А и класса В?
Возможно связано: Какие правила диктуют наследование статических переменных в Java?
Как говорит 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). Только очень незначительное замечание.
@ Zabuza Я немного отстал от жизни ) Спасибо, обновил.
Было бы легко проверить! Попытайся.