【问题标题】:Can we create an object of an interface?我们可以创建接口的对象吗?
【发布时间】:2011-04-29 08:12:04
【问题描述】:
interface TestA {
    String toString();
}

public class Test {
    public static void main(String[] args) {
        System.out.println(new TestA() {
            public String toString() {
                return "test";
            }
        });
    }
}

结果如何?

A.测试
B. null
C. 运行时抛出异常。
D. 由于第 1 行的错误,编译失败。
E. 由于第 4 行出错,编译失败。
F. 由于第 5 行出错,编译失败。

这个问题的答案是什么,为什么?我对这个问题还有一个疑问。在第 4 行中,我们正在创建 A 的对象。是否可以创建接口的对象?

【问题讨论】:

    标签: java oop interface instance anonymous-class


    【解决方案1】:

    您在这里看到的是anonymous inner class

    给定如下界面:

    interface Inter {
        public String getString();
    }
    

    您可以像这样创建它的实例:

    Inter instance = new Inter() {
        @Override
        public String getString() {
            return "HI";
        }
    };
    

    现在,您已经定义了接口的一个实例。但是,您应该注意,您实际上所做的是定义了一个实现接口的类并同时实例化了该类。

    【讨论】:

    • 我正在寻找它。这是一个非常简短和简单的答案。 +1 简洁。
    • @SheikhAman 哈哈,我怀疑这个 OP 会选择正确的答案
    • 那么实际上调用了System.out.println(innerObject.getString()); 是不是真的没有导致任何错误?
    【解决方案2】:

    test 应该是输出。这是一个匿名内部类的例子。

    这是与Comparator 接口一起使用的非常常见的模式,用于模拟闭包。

    【讨论】:

      【解决方案3】:

      也试试这个...匿名类的名字生成了!

      Inter instance = new Inter() {
          public String getString() {
              return "HI" + this.getClass();
          }
      };
      

      【讨论】:

        【解决方案4】:

        诀窍不仅仅在于匿名内部类,这个打印测试因为它覆盖了 toString 方法,而 System.out.println a Object 它隐式调用它的 toString 方法。

        【讨论】:

          【解决方案5】:

          我们可以创建一个anonymous class的对象,它实现了接口:

          匿名类使您的代码更简洁。它们使您能够同时声明和实例化一个类。它们类似于本地类,只是它们没有名称。如果您只需要使用一次本地类,请使用它们。

          如果你有一个接口,声明一个方法toString,你可以先创建一个类,实现这个接口,然后创建这个类的对象:

          interface TestA {
              String toString();
          }
          
          class TestB implements TestA {
              @Override
              public String toString() {
                  return "test";
              }
          }
          
          public class Test {
              public static void main(String[] args) {
                  System.out.println(new TestB());
              }
          }
          

          或者你可以创建一个匿名类的对象来简化这段代码:

          interface TestA {
              String toString();
          }
          
          public class Test {
              public static void main(String[] args) {
                  System.out.println(new TestA() {
                      @Override
                      public String toString() {
                          return "test";
                      }
                  });
              }
          }
          

          在这两种情况下都会打印"test"

          【讨论】:

            【解决方案6】:

            我不知道这个问题的意义。如果这是一个面试问题,那么我可以说没关系。但实际上,这不是实现继承的正确方法。所以回答这个问题,你正在做的是一个 anonymous inner class

            这里你正在实例化一个并通过编写实现继承

            System.out.println(new TestA() {
                public String toString() {
                    return “test”;
                }
            }); 
            

            当然结果是test

            【讨论】:

              猜你喜欢
              • 2015-12-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-06-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多