关于java:从重写方法调用(非公共)方法

Calling (non public) methods from overriden method

我有一个覆盖问题(我相当新的东西),我将专门发布我的问题。

我创建了一个扩展ArrayList的类。

关于我必须做什么以及有关覆盖,我有几个问题。

首先,如果ArrayList实现并扩展了它所需要的全部内容,那么扩展ArrayList的新类也将"自动"扩展并实现必要的类和接口。 我很想假设是的,因为我知道你只能扩展一个班级。

我的第二个问题是关于覆盖。

我已经覆盖了方法get()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@SuppressWarnings("unchecked")
E elementData(int index) {
    return (E) elementData[index];
}

/**
 * Returns the element at the specified position in this list.
 *
 * @param  index index of the element to return
 * @return the element at the specified position in this list
 * @throws IndexOutOfBoundsException {@inheritDoc}
 */

public E get(int index) {
    rangeCheck(index);

    return elementData(index);
}

至:

1
2
3
4
5
@Override
public E get(int index) {
    DoSomethingWithIndex...
    return elementData(index);
}

注意:我已将上面的代码包含在源代码中。 E elementData ......

我没有覆盖这个。

我的问题是,我被告知无法找到elementData(我的重写get方法的返回)。 我还应该覆盖它吗? 是不是用ArrayList扩展。 我不明白为什么找不到它。


Firstly, if ArrayList implements and extends all it needs to, will my new class which extends ArrayList also"automatically" extend and implement the necessary classes and interaces.

是。例如,下面的类完全有效:

1
2
3
public class MyList extends ArrayList<String> {
    // Empty!
}

无需实现任何内容或提及任何接口。

My problem is that I am told that elementData (the return of my overwritten get method) cannot be found.

那就对了。 elementData是私有的,无法在子类中访问。相反,使用

1
2
3
4
5
@Override
public E get(int index) {
    DoSomethingWithIndex...
    return super.get(index);  // Delegate call to overridden method.
}

最后,扩展ArrayList很少是正确的做法。你应该几乎总是喜欢组合而不是继承。例如,见:

  • 赞成合成而不是继承
  • 喜欢构成而不是继承?


你可能想要Joshua Bloch的建议来自Effective Java,Second Edition,Item 16:Favor Composition to inheritance。

也就是说,不是直接扩展ArrayList,而是创建一个包装它的类,它也实现了List。这样,您还可以避免实现中没有记录的一些问题。

在上述书中的示例中,HashSetaddAll调用其add方法,但没有记录为这样做,因为它没有记住继承。


我完全不了解你的第二个问题,但对于第一个问题,答案是:是的。
使用ArrayList实现的所有内容都与您的子类一起实现。您只需要在代码中导入要显式使用的类,例如在覆盖某些内容时。