Вызов конструктора - PullRequest
       3

Вызов конструктора

5 голосов
/ 20 сентября 2011

У меня есть три класса:

public class A {
    public A(){
        System.out.println("in A");
    }
}


public class B extends A{

    public B(){
        System.out.println("in b");
    }
} 


public class C extends B{

    public C(){
        System.out.println("in C");
    }   
}

Теперь я действительно не уверен, как работают вызовы конструктора. Если я создаю экземпляр C c= new C();, в каком порядке (и почему этот порядок) вызывается конструктор. Если я создаю экземпляр класса C, то не должен ли он просто проверить, есть ли у класса C какой-либо конструктор или нет, и если он есть, он будет его использовать?

Почему он выводит-> In A In B In C?

Разве он не поднимается в иерархии только тогда, когда не находит конструктор в своем собственном классе? Или конструкторы суперкласса вызываются неявно каждый раз?

Ответы [ 8 ]

3 голосов
/ 20 сентября 2011

Конструктор Super вызывается по умолчанию из конструктора базового класса.

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

Так что ответ да, они все называются.Порядок от самого верхнего класса в иерархии до базового класса, так: A, B, C.

2 голосов
/ 20 сентября 2011

Конструкторы по умолчанию всегда вызываются и вызываются сверху вниз - от самого верхнего суперкласса до самого низкого базового класса.

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

1 голос
/ 20 сентября 2011

Когда вызывается конструктор, он сначала вызывает super(), поэтому, хотя трассировка стека покажет: C-> B-> A, на самом деле A будет вызван первым, а C будет вызван последним, таким образом, печать покажет :

in A
in B
in C
0 голосов
/ 20 ноября 2014

Класс A является суперклассом для B, а класс B является суперклассом C. Это означает, что A находится на верхнем месте среди них, где B находится сверху для C, рядом с A, а C находится снизу от B.Поэтому сначала выполняется класс A, а затем B, а затем C. Это похоже на некоторый приоритет в Java для суперклассов.

0 голосов
/ 20 сентября 2011

Посмотрите на спецификацию языка Java

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

http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#41652

0 голосов
/ 20 сентября 2011

Да, если вы не определите какой-либо конструктор, он неявно создаст конструкцию по умолчанию и вызовет ее.Теперь, когда вы расширяете какой-либо класс, то, подобно классу C, он идет со своим конструктором, но там он не нашел явного вызова суперкласса, поэтому компилятор неявно вызывает конструктор суперкласса.вот почему, когда мы вызываем конструктор суперкласса, этот оператор всегда сначала выглядит следующим образом

public C(){
   super();
}

, если вы пишете какое-либо утверждение перед вызовом конструктора суперкласса, вы получаете ошибку

0 голосов
/ 20 сентября 2011

Супер-конструктор вызывается по умолчанию.Он выполняется перед любыми строками кода в конструкторе производного класса.Поэтому, если вы вызываете new C (), конструктор A запускается, затем B, а затем все что угодно в C.

0 голосов
/ 20 сентября 2011

super() неявно, как конструкторы по умолчанию, если конструкторы не объявлены.

Конструкторы работают вверх:

C calls B, B calls A, A calls to Object that does nothing and return to A, then outputs and return the flow to B, that outputs and return to C that outputs.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...