java内部类可以包围吗
当前位置:以往代写 > JAVA 教程 >java内部类可以包围吗
2019-06-14

java内部类可以包围吗

java内部类可以包围吗

若建设一个内部类,然后从封装类担任,并从头界说内部类,那么会呈现什么环境呢?也就是说,我们有大概包围一个内部类吗?这看起来好像是一个很是有用的观念,但“包围”一个内部类——好象它是外部类的另一个要领——这一观念实际不能做任何工作:
 

//: BigEgg.java
// An inner class cannot be overriden 
// like a method

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

public class BigEgg extends Egg {
  public class Yolk {
    public Yolk() {
      System.out.println("BigEgg.Yolk()");
    }
  }
  public static void main(String[] args) {
    new BigEgg();
  }
} ///:~

默认构建器是由编译器自动合成的,并且会挪用基本类的默认构建器。各人或者会认为由于筹备建设一个BigEgg,所以会利用Yolk的“被包围”版本。但实际环境并非如此。输出如下:
New Egg()
Egg.Yolk()
这个例子简朴地展现出当我们从外部类担任的时候,没有任何特另外内部类继承下去。然而,仍然有大概“明晰”地从内部类担任:
 

//: BigEgg2.java
// 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();
  public 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 {
    public Yolk() {
      System.out.println("BigEgg2.Yolk()");
    }
    public void f() {
      System.out.println("BigEgg2.Yolk.f()");
    }
  }
  public BigEgg2() { insertYolk(new Yolk()); }
  public static void main(String[] args) {
    Egg2 e2 = new BigEgg2();
    e2.g();
  }
} ///:~

此刻,BigEgg2.Yolk明晰地扩展了Egg2.Yolk,并且包围了它的要领。要领insertYolk()答允BigEgg2将它本身的某个Yolk工具上溯造型至Egg2的y句柄。所以当g()挪用y.f()的时候,就会利用f()被包围版本。输出功效如下:
Egg2.Yolk()
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
BigEgg2.Yolk.f()
对Egg2.Yolk()的第二个挪用是BigEgg2.Yolk构建器的基本类构建器挪用。挪用
g()的时候,可发明利用的是f()的被包围版本。

    关键字:

在线提交作业