2016-07-20 34 views
-5

我想了解Java匿名类。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

“FileNameFilter”的示例如何,其中content只是'return s.endsWith(“。java”);'* over-complicated *? – Andreas

+1

*“定义匿名类的绝对最低要求”*:一个接口或一个非最终类。 – Andreas

+0

@Andreas因为代码实例化了一个完全的其他类文件,这大概是Java库的一部分。整个示例写入文件实例的.list()方法中。匿名类不需要File或File.list(),所以这个例子并不是最小的。 – bigcodeszzer

回答

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"; 
    } 
} 
+0

你是最有帮助的。谢谢 – bigcodeszzer

0

怎么样这个例子吗?

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

消息是在该实施例中一个匿名类, 映入眼帘()是这个匿名类中的唯一方法。

//Passing an anonymous inner class as an argument 
     obj.displayMessage(new Message(){ 
     public String greet(){ 
      return "Hello";    
     } 
     }); 
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来执行特定的操作。我们知道监听器正在监听某些内容,并且我们希望监听器做一些事情,因此我们制作监听器并说“当您被触发时执行此操作。”

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

但通常情况下,如果它的东西,是世俗的,如“运行点击的方法”,你会使用匿名在网上申报,只是调用方法给你。

+0

你应该移除'抛出java.lang.Exception'。如果像[使用'File'](http://stackoverflow.com/questions/38490376/java-anonymous-class-minimal-example?noredirect=1#comment64382701_38490376)对于OP来说过于复杂,那么可能有异常不知所云。但是,启动简单的+1。 – Andreas

+0

@Andreas是啊,它是从ideone遗留下来的,我没有注意到它,擦了擦。 – Compass

0

罗盘已经表示,绝对最低是没有用的。

下面是一个“有用”的内部类的一个实例:那么,而不必定义一个内部类或一个ActionListener你只使用一次,辅助类的

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

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

     } 
    }); 

,你可以把它作为一个内联或匿名类来消除混乱并提高可读性。

0

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

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

在匿名的例子中,你实例化方法的参数里面一个新的吧。当你只需要本地的东西而不需要在任何地方使用它时,你可以做到这一点,但在该方法调用中。它还会让您访问匿名类中的可访问方法。所以你可以做点像

foo(new Bar().barMethod){}。它只是取决于你正在处理的事情。