class Parent
{
public static String sName = "Parent";
static
{
System.out.println("Parents static block called");
sName = "Parent";
}
}
class Child extends Parent
{
public static String sName1;
static
{
System.out.println("Childs static block called");
sName = "Child";
sName1 = "Child";
}
}
public class Inheritance
{
public static void main(String []args)
{
System.out.println(Child.sName);
System.out.println(Parent.sName);
}
}
В приведенном выше фрагменте кода у меня есть «Parent
» класс и «Child
» класс, который расширяет Parent. Я понимаю, что статические переменные распределяются между родителями и всеми его подклассами. Когда я запускаю выше программы выходСтатические переменные в Java
Parents static block called
Parent
Parent
Интересно, почему статический блок по правам ребенка не выполняется даже после выполнения «System.out.println(Child.sName);
». Я не уверен, почему загружается только родительский класс, а не класс Childs. Теперь, когда я изменяю функцию main()
, как показано ниже, загружается класс Child.
public static void main(String []args)
{
System.out.println(Child.sName);
System.out.println(Parent.sName);
System.out.println(Child.sName1); //sName is declared in Child class.
System.out.println(Parent.sName);
}
Выходные данные теперь показаны ниже и как ожидается. Теперь класс Child должен загрузиться, поскольку мы делаем ссылку на статическую переменную sName1, которая объявлена в классе Child.
Parents static block called
Parent
Parent
Childs static block called
Child
Child
Статическая переменная «sName
» теперь «Child
» в качестве значения. Мой вопрос здесь в том, почему класс Child не загружается даже после того, как он сделал ссылку в первой строке в главной функции перед ее модификацией?
Просьба сообщить.
Статические переменные не наследуются. Когда Child делает 'sName = ..', вы фактически устанавливаете статическую переменную' sName', определенную в Parent (она эквивалентна 'Child.sName = ..', что эквивалентно' Parent.sName = ..'). Таким образом, это не имеет никакого отношения к наследованию, а скорее порядок (и причина) выполнения статического блока. – user2864740
Только что изменил заголовок сообщения. Да, я понимаю, что статические переменные не наследуются. Но когда вы говорите, что имя Child.sName не должно быть вызвано статическим блоком Childs? – Rahul
@Rahul Просто проверьте скомпилированный байт-код с помощью команды 'javap', и вы узнаете, что происходит. –