匿名内部班级工作?

时间:2017-01-13 20:34:40

标签: java

我已经浏览了一些解释java中匿名内部类的编程站点。

但是,我仍然怀疑它是如何运作的以及我在下面得出的结论。

这是代码:

public class Implementing {
          public static void main(String[] args) {

       SuperClass a = new SuperClass() {     // ... 1st

       public void call () {                // ... 2nd
       System.out.println("Method call");
                        }

       public void call2 () {     // creating new method in anonymous inner class
       System.out.println ("New call2 Method in Anonymous Class");
                            }
          }; 
                   a.call();       // ... 3rd
           try {               
           a.getClass().getMethod("call2",null).invoke(a,null); // ... 4th
                  } catch (Exeception e) {
                      System.out.println(e);
                    }
               }
             }

      class SuperClass {
          public void call() { 
             System.out.println("Super Class");
                            }
                 }

我的理解是:

第1名: -

  • 匿名内部类是子类。

  • 我们正在创建匿名内部类的实例以及我们 正在扩展SuperClass类。

  • 我们正在运行SuperClass的构造函数,但我们创建了对象
    SuperClass类型的匿名类。

  • 工作中的多态性。

  • 实际上,我们在第一时间这样做:

         *      1. anonymousClass extends SuperClass 
         *      2. anonymousClass a = new SuperClass()
         *      3. { }; // our anonymous class field
    

在第2位: - 覆盖SuperClass调用Method()。

在第3位: - 按对象'a'调用call()方法。

第4步: - 在匿名内部类中访问新方法call2()方法。

那么,我的这些结论是对还是错?如果错了,为什么他们错了?请解释一下。

1 个答案:

答案 0 :(得分:0)

您的代码创建了Anonymous Class

public static void main(String[] args) {
    SuperClass a = new SuperClass() { // ... 1st
        public void call() {
            System.out.println("Method call");
        }
        public void call2() {
            System.out.println("New call2 Method in Anonymous Class");
        }
    };
    ...
}

与创建Local Class的此代码相同:

public static void main(String[] args) {
    class LocalClass extends SuperClass {
        public void call() {
            System.out.println("Method call");
        }
        public void call2() {
            System.out.println("New call2 Method in Anonymous Class");
        }
    }
    SuperClass b = new LocalClass();
    ...
}

除了该类未命名,即匿名。

由于您是从静态方法执行此操作,并且未使用任何局部变量,因此它们都与此Static Nested Class相同:

static class NestedClass extends SuperClass {
    public void call() {
        System.out.println("Method call");
    }
    public void call2() {
        System.out.println("New call2 Method in Anonymous Class");
    }
}

如果查看已编译的.class文件,您会发现它们都只是类:

SuperClass.class                   <-- Your superclass
Implementing.class                 <-- Your main class
Implementing$1.class               <-- Anonymous class
Implementing$1LocalClass.class     <-- Local class
Implementing$NestedClass.class     <-- Nested class