调用Java接口方法的混乱

问题描述 投票:0回答:6

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

public interface A {
    public void a();
}

它包括一个名为 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();
}

这会打印“做某事”吗?

java interface
6个回答
32
投票
A aa = new AImpl();
aa.a();

这里你的引用变量是接口

A
类型,但实际的
Object
AImpl

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

阅读更多文档

接口引用可以保存 AImpl 的对象,因为它实现了 A 接口。


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
}

2
投票

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

当前您将得到一个

NullPointerException
,因为您还没有为变量
aa
分配任何内容。将代码更改为以下内容将调用该方法并输出文本:

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

2
投票

您需要在实际的

AImpl
对象上调用例程

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

这里相当于以下

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

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


1
投票

不。我不会。

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

AImpl

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

0
投票
public interface A {
    public void a(int x, int y );
}


public class AImpl implements A {
    public void a(int z) {
       println(z);
    }
}

会起作用吗?更改了参数名称并传递了更少的参数。

© www.soinside.com 2019 - 2024. All rights reserved.