美文网首页
Thinking In Java读书笔记-内部类

Thinking In Java读书笔记-内部类

作者: andrew7 | 来源:发表于2018-04-23 10:44 被阅读0次

[toc]

内部类

内部类可以有外围类所有元素的访问权限 比方说迭代器就是通过内部类的方式实现的

内部类得到外部类

public class DotThis {
  void f() {
    System.out.println("DotThis.f()");
  }
  public class Inner {
    public DotThis outer() {
      return DotThis.this;
    }
  }
}

创建内部类

public class DotNew {
  public static void main(String[] args) {
    DotNew dn = new DotNew();
    DotNew.Inner = Dot.new Inner();
  }
}

内部匿名类

public class Parcel7 {
  public Contents contents() {
    return new Contents() {
      private int i = 11;
      public int value() {
        return i;
      }
    }
  }
}

创建一个继承自Contents的内部匿名类的对象, 使用的构造函数是Content();
如果内部匿名类希望使用一个外部的对象, 那么编译器会要求引用的参数是final的.(在Java 8 的lamdba 中也是这么要求的?)

内部类的使用方式

迭代器

Iterator 就是这么实现的

用内部类实现闭包

闭包是一个可以调用的对象,它记录了一些信息, 这些信息来自于创建它的作用域

interface Incrementable {
  void increment();
}
class Callee1 implement Incrementable {
  private int i = 0;
  public void increment() {
    i++;
  }
}
class MyIncrement {
  public void increment() {
    println("Other operatorion");
  }
  public void f(MyIncrement mi) {
    mi.increment();
  }
}
class Callee2 extend MyIncrement {
  private int i = 0;
  public void increment() {
    super.increment();
    i++;
    print(i);
  }
  private class Closure implements Incrementable {
    public void increment() {
      Callee2.this.incrment();
    }
  }
  Incrementable getCallbackReference() {
    return new Closure();
  }
}
public Caller {
  private Incrementable callbackReference;
  Caller(Incrementable chb) {
    this.callbackReference = chb;
  }
  void go() {
    callbackReference.increment();
  }
}

内部类和控制框架

比方说在Swing 中

public class Test {
  public static void main(String[] args) {
    Button button = new Button();
    button.setPush(new Action() {
      @Override
      public void doSomething(Event e) {
        do something;
      }
    });
  }
}

内部类的继承

因为内部类的构造器必须连接到指向其外围类的引用. 那个指向外围类对象的“秘密的”引用必须被初始化, 而在导出类中不再存在可以链接的默认对象.所以必须使用特殊的语法来明确说明这这两者之间的关系.

class WithInner {
  class Inner {
  }
}

class InheritInner extends WithInner.Inner {
  // 必须在构造函数中有如下的语法 说明内部类和wai
  InHeritInner(WithInner wi) {
    wi.super();
  }
}

相关文章

网友评论

      本文标题:Thinking In Java读书笔记-内部类

      本文链接:https://www.haomeiwen.com/subject/onuklftx.html