package com.gibe;
public class Ersatz {
  public static void main(String[] args) {
    // 外部其他类, 使用成员内部类三种方法
    Outer outer = new Outer();
    outer.mm();
    // 外部instance.new
    Outer.Inner inner = outer.new Inner();
    inner.say();
    // 外部类编写对象方法, 返回Inner对象
    Outer.Inner instance = outer.getInstance();
    instance.say();
    //
    Outer.Inner vv = new Outer().new Inner();
    vv.say();
  }
}
class Outer {
  private int n = 11;
  public String name = "Outer";
  private void hi(Inner inner) {
    System.out.println("Outer hi()");
    System.out.println("inner: "+inner);
  }
  private static final void m() {
    System.out.println("Outer static m()");
  }
  public final class Inner {
    private double salary = 99.8;
    private int n = 22;
    public Inner() {
      System.out.println(this);
    }
    public void say() {
      System.out.println("n=" + n + " Outer.this.n=" + Outer.this.n);
      hi(this);
      m();
    }
  }
  public Inner getInstance() {
    return new Inner();
  }
  public void mm() {
    Inner inner = new Inner();
    inner.say();
  }
}
 
  
 
package com.gibe;
public class Ersatz {
  public static void main(String[] args) {
    Outer outer = new Outer();
//    outer.mm();
    // 静态内部类, 可通过类名直接访问(满足访问权限)
    Outer.Inner inner = new Outer.Inner();
    inner.n();
    // 通过Outer方法(static or non-static)
    Outer.Inner inner1 = outer.getInner();
    inner1.n();
    Outer.Inner inner2 = Outer.getInner_();
    inner2.n();
  }
}
class Outer {
  private int n = 11;
  private static String name = "Outer";
  private static void m() {
    System.out.println("Outer static m()");
  }
  static class Inner {
    private static String name = "Inner";
    public void n() {
      System.out.println("Inner name=" + name + " Outer.name=" + Outer.name);
      m();
    }
  }
  public void mm() {
    Inner inner = new Inner();
    inner.n();
  }
  public Inner getInner() {
    return new Inner();
  }
  public static Inner getInner_() {
    return new Inner();
  }
}