关于调用Java接口方法的困惑

Jay*_*ang 22 java interface

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

public interface A {
  public void a();
}
Run Code Online (Sandbox Code Playgroud)

它包括调用的方法 void a();

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

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

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

例如:

public static void main(String[] args){
  A aa;
  aa.a();
}
Run Code Online (Sandbox Code Playgroud)

这会打印"做点什么"吗?

Sub*_*der 30

A aa = new AImpl();
aa.a();
Run Code Online (Sandbox Code Playgroud)

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

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

阅读更多文档

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


jlo*_*rdo 24

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

这是你的界面:

public interface A {
  public void a();
}
Run Code Online (Sandbox Code Playgroud)

这是你的班级:

public class AImpl implements A {
    public void a() {
       println("I am AImpl");
    }
}
Run Code Online (Sandbox Code Playgroud)

还有另一种实现:

public class AnotherAImpl implements A {
    public void a() {
       println("I am another AImpl");
    }
}
Run Code Online (Sandbox Code Playgroud)

那么看看这个主要方法:

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
}
Run Code Online (Sandbox Code Playgroud)

  • 示例不是另一种教学方式,它是唯一的教学方式(阿尔伯特爱因斯坦).谢谢. (4认同)

Joh*_*erg 2

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

A aa = new AImpl();
aa.a();
Run Code Online (Sandbox Code Playgroud)

这里相当于以下

AImpl aa = new AImpl();
aa.a();
Run Code Online (Sandbox Code Playgroud)

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