我试图了解Java匿名类。
看这里: https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html
在这里: http://docstore.mik.ua/orelly/java-ent/jnut/ch03_12.htm
我理解基本语法,但这些示例都是非最小的。
在Java中定义匿名类的绝对最低要求是什么?
编辑>>>
基本上就是这样:
public class MyClass {
InnerClass instance = new InnerClass();
public class InnerClass{
public void print(){
System.out.println("First Call");
}
};
public void redefineInstance(){
instance = new InnerClass(){
public void print(){
System.out.println("Second Call");
}
};
}
public static void main(String[] args) throws Exception{
MyClass myobject = new MyClass();
myobject.instance.print();
myobject.redefineInstance();
myobject.instance.print();
}
}
答案 0 :(得分:2)
最简单的例子:
interface Foo {}
public static void main (String[] args)
{
Foo foo = new Foo() {};
}
字面上是一个接口的声明,然后用作匿名类,没有其他声明。
实际上,它什么都不做。但是,当我们添加位时:
interface Foo {
public void bar();
}
public static void main (String[] args) throws java.lang.Exception
{
Foo foo = new Foo() {
public void bar() {
System.out.println("Hello");
}
};
}
它成为我们方法的完整助手类。
早期/中级编程的最常见用途是覆盖侦听器以执行特定操作。我们知道Listener正在倾听某些事情,我们希望它能够通过Listener做一些事情,所以我们制作了Listener并说出“当你被触发时这样做。”
以下是一个非常复杂的ActionListener教程示例:https://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html
但通常情况下,如果它像“在点击时运行方法”那样平凡,那么你将使用一个匿名的在线声明来为你调用一个方法。
答案 1 :(得分:1)
我认为创建匿名类的“绝对最低要求”是在代码中有一个位置需要非final
类或某种接口的实例。
意思是,如果我在MyClass
中有方法:
public static void gimmeMyObject(MyObject c)
只要MyObject
不是MyObject
,我就可以定义一个扩展final
的匿名类:
//Somewhere in a method
MyClass.gimmeMyObject(new MyObject() {
public String myMethod() {
return "I'm anonymous";
}
});
该匿名类将作为MyObject
传递。
但是,如果方法需要String
或Integer
,我就无法执行此操作,例如,因为这些是final
类。
对于上面的示例,非匿名类将转换为:
public class MyAnonObject extends MyObject { //In actuality, an anonymous class doesn't have a name, though.
public String myMethod() {
return "I'm anonymous";
}
}
答案 2 :(得分:0)
这个例子怎么样?
//interface
interface Message{
String greet();
}
在此示例中,Message是一个匿名类, greet()是这个匿名类中唯一的方法。
//Passing an anonymous inner class as an argument
obj.displayMessage(new Message(){
public String greet(){
return "Hello";
}
});
答案 3 :(得分:0)
正如指南针已经说过的那样,绝对最小值没有用。
以下是“有用”内部类的示例:
JButton ok = new JButton();
ok.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("abc");
}
});
因此,您不必为ActionListener定义内部类或辅助类,而只需使用一次,您可以将其作为内联或匿名类来删除混乱并提高可读性。
答案 4 :(得分:0)
您可以将匿名类视为基本上创建对象的新实例的实例化部分。你基本上只是不声明它并给它一个名字。这通常会传递给方法参数,如下所示。
对象someObj;是一个对象声明。 someObj = new Objct(parm a,...)是对象的实例化。
//example of anonymous classes:
public void foo(Bar barObj){// takes a Bar object parameter
//does stuff
}
//you can call the foo method in this way
Bar barObject= new Bar();
foo(barObject){}
// or you can call the Bar anonymously
foo(new Bar()){}
在匿名示例中,您在method参数中实例化一个新的Bar。你只需要一些本地的东西就可以做到这一点,除了那个方法调用之外,不需要在任何地方使用它。然后,它还允许您访问匿名类内部的可访问方法。所以你可以做一些像
这样的事情foo(new Bar()。barMethod){}。这有点取决于你的工作。