我已经搜索了很多但没有得到这个问题的确切答案希望我能从这里得到它。将类的对象引用到接口而不是引用同一个类到底有什么用?
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);
}
可能是因为接口类似于合约,可以通过实现来完成。你不应该依赖一个实现,因为它会不断变化,而不是接口/合同不应该。引用接口会使您的实现更加健壮。
有时,实例的实际类并不重要,而只重要它实现的接口。
有时,在编译时不可能知道实例的实际类,但我们只知道该类将实现的接口。
例如,您有一个名为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
实现的,是正方形,圆形还是其他。只是这个类可以返回一个名称和一个周长,以便它可以打印它们。所以,实际的实现可以是Square
, Circle
,Triangle
等等。唯一重要的是这些未来的类实现了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;
}
}