混淆调用Java接口方法

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

public interface A { public a(); } 

它包括一个叫做a的方法。

我有一个类实现这个接口,让我们说:

  public class AImpl implements A{ public void a() { println("Do something"); } } 

这个类只实现这个方法。

这是我的问题:所以如果在主类中,我调用接口方法,它会调用实现接口的类中的方法吗? 例如:

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

它会调用AImpl类中的方法并输出“Do something”吗?

 A aa = new AImpl(); aa.a(); 

这里你的引用变量是接口A类型但实际的ObjectAImpl

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

阅读更多文档

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

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

这是你的界面:

 public interface A { public void a(); } 

这是你的class级:

 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 } 

您可以通过自己运行代码来找到它。

目前,您将获得NullPointerException因为您尚未为变量aa分配任何内容。 将代码更改为以下内容将调用该方法并输出文本:

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

您需要在实际的AImpl对象上调用例程

 A aa = new AImpl(); aa.a(); 

这相当于以下内容

 AImpl aa = new AImpl(); aa.a(); 

您尝试在未初始化的对象上调用方法时,您的示例将引发错误。

不我不会。

您已声明了一个变量。 您应首先使用对象实例初始化它,在本例中为AImpl类。

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