О методе в java переписанном

Это суперкласс: Glyph

public class Glyph {
    void draw() {
        System.out.println("Glyph.draw(");
    }
    Glyph() {
        System.out.println("Glyph() before draw()");
        draw();
        System.out.println("Glyph() after draw()");
    }
}

Это подкласс RoundGlyph

class RoundGlyph extends Glyph {
    int radius = 1;
    RoundGlyph(int r) {
        super();
        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);
    }
}

Выход:

Glyph() before draw()
 RoundGlyph.draw(), radius = 0
 Glyph() after draw()
 RoundGlyph.RoundGlyph(), radius = 5

Почему программа выполняет метод draw() в классе RoundGlyph, когда выполняет super()?

и распечатать

RoundGlyph.draw(), radius = 0

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

Mark Rotteveel 21.04.2018 13:15
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это полиморфизм! когда вы вызываете метод из родителя, метод в дочернем будет вызываться, если существует переопределение. если вы хотите вызвать метод parent, вы должны сделать следующее:

class RoundGlyph extends Glyph {
   int radius = 1;
   RoundGlyph(int r) {
    super();
    radius = r;
    System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius);
  }
@Override
void draw() {
   super.draw();//go draw in parent first
   System.out.println("RoundGlyph.draw(), radius = " + radius);
 }
}

или вы должны явно вызвать метод в родительском элементе следующим образом:

public class Glyph {
 void draw() {
  System.out.println("Glyph.draw(");
 }
 Glyph() {
  System.out.println("Glyph() before draw()");
  Glyph.draw();//explicit calling
  System.out.println("Glyph() after draw()");
 }
}

Другие вопросы по теме