【问题标题】:Object class with anonymous type constructor具有匿名类型构造函数的对象类
【发布时间】:2015-02-23 10:31:26
【问题描述】:

我正在创建一个对象作为匿名类型的类变量。没有编译错误。我的问题是如何使用类?如何调用我定义的方法?实际用在什么地方?

public class MyClass {

    Object o = new Object(){
        public void myMethod(){
            System.out.println("In my method");
        }
    };

}

我无法调用对象 o 的 myMethod()。如何做到这一点以及我们何时使用它?

【问题讨论】:

    标签: java object anonymous anonymous-class anonymous-inner-class


    【解决方案1】:

    调用不属于超类方法的匿名类方法的唯一方法是直接调用它:

    new Object(){
        public void myMethod(){
            System.out.println("In my method");
        }
    }.myMethod();
    

    如果您只是将匿名类存储在 Object 变量中,您将无法再调用它的方法(正如您所知道的那样)。

    然而这种结构的用处似乎相当有限......

    【讨论】:

    • 谢谢。明白了。但仍然在想这个的用处。如果我必须立即调用它,那么使用 Object 类有什么意义?相反,我们可以将其命名为新类 MyClass 并稍后使用它来调用 myMethod(),类似于 antonio 指出的使用接口
    【解决方案2】:

    要做这样的事情,你应该在 Object 类中有一个方法。简而言之,这意味着您需要覆盖 Object 类中定义的方法。

    尝试类似:

    Object o = new Object(){
        public boolean equals(Object object){
            System.out.println("In my method");
            return this == object;//just bad example.
        }
    };
    Object o2 = new Object();
    System.out.println(o.equals(o2));will also print "In my method"
    

    【讨论】:

      【解决方案3】:

      您的变量类型是Object,因此编译器允许您调用的唯一方法是在Object 中声明的方法。

      改为声明一个非匿名类:

      private static class MyObject {
          public void myMethod() {
              System.out.println("In my method");
          }
      };
      
      MyObject o = new MyObject();
      

      【讨论】:

        【解决方案4】:

        你可以使用接口:

        public interface MyInterface {
            public void myMethod();
        }
        

        在你的 MyClass 中

        public class MyClass {
            MyInterface o = new MyInterface() {
                @Override
                public void myMethod() {
                    System.out.println("In my method");
                }
            };
        
            public void doSomething() {
                o.myMethod();
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-26
          • 1970-01-01
          • 2023-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多