Java 匿名 Class - 最小示例

Java Anonymous Class - minimal example

我正在尝试理解 Java 匿名 classes.

看这里: https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

这里: http://docstore.mik.ua/orelly/java-ent/jnut/ch03_12.htm

我了解基本语法,但示例不多。

在 Java 中定义匿名 class 的绝对最低要求是什么?

编辑>>>

本质上是这样的:

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();

    }

}

这个例子怎么样?

//interface
interface Message{
   String greet();  
}

在此示例中,消息是匿名的 class, greet() 是这个匿名 class.

中唯一的方法
//Passing an anonymous inner class as an argument
      obj.displayMessage(new Message(){
         public String greet(){
            return "Hello";            
         }
      });

最简单的例子:

interface Foo {}
public static void main (String[] args)
{
    Foo foo = new Foo() {};
}

从字面上看是一个接口声明,然后作为匿名使用 class,没有额外的声明。

实际上,它什么都不做。但是,当我们在中添加位时:

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");
        }
    };
}

它成为我们方法的成熟助手class。

early/mid 关卡编程最常见的用途是覆盖侦听器以执行特定操作。我们知道 Listener 正在监听某事,我们希望它作为 Listener 的结果做某事,所以我们制作 Listener 并说 "Do this when you are triggered."

这是一个非常复杂的 ActionListener 教程的示例:https://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html

但通常情况下,如果它是像 "run a method on click" 这样平凡的东西,您将使用匿名内联声明,它只为您调用一个方法。

我想创建匿名 class 的 "absolute minimal requirement" 是在您的代码中有一个地方需要非 final class 或接口的实例某种形式。

意思是,如果我在MyClass中有一个方法:

public static void gimmeMyObject(MyObject c)

我可以定义一个扩展 MyObject 的匿名 class,只要 MyObject 不是 final:

//Somewhere in a method
MyClass.gimmeMyObject(new MyObject() {
      public String myMethod() {
           return "I'm anonymous";
      }
});

匿名 class 将作为 MyObject 传入。

但是,如果该方法需要 StringInteger,我无法执行此操作,例如,因为它们是 final classes.

对于上面的示例,非匿名 class 将转换为:

public class MyAnonObject extends MyObject { //In actuality, an anonymous class doesn't have a name, though.

     public String myMethod() {
           return "I'm anonymous";
     }
}

Compass 已经说过,绝对最小值没有用。

以下是 'useful' 内部 class 的示例:

JButton ok = new JButton();
    ok.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("abc");

        }
    });

因此,不必为只使用一次的 ActionListener 定义内部 class 或助手 class,您可以将其作为内联或匿名 class消除混乱并提高可读性。

您可以将匿名 class 视为创建对象新实例的基本实例化部分。你基本上只是不声明它并给它一个名字。这通常会传递到方法参数中,如下所示。

对象 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()){}

在匿名示例中,您在方法参数内实例化了一个新的 Bar。当您只需要本地的东西并且不需要在该方法调用之外的任何地方使用它时,您可以这样做。它还允许您访问匿名 class 内部的可访问方法。所以你可以做类似

foo(新 Bar().barMethod){}。这在某种程度上取决于您使用的是什么。