【问题标题】:How to use the anonymous inner class?如何使用匿名内部类?
【发布时间】:2012-08-21 23:45:45
【问题描述】:

我制作这两个类是为了利用匿名内部类的概念。 类 1 有一个静态内部类。 2 级使用它。但我不明白如何调用内部类的方法。请帮帮我。

第一类

public class outerclass {
  outerclass() {
    System.out.println("Constructor of new class");
  }

  public void showthis(String str) {
    System.out.println(str);
  }

  static class insideclass {
    insideclass() {
      System.out.println("This is inside class constructor");
    }

    public void nowshowthis(String str) {
      System.out.println(str);
    }
  }
}

2 级

public class helloworld {
  public static void main(String args[]) {
    //this is an object of the outer class
    outerclass example=new outerclass();
    //How do i make an anonymous inner class and call the method "nowshowthis()"
  }
}

【问题讨论】:

  • 您的代码没有任何匿名内部类。你所有的类都有名字。
  • 我不认为 insideclass 是匿名内部类,它只是内部类。
  • 与您的问题没有直接关系,但是,Java naming conventions 声明类名应该以大写字母开头,并且每个内部单词的第一个字母大写。所以outerclass 实际上应该是OuterClass
  • 更重要的是,这个类并不是真正的静态,因为它不是用静态关键字处理的。用大写字母命名类是个好主意。
  • 内部类是静态的,错误见谅。

标签: java nested-class


【解决方案1】:

匿名内部类是在另一个类的方法体中创建和定义的。本质上,您正在从抽象定义中动态创建一个具体类。到目前为止,您的 InnerClass 类实际上只是一个常规的内部类,这意味着非匿名。

如果您想尝试匿名内部类,我能想到的最简单的方法是将您的 InnerClass 更改为接口,如下所示:

public interface InnerClass{
    public void doSomething();
}

所以此刻,InnerClass 确实蹲下了;在定义之前它没有任何意义。接下来,您需要更改 OuterClass 的工作方式。像这样改变你的 showThis() 函数:

public showThis(InnerClass innerObj){
    innerObj.doSomething();
}

现在我们有你的外部类要求内部类实例做某事,但我们仍然没有定义我们想要它做什么。这就是魔法发生的地方 - 在您的 main 方法中,您将定义内部类实例的实际外观:

public static void main (String[] args){
    OuterClass outer = new OuterClass();

    // This is the key part: Here you are creating a new instance of inner class 
    // AND defining its body. If you are using Eclipse, and only write the 
    // new InnerClass() part, you'll notice that the IDE complains that you need 
    // to implement the doSomething() method, which you will do as though you
    // were creating a plain 'ol class definition
    outer.showThis(new InnerClass(){ 
        public void doSomething(){
            System.out.println("This is the inner anonymous class speaking!");
        }
    });
}

在实践中,我并没有过多地使用匿名内部类,但是了解它们很有用。我在进行 GUI 编程时最常使用它们来定义 GUI 控制事件的侦听器,例如按钮单击。

另外,正如其他人所提到的,请记住 Java 标准的类名的第一个字母是大写字母,我在这里做了。您将希望遵循该标准,因为它使其他人更容易阅读您的代码,并且一眼就可以很容易地分辨出您何时在看一个类,何时在看一个对象。

无论如何,希望对您有所帮助。

【讨论】:

  • 是的,这正是我想要的。正如你所说的 eclipse 已编译,所以我实现了 doSomething() 方法。但是我在outer.showThis(new insideclass(){ 行上遇到了最后一个错误,错误是-outerclass类型中的方法showThis(outerclass.insideclass)不适用于参数(new insideclass(){})
  • 哦,好吧,我忘了你把 InsideClass 放在了 OuterClass 类里面。我想您可以将#1“new InsideClass()”更改为“new OuterClass.InsideClass()”,或者#2将InsideClass完全移动到另一个文件(我建议#2,因为我真的想不出在 OuterClass 中有 InsideClass 的任何主要原因)。
  • 另外,不要忘记接受对您最有帮助的答案。
  • 终于成功了!!非常感谢 。它有效,所以你的是最好的答案。也感谢所有其他人的时间,我学到了很多。
【解决方案2】:

让我摆脱当前的问题!如果您的内部类在非静态中,这是如何实例化它:(假设 exampleouterclass) 类型的对象

  example.new insideclass().nowshowthis("my String")

对于static public 内部类,您不需要甚至需要外部类的实例。只需这样做(很像访问公共静态变量)

new outerclass.insideclass().nowshowthis("my String")

你试过吗?

怎么了?在你的情况下,你并没有真正处理匿名内部类。它实际上只是一个普通的内部类。 (我无法解释你为什么要这样做。)

那么什么是匿名类,我们在哪里使用它? 匿名类就像是一次性使用的类的实例。当您实现某个接口时,其中一个示例就会浮出水面……但您不需要以其他方式使用它。例如,您想将处理程序附加到按钮。您可以以这种方式进行操作(假设示例)

   MyButtonInterface obj= new MyButtonInterface(){
      @Override
      onClick(Model obj){
             //save model in DB
       }
   }
   UI.add(obj, "specificId");

你看到了吗?

【讨论】:

  • 对不起,我错了,内部类是静态的。
  • @Sourav 好吧,我已经添加了所有案例。你看你需要做new outerclass.insideclass().nowshowthis("my String")——但也知道其他的东西。 (我相信你是一个很好的学习者)
【解决方案3】:

insideclass 是一个非静态类,因此必须通过外部类的实例访问它,如下所示:
new outerclass().new insideclass().nowshowthis();

【讨论】:

    【解决方案4】:

    这不是匿名内部类。下面是一个匿名内部类的例子:

    class InnerClassDemo {
      public static void main(String[] args) {
        ActionListener a = new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            System.out.println(e.getActionCommand());
          }
        };
        // now a is the only instance of an anonymous inner class implementing the ActionListener interface
      }
    }
    

    您当然也可以使用自己的接口或类来执行此操作:

    class InnerClassDemo {
      public class InsideClass {
          InsideClass() {
              System.out.println("This is inside class constructor");
          }
    
          public void nowshowthis(String str) {
              System.out.println(str);
          }
      }
    
      public static void main(String[] args) {
        InsideClass anonym = new InsideClass() {
          @Override
          public void nowshowthis(String str) {
              System.out.println("anonymous inner class override: "+str);
          }
        }
        InsideClass normalInstance = new InsideClass();
        anonym.noshowthis("test");
        normalInstance.noshowthis("test");
      }
    }
    

    你的输出将是

    anonymous inner class override: test
    test
    

    所以anonymInsideClass 的匿名内部类实现的一个实例,而normalInstance 只是你的类InsideClass 的一个普通实例。

    【讨论】:

      【解决方案5】:
      public class HelloWorld {
      
          public static void main(String args[])
              {
      
      
              outerclass.insideclass example= new outerclass.insideclass();
      
              example.nowshowthis("Hello");
      
      
          }
      }
      

      或者,将 nowshowthis 方法设为静态,这样可以调用它:

      outerclass.insideclass.nowshowthis("Howdy. This method is static.");
      

      【讨论】:

        最近更新 更多