我已经搜索了很多但没有得到这个问题的确切答案希望我能从这里得到它。 什么是将类的引用对象引用到接口而不是引用同一个类?
void foo(list l){}
public static void main(String a[]){
List l = new ArrayList(); // why use this?
ArrayList a = new ArrayList(); //instead of this?
foo(l);
foo(a);
}
答案 0 :(得分:1)
可能是因为界面类似于契约,可以通过实现来填充。你不应该依赖于一个实现,因为它不断变化,而不是接口/契约。参考界面可以使您的实现更加健壮。
答案 1 :(得分:1)
有时,实例的实际类并不重要,只有它实现的接口。
有时,在编译时不可能知道实例的实际类,但我们只知道该类将实现的接口。
例如,您有一个名为GeometricFigure
public static interface GeometricFigure {
public Double getGirth();
public String getName();
}
您在真实课程中使用此界面,例如Canvas
。 Canvas
列有GeometricFigure
s。
public class Canvas {
private List<GeometricFigure> figures;
public void printAllFigures() {
for (GeometricFigure figure : figures) {
System.out.println(figure.getName() + " " + figure.getGirth());
}
}
}
现在,您的Canvas
独立 GeometricFigure
的实际实施。 Canvas
并不关心你GeometricFigure
的实施方式,是方形,圆形还是其他什么。只有这个类可以返回名称和 girth ,以便它可以打印它们。因此,实际的实现可以是Square
,Circle
,Triangle
等。唯一重要的是这些 future 类实现了GemometricFigure
接口
例如:
public class Square implements GeometricFigure {
private String name;
private Double sideLength;
public Square(String name, Double sideLength) {
this.name = name;
this.sideLength = sideLength;
}
@Override
public Double getGirth() {
return 4 * sideLength;
}
@Override
public String getName() {
return name;
}
}