25

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

public interface A {
  public void a();
}

它包括称为的方法void a();

我有一个实现这个接口的类,并且只有一个方法:

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

Q:如果在主类中调用接口方法,会不会调用属于实现该接口的类的实现?

例如:

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

这会打印“做某事”吗?

4

5 回答 5

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

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

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

阅读有关文档的更多信息

一个接口引用可以持有 AImpl 的对象,因为它实现了 A 接口。

于 2013-04-23T16:16:10.997 回答
26

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

这是你的界面:

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
}
于 2013-04-23T16:19:52.600 回答
2

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

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

这相当于以下

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

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

于 2013-04-23T16:14:02.983 回答
2

您可能可以通过自己运行代码来发现这一点。

目前你会得到一个NullPointerException,因为你没有为变量分配任何东西aa。将您的代码更改为以下内容将调用该方法并输出文本:

public static void main(String[] args){
    A aa = new AImpl();
    aa.a();
}
于 2013-04-23T16:16:22.210 回答
1

不我不会。

您已经声明了一个变量。在这种情况下,您应该首先使用您的类的对象实例对其进行初始化AImpl

public static void main(String[] args){
  A aa = new AImp();
  aa.a();
}
于 2013-04-23T16:16:43.627 回答