混淆调用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
类型但实际的Object
是AImpl
。
定义新接口时,您将定义新的参考数据类型。 您可以在任何可以使用任何其他数据类型名称的地方使用接口名称。 如果定义其类型为接口的引用变量,则分配给它的任何对象都必须是实现接口的类的实例。
阅读更多文档
接口引用可以在实现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(); }