假设我有一个接口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();
}
这会打印“做某事”吗?
A aa = new AImpl();
aa.a();
这里你的引用变量是接口
A
类型,但实际的Object
是AImpl
。
当你定义一个新的接口时,你也就定义了一个新的参考数据 类型。您可以在可以使用任何其他数据的任何地方使用接口名称 键入名称。如果您定义了一个类型为的引用变量 接口,分配给它的任何对象都必须是类的实例 实现该接口。
阅读更多文档
接口引用可以保存 AImpl 的对象,因为它实现了 A 接口。
这取决于对象的运行时类型。参见:
这是您的界面:
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
}
您可能可以通过自己运行代码来发现这一点。
当前您将得到一个
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();
}
public interface A {
public void a(int x, int y );
}
public class AImpl implements A {
public void a(int z) {
println(z);
}
}
会起作用吗?更改了参数名称并传递了更少的参数。