Как выполняется конструктор? - PullRequest
6 голосов
/ 01 июня 2010

Я делаю некоторые изменения из слайдов лекции, и там говорится, что конструктор выполняется следующим образом:

  1. Если конструктор начинается с этого, рекурсивно выполнить указанный конструктор, а затем перейти к шагу 4.

  2. Вызовите явно или неявно указанный конструктор суперкласса (если этот класс не java.lang.Object).

  3. Инициализируйте поля объекта в том порядке, в котором они были объявлены в этом классе.

  4. Выполнить оставшуюся часть этого конструктора.

Что я не понимаю, так это то, что конструктор никогда не может «начать» с этого, потому что даже если он не образует иерархию / отношения классов, тогда super () вставляется по умолчанию.

Как бы это соответствовало описанию выше?

Ответы [ 4 ]

8 голосов
/ 01 июня 2010

Конструктор (для каждого класса, кроме java.lang.Object) должен начинаться либо с "super ()", чтобы вызвать конструктор своего суперкласса, либо с "this ()", чтобы вызвать другой конструктор того же класса. Если вы не включите ни одного из них в свой конструктор, компилятор вставит вызов super (). Для конструктора нормально начинать с вызова другого конструктора в том же классе, если в конечном итоге вызывается конструктор в классе, который вызывает конструктор суперкласса.

2 голосов
/ 01 июня 2010

здесь более или менее практичный пример использования this(...)

public class Car {

    private final int numberOfDoors;

    public Car(int doors) {
        numberOfDoors = doors;
    }

    public Car() {
        this(4);    // default is 4 doors, calls the constructor above
    }
}
2 голосов
/ 01 июня 2010

Не думаю, что вы правы или я не понимаю проблемы. Из Спецификации языка Java :

Если тело конструктора не начинается с явного конструктора вызов и конструктор объявлено не является частью изначального Класс Object, затем конструктор тело неявно предполагается Компилятор начать с суперкласса вызов конструктора "super ();", вызов конструктора его прямой суперкласс, который не занимает аргументы.

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

Я бы сказал, что после создания объекта вызывается super (...) (если класс не является java.lang.Object).

0 голосов
/ 13 июля 2015

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

  1. Выполнение будет выполняться на основе этого ключевого слова или супер-ключевого слова, тогда

  2. он выполнит все IIB (как подход сверху вниз), затем

  3. он выполнит все отчеты, хранящиеся у программиста (например, sop, initilization)

Class A{
    A() {
        this(10);    //or super,....... execution statement 1
        // executing IIB's, execution statement 2
        System.out.println("from A()");   // execution statement 3
    }

    A(int i) {
        System.out.println("from A(int)");
    }        
    {
        System.out.println("from IIB-1");
    }

    public static void main(String[] args){
        A a = new A(); //calling constructor A()
        System.out.println("from main");
    }
    {
        System.out.println("from IIB-2");
    }
}

Выход:

from IIB-1
from IIB-2
from A(int)
from A()
from main
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...