Являются ли объекты родительских классов неявно созданными при создании экземпляра объекта дочернего класса - PullRequest
0 голосов
/ 30 сентября 2019

Я смущен этим примером кода:

Я смущен, почему дочерний метод рисования вызывается первым. Я запутался, потому что когда создается экземпляр RoundGlyph в main, разве супер конструктор не создает экземпляр родительского объекта перед дочерним?

class Glyph {
    void draw() {
        System.out.println("test"); // method will be called once you create a Glyph object, because when we create a round glyph before creating a glyph the super constructor will be called
    }

    void print2() {
        System.out.println("printed from print 2");
    }

    int y1;

    Glyph() {
        y1 = 5;
        System.out.println("y1 = " + y1);
        System.out.println("Glyph() before draw()");
        draw();
        System.out.println("Glyph() after draw()");
        print2();
    }
}

class RoundGlyph extends Glyph {
    int radius = 1;

    RoundGlyph(int r) {
        System.out.println("radius in RoundGlyph=" + radius);
        radius = r;
        System.out.println("RoundGlyph.RoundGlyph(), radius = "+ radius);
    }

    void draw() {
        System.out.println("RoundGlyph.draw(), radius = " + radius);
    }
}

public class PolyConstructors {
    public static void main(String[] args) {
        new RoundGlyph(5);
        //new Glyph();
    }
}

Ответы [ 3 ]

0 голосов
/ 30 сентября 2019

Создается весь объект (т. Е. Дочерняя и родительская структура), затем конструкторы вызываются в порядке «родитель-потомок».

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

Обратите внимание, что очень плохая идея вызывать неконечный метод в конструкторе (это один из пунктов в Джошуа Блохе«Эффективная Java») именно по этой причине: дочерний метод, переопределяющий его, может получить доступ к дочерним полям, которые еще не были инициализированы.

например,

class Parent {
    Parent() {
        method();
    }
    void method() { System.out.println(); }
}

class Child extends Parent {
    String output = "hello";
    void method() { if (output.equals("hello")) System.out.println(output); }
}

Конструктор Parent будетВызывается до инициализации output (из-за инициализации суперкласса), поэтому переопределение method приведет к NullPointerException.

0 голосов
/ 30 сентября 2019

1 - Когда вы создаете дочерний объект класса, вызывается конструктор дочернего класса. Вызов конструктора дочернего класса Конструктор родительского класса.

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

Поскольку вы должны знать, что дочерний класс имеет все свойства родительского класса. Поэтому, когда бы вы ни создавали объект дочернего класса, все свойства родительского класса доступны в дочернем классе, кроме private.

3 - что делает вызов конструктора?

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

4 - как мы можем доказать, что ни один объект не создан из родительского класса?

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

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

0 голосов
/ 30 сентября 2019

В конструкторе RoundGlyph(int r) в качестве первой строки, перед System.out.println java неявно вызовет supper() конструктор класса ужинания Glyph(). см. Этот пост

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...