调用Java接口方法时的混淆
假设我有一个接口A,定义如下:调用Java接口方法时的混淆,java,interface,Java,Interface,假设我有一个接口A,定义如下: public interface A { public void a(); } 它包括名为void a()的方法 我有一个实现此接口的类,它只有一个方法: public class AImpl implements A { @Override public void a() { System.out.println("Do something"); } } 问:如果在主类中,我
public interface A {
public void a();
}
它包括名为void 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();
}
此打印是否会“做点什么”您需要在实际的AImpl
对象上调用例程
A aa = new AImpl();
aa.a();
这相当于下面的
AImpl aa = new AImpl();
aa.a();
您的示例将引发一个错误,因为您试图在一个非斜体对象上调用一个方法 您需要调用实际AImpl
对象上的例程
A aa = new AImpl();
aa.a();
A aa = new AImpl();
aa.a();
这相当于下面的
AImpl aa = new AImpl();
aa.a();
您的示例将引发一个错误,因为您试图在一个非斜体对象上调用一个方法
A aa = new AImpl();
aa.a();
这里您的参考变量是interfaceA
类型,但实际的Object
是AImpl
public static void main(String[] args){
A aa = new AImp();
aa.a();
}
定义新接口时,就是在定义新的引用数据
类型。可以在任何可以使用任何其他数据的地方使用接口名称
键入名称。如果定义类型为的引用变量
接口,指定给它的任何对象都必须是类的实例
它实现了接口
阅读更多关于
接口引用可以在实现接口时保存AImpl的对象
这里您的参考变量是interfaceA
类型,但实际的Object
是AImpl
public static void main(String[] args){
A aa = new AImp();
aa.a();
}
定义新接口时,就是在定义新的引用数据
类型。可以在任何可以使用任何其他数据的地方使用接口名称
键入名称。如果定义类型为的引用变量
接口,指定给它的任何对象都必须是类的实例
它实现了接口
阅读更多关于
接口引用可以保存AImpl的对象,因为它实现了A接口。您可以通过自己运行代码来找到这一点
当前,您将获得一个NullPointerException
,因为您尚未为变量aa
分配任何内容。将代码更改为以下内容将调用该方法并输出文本:
public static void main(String[] args){
A aa = new AImpl();
aa.a();
}
您可以通过自己运行代码来发现这一点
当前,您将获得一个NullPointerException
,因为您尚未为变量aa
分配任何内容。将代码更改为以下内容将调用该方法并输出文本:
public static void main(String[] args){
A aa = new AImpl();
aa.a();
}
不,我不会
您已经声明了一个变量。您应该首先使用对象的实例初始化它,在这种情况下,您的类AImpl
public static void main(String[] args){
A aa = new AImp();
aa.a();
}
不,我不会
您已经声明了一个变量。您应该首先使用对象的实例初始化它,在这种情况下,您的类AImpl
public static void main(String[] args){
A aa = new AImp();
aa.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
}
它取决于对象的运行时类型。见:
这是您的界面:
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
}
左侧始终只是一个对象可以进入的插槽。正如Johan所说,您需要通过使用new
创建一个对象来实际“放置”一个对象。请尝试发布一篇文章来描述您的问题。并包括您收到的错误消息。接口将不会编译,main方法将抛出NullPointerException
。除此之外,你的问题是有效的,应该由我下面的答案来回答。@JayZhang:别忘了接受(勾选)最好的答案。所以每个人都知道问题已经解决了。这对我很有用,谢谢。但是这是使用service
接口类和serviceinpl
类的标准方法吗?左侧总是一个对象可以进入的插槽。正如Johan所说,您需要通过使用new
创建一个对象来实际“放置”一个对象。请尝试发布一篇文章来描述您的问题。并包括您收到的错误消息。接口将不会编译,main方法将抛出NullPointerException
。除此之外,你的问题是有效的,应该由我下面的答案来回答。@JayZhang:别忘了接受(勾选)最好的答案。所以每个人都知道问题已经解决了。这对我很有用,谢谢。但是这是使用service
接口类和serviceinpl
类的标准方式吗?谢谢,我现在明白了示例不是另一种教学方式,它是唯一的教学方式(阿尔伯特·爱因斯坦)。谢谢。谢谢,我现在明白了。示例不是另一种教学方式,它是唯一的教学方式(阿尔伯特·爱因斯坦)。谢谢。在面向对象设计的意义上,这是不平等的。如果你有这个接口,你需要用它来证明它的存在。这在面向对象设计的意义上是不平等的。如果你有这个接口,你需要用它来证明它的存在。