Наследование в Java - создание объекта подкласса также вызывает конструктор суперкласса. Почему именно? - PullRequest
23 голосов
/ 28 января 2009

У меня есть вопрос о наследовании в Java.

У меня есть два класса A и B, и класс B, наследует от A:

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


public class B extends A {
     public B() {
         System.out.println("Bye!");
     }

     public static void main(String[] args) {
         B b = new B();
     }
}

Когда я запускаю программу B, вывод:

Hi!
Bye!

Вопрос : почему конструктор из class A вызывается, когда я создаю объект class B?

Я знаю, что B наследует все от A - все переменные экземпляра или класса и все методы, и в этом смысле объект B имеет все характеристики A плюс некоторые другие характеристики, определенные в B. Однако я не знал и не думал, что когда я создаю объект типа B, конструктор A также вызывается. Итак, написание этого:

B b = new B();

создает Два объекта - один типа B и один типа A .

Становится интересно,

Может кто-нибудь объяснить, почему именно это происходит?

Ответы [ 15 ]

1 голос
/ 28 января 2009

Если A инициализирует членов в своем конструкторе, и вы забыли вызвать super в своем производном классе, тогда члены A могут быть в плохом состоянии. Java пытается помешать вам выстрелить себе в ногу.

0 голосов
/ 05 августа 2018

У каждого суперкласса есть конструктор, и каждый конструктор в иерархии запускается в момент создания объекта подкласса.

0 голосов
/ 28 июня 2015

если объект суперкласса не создан, то как подкласс обращается к нестатическим методам и переменным суперкласса.

Я изучал, что нестатические методы и переменные могут быть доступны только через объекты ..

0 голосов
/ 27 июня 2015

В java при создании объекта дочернего класса конструктор родительского класса всегда вызывается, потому что класс Object является родителем каждого суперкласса, а когда вы вызываете конструктор класса Object, создается только ваш объект, а java не создает поддерживает множественное наследование в случае класса, поэтому, если вы расширяете любой другой класс, то связь между вашим дочерним классом и классом Object осуществляется через класс Parent, поэтому для вызова конструктора класса Object необходимо вызвать конструктор класса Parent.

0 голосов
/ 04 ноября 2014

Когда создается объект подкласса, то внутри он не создается для объекта суперкласса. Но память должна быть выделена для членов суперкласса.

...