在开始之前,我有一些小代码可以更好地理解问题。
public interface Shape {
public void draw();
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Drwaing circle");
}
public void kill() {
System.out.println("Class specific Method");
}
public static void main(String[] args) {
Circle C = new Circle();
C.draw(); //Compiled
C.kill(); //Compiled
Shape S = new Circle();
S.draw(); //Compiled
S.kill(); //Not able to Compile
}
}
如您所见,如果我使用Interface类型对象来调用类(Circle)方法(kill),我不被允许。这是有道理的,因为kill方法既未在接口中定义也未实现。
我的问题是,如果这是一个案例,当我们以下面提到的方式使用List时,为什么它总是说List使用ArrayList方法......?从技术上讲,它不应该根据我上面的例子。
List myList = new ArrayList();
如果没有,那么List使用哪种方法..?因为List定义的方法需要在实现List的类中的某个地方实现。没有..?
检查以下链接中的答案中的第一条评论,它也说同样的事情。 What is the difference between List and ArrayList?
是否有人能想出更清晰的图片,它的工作原理如何?列表使用哪种方法在上面的类型片段..?
答案 0 :(得分:2)
在基类/接口引用对象(接口列表)中存储派生类的对象(在本例中为ArrayList)时,只能访问基类/接口中定义的方法。
必须在界面示例中覆盖这些方法。
所以当你写
List x = new ArrayList();
您可以访问在ArrayList类中重写的List接口的方法,但不能访问所有ArrayList方法。