Вызов конструктора суперкласса из класса внуков вызывает родительский или родительский конструктор?

При использовании конструктора суперкласса из дочернего класса второго уровня он передает аргумент конструктору прародителя или непосредственному родительскому конструктору?

//top class
public First(type first){
  varFirst = first;
}

//child of First
public Second(type second){
  super(second); //calls First(second)
}

//child of Second
public Third(type third){
  super(third); //calls First(third) or Second(third)?
}

person Seph Cordovano    schedule 19.03.2016    source источник
comment
предполагая, что тип (тип класса в соответствии с соглашениями об именах) одинаков для всех 3 классов, а varFirst также является экземпляром типа, тогда Да, пример примера, который вы можете попробовать: замените тип на int и в каждом конструкторе System.out.println(intValue); -› конструктор Third передаст значение, скажем, 2 в Second и First, НО печать sysout будет иметь порядок First-Second-Third (короче говоря, Third будет вызывать только Second, НО Second будет вызывать First и поток продолжается)   -  person Srinath Ganesh    schedule 19.03.2016


Ответы (2)


super вызывает конструктор непосредственного родителя. Таким образом, вызов super в Third вызовет конструктор Second, который, в свою очередь, вызовет конструктор First. В этом легко убедиться, если вы добавите оператор печати в конструкторы:

public class First {
    public First(String first) {
        System.out.println("in first");
    }
}

public class Second extends First {
    public Second(String second) {
        super(second);
        System.out.println("in second");
    }
}

public class Third extends Second {
    public Third(String third) {
        super(third);
        System.out.println("in third");
    }

    public static void main(String[] args) {
        new Third("yay!");
    }
}

Результат, который вы получите:

in first
in second
in third
person Mureinik    schedule 19.03.2016

super в Child пытается получить информацию от Parent, а super в Parent пытается получить информацию от GrandParent.

    public class Grandpapa {

    public void display() {
        System.out.println(" Grandpapa");
    }

    static class Parent extends Grandpapa{
        public void display() {
            super.display();
            System.out.println("parent");
        }
    }

    static class Child extends Parent{
        public void display() {
        //  super.super.display();// this will create error in Java
            super.display();
            System.out.println("child");
        }
    }

    public static void main(String[] args) {
            Child cc = new Child();
            cc.display();
 /*
            * the output :
                 Grandpapa
                 parent
                 child
            */
    }
}
person Soudipta Dutta    schedule 11.03.2018