В Java, как мы можем узнать, когда super () завершена в конструкторе? - PullRequest
2 голосов
/ 24 октября 2011

AFAIK: При создании подкласса все конструкторы неявно или явно вызывают super ().

Пример:

class subclass extends superclass {
    public subclass() {
        super();  // unnecessary, but explicit
    }

Как узнать, когда завершился super ()?Я создаю подкласс JTable, который должен автоматически подгонять столбцы, но может сделать это безопасно только после завершения super ().

- Правка -

Чтобы уточнить на основе комментариевниже представьте, что super () также вызовет некоторые методы класса.Я могу переопределить некоторые из этих методов в моем подклассе.Я хочу изменить поведение в этих методах во время создания базового класса.Возможно, некоторые требуемые члены еще не будут (полностью) инициализированы ...

Ответы [ 7 ]

3 голосов
/ 24 октября 2011

super() завершается, когда возвращается вызов super() (то же самое относится и к любому другому вызову метода).

Если вы вызываете его явно в соответствии с вашим примером, то super() завершил выполнение, когда была достигнута строка сразу после вызова super(). Если вы позволяете ему вызываться неявно, то super() завершится к тому времени, когда выполнение достигнет первой строки в вашем конструкторе.

Конечно, это может быть тот случай, когда super() порождает один или несколько фоновых потоков, которые выполняют различные задачи и которые все еще выполняются в тот момент, когда возвращается вызов super(). Но это действительно не имеет ничего общего с звонком на super(). В таком случае время, когда другие задачи завершаются, не имеет ничего общего со временем, когда завершается вызов super().

2 голосов
/ 24 октября 2011

... представьте, что super () также вызовет некоторые методы класса. Я могу переопределить некоторые из этих методов в моем подклассе

Простой ответ - не делай этого. Это безумие.

2 голосов
/ 24 октября 2011

Как насчет вызова вашего кода после того, как super() завершится следующим образом:

class subclass extends superclass {
    public subclass() {
        super();  // unnecessary, but explicit
        callYourFunctionHereKnowingThatSuperHasFinished();
    }
}
1 голос
/ 24 октября 2011

super() должно быть первым оператором .

Следовательно, подразумеваемый super () включается в каждый конструктор, который не включает ни функцию this (), ни явную функцию super () назвать его первым утверждением. Оператор super () вызывает конструктор суперкласса. Неявный super () можно заменить явным супер (). Супер утверждение должно быть первым утверждение конструктора.

И поскольку JVM будет ожидать завершения первого оператора, ваш второй оператор безопасен для манипулирования объектом или вызова super.methods(), как ему будет угодно.

1 голос
/ 24 октября 2011

Супер завершен, если был создан экземпляр подкласса. Если super () не завершится, он никогда не вернется без исключения, чтобы завершить конструктор подкласса, то есть вы никогда бы не создали экземпляр подкласса, если бы супер вызов не завершился.

0 голосов
/ 24 октября 2011

То, о чем вы говорите, называется Цепочка конструктора.

Каждый метод конструктора будет вызывать цепочку, пока класс в верхней части не будет достигнут и инициализирован.Затем каждый последующий класс, указанный ниже, инициализируется, когда цепочка возвращается к исходному подклассу.Этот процесс называется построением цепочек.

Так что да, вы можете безопасно добавить свой метод после вызова super () в конструкторе исходного подкласса.

0 голосов
/ 24 октября 2011

Если вы хотите сделать авторазмер столбцов, вы должны смотреть после dataModel. , Данные там.

...