Вместо этого он вызывает для класса Array add () его вызов для класса ArrayCount add ()

Я хотел бы знать причину проблемы хрупкого базового класса в java.

Вот код, и я не могу найти причину запуска метода дочернего класса, даже если я дал инструкцию для запуска метода в родительском классе

в публичном классе Array

public class Array {
    private ArrayList<Object> a = new ArrayList<Object>();

    public void add(Object element)
    {
        a.add(element);
    }

    public void addAll(Object elements[])
    {
        for (int i = 0; i < elements.length; ++i)
            add(elements[i]);
    }
}

в классе ArrayCount ... этот класс отвечает за хранение счетчика списка

public class ArrayCount extends Array {
    public int count = 0;

    @Override
    public void add(Object element)
    {
        super.add(element);
        ++count;
    }

    @Override
    public void addAll(Object elements[])
    {
        super.addAll(elements);
        count += elements.length;
    }
}

основной класс следующим образом

public class Main {

    public static void main(String[] args) {

        ArrayCount ac = new ArrayCount();
        Object [] objArray = new Object[7];
        objArray[0] = "xxx";
        objArray[1] = "xxx";
        objArray[2] = "xxx";
        objArray[3] = "xxx";
        objArray[4] = "xxx";
        objArray[5] = "xxx";
        objArray[6] = "xxx";

        ac.addAll(objArray);
        System.out.println("count is : " + ac.count);
        //COUNT IS 14 NOT 7
    }
}

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

Stultuske 25.09.2018 09:08

хорошо .. но в методе AddAll ArrayCount я вызвал super.addAll(), а в методе addAll класса Array он вызвал метод add(). проблема в том, что вместо этого он вызывает для класса Array add() его вызов для метода add() класса ArrayCount из метода addAll() класса Array

NuOne 25.09.2018 09:11

"проблема в том, что вместо этого он вызывает для класса Array add () его вызов для класса ArrayCount add ()" => Это основная концепция ООП! Полиморфизм! Вызов методов - динамически связанный. И - собственно, по этой причине базовый класс называется хрупкий.

Seelenvirtuose 25.09.2018 09:14

здесь все работает как положено.

luk2302 25.09.2018 09:17

@NuOneTAttygalle, что не означает, что остальная часть этого метода не работает

Stultuske 25.09.2018 09:17

Практическое правило здесь: Не вызывайте переопределяемые методы внутри вашего базового класса.

Seelenvirtuose 25.09.2018 09:20

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

arjunan 25.09.2018 09:49

проблема в том, что он не попадает в базовый класс. а на выходе значение счетной переменной будет 14, а не 7

NuOne 25.09.2018 10:09

Работает нормально, здесь нет проблем.

Antoniossss 25.09.2018 10:23

Счетчик равен 14, потому что выполняются как ++count; из ArrayCount.add(), так и count += elements.length; из ArrayCount.addAll(). Процесс выглядит следующим образом: ArrayCount.addAll() -> Array.addAll() -> ArrayCount.add() -> Array.add(), где части, которые должны вас удивить, это то, что add() в Array.addAll() фактически является тем же из ArrayCount.add().

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

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