调用Java接口方法时混淆

wfypjpf4  于 2023-03-11  发布在  Java
关注(0)|答案(5)|浏览(163)

假设我有一个接口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();
}

这上面会写着“做点什么”吗

gc0ot86w

gc0ot86w1#

A aa = new AImpl();
aa.a();
  • 这里您的引用变量是接口A类型,但实际的ObjectAImpl*。

定义新接口时,即定义了新的引用数据类型。可以在任何可以使用任何其他数据类型名称的位置使用接口名称。如果定义了类型为接口的引用变量,则分配给它的任何对象都必须是实现该接口的类的示例。
阅读有关Documentation的更多信息
接口引用可以在实现A接口时保存AImpl的对象。

brjng4g3

brjng4g32#

它取决于对象的运行时类型。请参阅:
这是您的界面:

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");
    }
}

那么看看这个main方法:

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
}
qvsjd97n

qvsjd97n3#

您可能可以通过自己运行代码来发现这一点。
现在你会得到一个NullPointerException,因为你还没有给变量aa赋值。把你的代码修改成下面的代码会调用这个方法并输出文本:

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

7eumitmz4#

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

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

这里等价于

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

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

j91ykkif

j91ykkif5#

不,我不会。
你已经声明了一个变量。你应该先用一个对象的示例初始化它,在这个例子中是你的类AImpl

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

相关问题