【问题标题】:nested classes anonymous classes嵌套类匿名类
【发布时间】:2012-03-30 10:55:36
【问题描述】:
public class A {
  protected int x;
  public A(int x) { this.x = x; }
  public void g() { System.out.println(x); }
  public void h() { System.out.println(x + 10); }
}
public class B {
  public void f() {
  (new A(2) {
    public void g() {
      h();
    }
   }).g();
  }
}

public static void main(String[] args) {
  new B().f();
}

能否帮助我理解代码中的这一行:

new A(2) { public void g() {h();} }).g();

我不明白他是否在这里用 A 定义了一个匿名类?以及他如何匿名引用 A.h() ?

【问题讨论】:

    标签: java oop nested-class


    【解决方案1】:

    这一行创建了一个无名类,它覆盖了父类的g() 方法,因此它做了一件新的事情:调用h()。但是它会立即在这个无名类上调用g() 方法。

    【讨论】:

    • 所以这里的 A(2) 不是新类的名称,它是非名称类的父类而不是覆盖 A ?请纠正我
    • A(2) 表示这个新的匿名类立即使用构造函数参数 2 实例化。
    【解决方案2】:

    他创建了一个匿名类并覆盖了g()。就像你使用Runnable和override运行时一样。

    (new A(2) { public void g() {h();} }).g();
    

    意思

    class C extends A
    {
        public C()
        {
            super(2);
        }
    
        @Override
        public void g()
        {
            this.h();
        }
    }
    
    (new C()).g();  // or C c = new C(); c.g();
    

    【讨论】:

      【解决方案3】:

      您引用的行定义了一个新的匿名类 extends A 和 Overrides g() 然后调用它。

      由于匿名类扩展了A,它体现了h()的定义,所以可以调用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-12
        • 2012-04-15
        • 1970-01-01
        • 1970-01-01
        • 2018-02-01
        • 1970-01-01
        相关资源
        最近更新 更多