привет, используя супер в расширении - PullRequest
0 голосов
/ 01 апреля 2012

мой код такой

public class B {
    public B(int f) {

    }

}


public class A extends B{

    int f=4;
    public A() {
        super(f);
    }

}

почему он делает ошибку компиляции?

1 Ответ

0 голосов
/ 01 апреля 2012

Чтобы создать экземпляр класса A, Java будет вести себя так, как если бы она first создала экземпляр B, то есть будет вызван конструктор суперкласса super (), (или в этом случае вы называете это сами) и , а затем «добавляете» атрибуты класса А. Именно поэтому вызов super () всегда должен быть первой инструкцией в конструкторе.

Вы пытаетесь передать аргумент, который в некотором смысле еще не существует, потому что вы пытаетесь прочитать f до того, как вы вызвали super ().

Что вы могли быdo следующее:

public class A extends B {
    static final int F_CONST = 4;
    int f = F_CONST;

    public A() {
        super(F_CONST);
    }
}

Здесь F_CONST - это постоянная «статическая» переменная, которая является «переменной класса», а не «переменной объекта или экземпляра».Статические члены будут инициализированы, когда класс будет загружен в память, что происходит перед вызовом любого конструктора.Компилятору даже разрешено заменить F_CONST только значением 4 напрямую, что также будет простым решением.

...