Инициализация в конструкторе и наследование

Рейтинг: 2Ответов: 1Опубликовано: 03.09.2014

Дан следующий код:

public class InheritanceInitOrder {
static class A {
    String a;
    A() {
        a = "a";
        System.out.println("a initialized");
        System.out.println("b=" + ((B)this).b);
    }
}

static class B extends A {
    String b;
    B() {
        b = "b";
        System.out.println("b initialized");
        System.out.println("b=" + b);
    }
}

public static void main(String[] args) throws ClassNotFoundException {
    new B();
}    
}

Не могу понять, как работает строчка:

System.out.println("b=" + ((B)this).b);

Помогите, пожалуйста, разобраться.

Ответы

▲ 1Принят

А с чем тут сложность? Ссылку на текущий объект this в явном виде приводим к классу B и обращаемся к его полю b.

Но поскольку это конструктор класса A, поле b еще не проинициализировано (конструктор B еще не отработал), и мы получим в консоли "b=null".

За пределами учебного коде так делать, разумеется, не стоит:

  • Во-первых, это нарушает основные принципы ООП: родительский класс знает подробности реализации своих наследников.

  • Во-вторых, в таком виде при попытке создать экземпляр new A() программа свалится на исключении.