假设我有一个接口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类型但实际Object是AImpl.
定义新接口时,您将定义新的参考数据类型.您可以在任何可以使用任何其他数据类型名称的地方使用接口名称.如果定义其类型为接口的引用变量,则分配给它的任何对象都必须是实现该接口的类的实例.
阅读更多文档
接口引用可以在实现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)
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)
由于您尝试在未初始化的对象上调用方法,因此您的示例将引发错误。