【问题标题】:Anonymous Inner class匿名内部类
【发布时间】:2011-07-06 09:50:35
【问题描述】:
class One {
Two two() {
    return new Two() {
        Two(){}
        Two(String s) {
            System.out.println("s= "+s);
        }
    };
    }
}

class Ajay {
    public static void main(String ...strings ){
        One one=new One();
        System.out.println(one.two());
    }
}

上面的示例代码无法编译。它说“两个无法解析”。 这段代码有什么问题??

【问题讨论】:

  • 代码有问题吗??

标签: java inner-classes anonymous-class


【解决方案1】:

你正在创造

new Two() 所以类路径中必须有一个有效的类。

做起来

class Two{

}

class One {
Two two() {
    return new Two() {
//        Two(){}
//        Two(String s) {
//            System.out.println("s= "+s);
//        }//you can't override constuctors
    };
    }
}

或者在 new 的左侧必须有超类或接口才能使其工作

【讨论】:

  • @jigar...不,他正在使用 next-generation-dynamic-class-generation 自动创建不在类路径中的任何类,并为它创建合理的方法;)
  • 由于Two 实际上是作为匿名内部类实现的,因此将其声明为接口或抽象类而不是类可能更有意义。
  • @MAK 作为匿名内部类实现仅用于所示代码
【解决方案2】:
new Two() {
    Two(){}
    Two(String s) {
        System.out.println("s= "+s);
    }
};

匿名内部类之所以称为匿名内部类,是因为它没有自己的名称,并且必须通过它扩展/实现的基类或接口的名称来引用。

在您的示例中,您创建了 Two 的匿名子类,因此 Two 必须在某处声明为类或接口。如果已经声明了第二类,您要么在类路径中没有它,要么忘记导入它。

【讨论】:

  • 谢谢。我忘了声明二类。事实上我不知道应该声明二类,因为我引用的书没有提到这一点..
【解决方案3】:

您没有声明 Two 类。您声明了类One 和私有成员two,其中two 是您尝试通过匿名构造初始化的Two 类的对象。

【讨论】:

  • two 未声明为私有
  • Two(){} 是构造函数,而 Two two(){} 是类 One 的方法。