pitfall - inner class override

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangbingfengf98/article/details/85915465

"overriding" an inner class doesn't really do anything:

// innerclasses/BigEgg.java
// (c)2017 MindView LLC: see Copyright.txt
// We make no guarantees that this code is fit for any purpose.
// Visit http://OnJava8.com for more book information.
// An inner class cannot be overridden like a method

class Egg {
  private Yolk y;

  protected class Yolk {
    public Yolk() {
      System.out.println("Egg.Yolk()");
    }
  }

  Egg() {
    System.out.println("New Egg()");
    y = new Yolk();
  }
}

public class BigEgg extends Egg {
  public class Yolk {
    public Yolk() {
      System.out.println("BigEgg.Yolk()"); // do not work
    }
  }

  public static void main(String[] args) {
    new BigEgg();
  }
}
/* Output:
New Egg()
Egg.Yolk()
*/

There’s no extra inner-class magic when we inherit from the outer class. The two inner classes are completely separate entities, each in its own namespace. However, it’s still possible to explicitly inherit from the inner class:

// innerclasses/BigEgg2.java
// (c)2017 MindView LLC: see Copyright.txt
// We make no guarantees that this code is fit for any purpose.
// Visit http://OnJava8.com for more book information.
// Proper inheritance of an inner class

class Egg2 {
  protected class Yolk {
    public Yolk() {
      System.out.println("Egg2.Yolk()");
    }

    public void f() {
      System.out.println("Egg2.Yolk.f()");
    }
  }

  private Yolk y = new Yolk();

  Egg2() {
    System.out.println("New Egg2()");
  }

  public void insertYolk(Yolk yy) {
    y = yy;
  }

  public void g() {
    y.f();
  }
}

public class BigEgg2 extends Egg2 {
  public class Yolk extends Egg2.Yolk { // explicity, the diff
    public Yolk() {
      System.out.println("BigEgg2.Yolk()");
    }

    @Override
    public void f() { // diff
      System.out.println("BigEgg2.Yolk.f()");
    }
  }

  public BigEgg2() {
    insertYolk(new Yolk());
  }

  public static void main(String[] args) {
    Egg2 e2 = new BigEgg2();
    e2.g();
  }
}
/* Output:
Egg2.Yolk()
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
BigEgg2.Yolk.f()
*/

Note the output show two Egg2.Yolk(). The two inner classes are completely separate entities.

references:

1. On Java 8 - Bruce Eckel

2. https://github.com/wangbingfeng/OnJava8-Examples/blob/master/innerclasses/BigEgg.java

3. https://github.com/wangbingfeng/OnJava8-Examples/blob/master/innerclasses/BigEgg2.java

猜你喜欢

转载自blog.csdn.net/wangbingfengf98/article/details/85915465