调用 Java 接口方法的混淆

2022-09-01 18:16:09

假设我有一个接口 A,定义如下:

public interface A {
  public void a();
}

它包括名为void a();

我有一个实现此接口的类,只有一个方法:

    public class AImpl implements A {
       @Override
       public void a() {
           System.out.println("Do something");
       }
    }

问:如果在主类中,我调用接口方法,它会调用属于实现接口的类的实现吗?

例如:

public static void main(String[] args){
  A aa;
  aa.a();
}

这会打印“做点什么”吗?


答案 1
A aa = new AImpl();
aa.a();

在这里,您的引用变量是接口 A 类型,但实际对象AImpl

定义新接口时,将定义新的引用数据类型。可以在任何可以使用任何其他数据类型名称的位置使用接口名称。如果定义一个引用变量,其类型为接口,则分配给它的任何对象都必须是实现该接口的类的实例。

阅读有关文档的更多信息

接口引用可以在实现 A 接口时保存 AImpl 的对象。


答案 2

这取决于对象的运行时类型。看:

这是您的界面:

public interface A {
  public void a();
}

这是你的类:

public class AImpl implements A {
    public void a() {
       println("I am AImpl");
    }
}

还有另一种实现:

public class AnotherAImpl implements A {
    public void a() {
       println("I am another AImpl");
    }
}

所以看看这个主要方法:

public static void main(String[] args){
  A aa;
  aa = new AImpl();
  aa.a(); // prints I am AImpl
  aa = new AnotherAImpl();
  aa.a(); // now it prints I am another AImpl
}