为什么类中的方法扩展Abstract类甚至在未调用时也会运行?

时间:2018-05-15 04:15:23

标签: java inheritance abstract-class extends

请考虑以下事项:

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的实例。当我运行代码时,没有调用getsize,打印语句出现在输出中。这是怎么发生的?我了解getsize是必要的,因为AbstractList已延长,但我从不调用sizeget

通常,如果B扩展A,那么对B方法的任何调用都会固有地调用B中实现的重写抽象方法吗?

由于

2 个答案:

答案 0 :(得分:2)

这是抽象类/方法的重点:您的基类定义了抽象方法的集合 A ,以及非抽象方法的集合 B 。 / p>

现在,很可能, B 集合之外的方法将从 A 调用方法。

换句话说:您使用抽象类来修复某些行为(通过从 B 存储桶中编写方法),但是为了允许不同的整体行为,允许用户以不同的方式实现 A 方法(通过创建不同的子类,以不同的方式实现抽象方法)。

答案 1 :(得分:2)

AbstractList中的方法public boolean add(E e)具有实现功能 致电add(size(), e)

方法public Iterator<E> iterator()依赖于支持列表的size()get(int)remove(int)方法。

以下是依赖get(int)的方法列表:

  • 的indexOf
  • lastIndexOf
  • 迭代
  • 的ListIterator