【问题标题】:Confusion on call Java Interface method调用Java接口方法的困惑
【发布时间】:2013-04-23 16:12:34
【问题描述】:

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

public interface A {
  public void a();
}

它包括称为void a();的方法

我有一个类实现了这个接口并且只有一个方法:

    public class AImpl implements A {
       @Override
       public void a() {
           System.out.println("Do something");
       }
    }

Q:如果在主类中调用接口方法,会不会调用属于实现该接口的类的实现?

例如:

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

这会打印“做某事”吗?

【问题讨论】:

  • 左边永远只是一个对象可以去的槽。正如约翰所说,您需要通过使用new 创建一个对象来实际“放置”一个对象。
  • 请尝试发布SSCCE 来描述您的问题。并包括您收到的错误消息。接口不会编译,main 方法会抛出一个NullPointerException。除此之外,您的问题是有效的,应该由我在下面的回答来回答。
  • @JayZhang:不要忘记接受(勾选)最佳答案。所以大家都知道问题解决了。
  • 这对我有用,谢谢。但这是使用service接口类和serviceimpl类的标准方式吗?

标签: java interface


【解决方案1】:

这取决于对象的运行时类型。见:

这是你的界面:

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
}

【讨论】:

  • 谢谢,我明白了
  • 示例不是另一种教学方式,而是唯一的教学方式(阿尔伯特·爱因斯坦)。谢谢。
【解决方案2】:
A aa = new AImpl();
aa.a();

这里你的引用变量是接口A类型但实际ObjectAImpl

当你定义一个新的接口时,你就是在定义一个新的参考数据 类型。您可以在任何可以使用任何其他数据的地方使用接口名称 键入名称。如果您定义一个类型为 接口,您分配给它的任何对象都必须是类的实例 实现接口。

阅读更多Documentation

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

【讨论】:

    【解决方案3】:

    您可能可以通过自己运行代码来发现这一点。

    目前您将获得一个NullPointerException,因为您尚未为变量aa 分配任何内容。将您的代码更改为以下代码将调用该方法并输出文本:

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

    【讨论】:

      【解决方案4】:

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

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

      这里相当于跟随

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

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

      【讨论】:

      • 在 OO 设计的意义上不相等。如果你有那个接口,你需要用它来证明它的存在。
      【解决方案5】:

      没有。我不会。

      你已经声明了一个变量。你应该首先用一个对象的实例来初始化它,在这种情况下你的类AImpl

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

      【讨论】:

        猜你喜欢
        • 2011-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多