Почему в классе работают методы, расширяющие класс Abstract, даже если они не вызваны? - PullRequest
0 голосов
/ 15 мая 2018

Рассмотрим следующее:

public class OuterClass {
    static class NestedClass extends AbstractList<List<Integer>> {
        void add(/* parameters here */) {
            // note this method is not declared public
            // print here does NOT appear in output
            // implementation details here
        }

        public int size() {
            // print here appears in output
            // implementation details here
        }

        public List<Integer> get(int index) {
            // print here appears in output
            // implementation details here            
        }
    }

     public static List<List<Integer>> method(/* parameters here */) {
         NestedClass nc = new NestedClass();
         nc.add(..);
     }
}

Затем в отдельном методе я создаю экземпляр NestedClass. Когда я запускаю код, даже не вызывая get или size, операторы вывода появляются в выходных данных. Как / почему это происходит? Я понимаю, что get и size необходимы, поскольку AbstractList расширен, но я никогда не вызываю size или get.

В общем, если B расширяет A, любой вызов метода B по своей природе вызовет переопределенные абстрактные методы, реализованные в B?

Спасибо

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Метод public boolean add(E e) в AbstractList имеет реализацию, которая вызывает add(size(), e).

А также метод public Iterator<E> iterator(), основанный на методах size(), get(int) и remove(int) списка поддержки.

Вот список методов, которые зависят от get(int):

  • indexOf
  • lastIndexOf
  • iterator
  • listIterator
0 голосов
/ 15 мая 2018

В этом весь смысл абстрактных классов / методов: ваш базовый класс определяет набор A абстрактных методов и набор B неабстрактных методов.

Теперь, скорее всего, методы из набора B будут вызывать методы из A .

Другими словами: вы используете абстрактный класс для исправить определенное поведение (записав методы из B корзины), но чтобы учесть другое общее поведение, вы позволяете пользователю реализовать A методов по-разному (путем создания разных подклассов, которые по-разному реализуют абстрактные методы).

...