Java匿名类 - 最小的例子

时间:2016-07-20 20:35:17

标签: java anonymous-class

我试图了解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();

    }

}

5 个答案:

答案 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传递。

但是,如果方法需要StringInteger,我就无法执行此操作,例如,因为这些是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){}。这有点取决于你的工作。