调用Java接口方法时的混淆

调用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"); } } 问:如果在主类中,我

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

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();
这里您的参考变量是interface
A
类型,但实际的
Object
AImpl

public static void main(String[] args){
  A aa = new AImp();
  aa.a();
}
定义新接口时,就是在定义新的引用数据 类型。可以在任何可以使用任何其他数据的地方使用接口名称 键入名称。如果定义类型为的引用变量 接口,指定给它的任何对象都必须是类的实例 它实现了接口

阅读更多关于

接口引用可以在实现接口时保存AImpl的对象

这里您的参考变量是interface
A
类型,但实际的
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
类的标准方式吗?谢谢,我现在明白了示例不是另一种教学方式,它是唯一的教学方式(阿尔伯特·爱因斯坦)。谢谢。谢谢,我现在明白了。示例不是另一种教学方式,它是唯一的教学方式(阿尔伯特·爱因斯坦)。谢谢。在面向对象设计的意义上,这是不平等的。如果你有这个接口,你需要用它来证明它的存在。这在面向对象设计的意义上是不平等的。如果你有这个接口,你需要用它来证明它的存在。