日期:2014-05-20  浏览次数:20735 次

为什么要使用内部类
RT
看有的提到说是
1.“控制框架”。
2.像C++样,实现“变相”的多继承。
很迷惑~

------解决方案--------------------
1、内部类可以访问它所在作用域内的数据,包括私有数据
2、在同一个包中,内部类对于其他类不可见
3、使用匿名内部类可以在写回调函数时,减少代码量
------解决方案--------------------
可以参考下内部类的特性:
实例内部类可以直接访问嵌套类的成员。如果是定义在方法中的局部内部类,还可以访问该方法中的final型的局部变量和final型的方法参数。
静态内部类只能直接访问所嵌套类的静态成员,而不能直接访问所嵌套类的非静态的成员,如果一定要访问,必须通过外部嵌套类的实例访问。
实例内部类不能声明任何static成员;静态内部类中可以声明static成员。

------解决方案--------------------
1.有一些类的变量,它只希望被特定的类访问,不想把变量设成public,而内部类可以调用外部类的所有信息,包括私有的。
2.对类的封装,隐藏内部类的代码实现。只有通过外部类得到想到的数据。
我就知道这两个。
------解决方案--------------------
好处:
1 方便。内部类可以访问外部类的所有属性和方法(包括private的)
2 隐藏。便于隐藏某些“专用类”,如某个界面的监听器类,或某些容器的底层数据结构(如HashMap中的Entry)。
这些类只服务于某个特定的类,不需要外部的任何类知道该信息。隐藏能减少不必要的信息量。
3 便捷。如写Swing界面的事件监听,驱动时,可减少其当做外部类编写时的很多参数传递。其实也是方便。
4 效率。减少了类与类之间交互,少创建了一些对象。当然,这种效率的提升时微不足道的,甚至没有也是可能的。
5 某些情况下使程序变得优雅。

内部类有好处,但与此对应,缺点貌似更多。只宜在一些特殊的场合应用。
1 难以阅读。类中还有类,就像怀胎的女人,你一眼看去,个头有些大。便知道此中不简单。
2 类与类之间耦合度很高,难以扩展和维护。
光这2条,其实已够被现代OO大师们打入冷宫了。
但它既然存在,肯定还是有其应用价值的。
常用到内部类的地方:小型GUI程序里监听器类,比较器(Comparator),容器底层专用数据结构等等。

内部类是一个不小的话题。跟多信息请google.
------解决方案--------------------
大家已接触了对内部类的运作进行描述的大量语法与概念。但这些并不能真正说明内部类存在的原因。为什么Sun要如此麻烦地在Java 1.1里添加这样的一种基本语言特性呢?答案就在于我们在这里要学习的“控制框架”。
  
  一个“应用程序框架”是指一个或一系列类,它们专门设计用来解决特定类型的问题。为应用应用程序框架,我们可从一个或多个类继续,并覆盖其中的部分方法。我们在覆盖方法中编写的代码用于定制由那些应用程序框架提供的常规方案,以便解决自己的实际问题。“控制框架”属于应用程序框架的一种非凡类型,受到对事件响应的需要的支配;主要用来响应事件的一个系统叫作“由事件驱动的系统”。在应用程序设计语言中,最重要的问题之一便是“图形用户界面”(GUI),它几乎完全是由事件驱动的。正如大家会在第13章学习的那样,Java 1.1 AWT属于一种控制框架,它通过内部类完美地解决了GUI的问题。
  
  为理解内部类如何简化控制框架的创建与使用,可认为一个控制框架的工作就是在事件“就绪”以后执行它们。尽管“就绪”的意思很多,但在目前这种情况下,我们却是以计算机时钟为基础。随后,请熟悉到针对控制框架需要控制的东西,框架内并未包含任何特定的信息。首先,它是一个非凡的接口,描述了所有控制事件。它可以是一个抽象类,而非一个实际的接口。由于默认行为是根据时间控制的,所以部分实施细节可能包括:
  
  //: Event.java
  // The common methods for any control event
  package c07.controller;
  
  abstract public class Event {
   private long evtTime;
   public Event(long eventTime) {
    evtTime = eventTime;
   }
   public boolean ready() {
    return System.currentTimeMillis() >= evtTime;
   }
   abstract public void action();
   abstract public String description();
  } ///:~
  
  希望Event(事件)运行的时候,构建器即简单地捕捉时间。同时ready()告诉我们何时该运行它。当然,ready()也可以在一个衍生类中被覆盖,将事件建立在除时间以外的其他东西上。
  
  action()是事件就绪后需要调用的方法,而description()提供了与事件有关的文字信息。
  
  下面这个文件包含了实际的控制框架,用于治理和触发事件。第一个类实际只是一个“助手”类,它的职责是容纳Event对象。可用任何适当的集合替换它。而且通过第8章的学习,大家会知道另一些集合可简化我们的工作,不需要我们编写这些额外的代码:
  
  //: Controller.java
  // Along with Event, the generic
  // framework for all control systems:
  package c07.controller;
  
  // This is just a way to hold Event objects.
  class EventSet {
   private Event[] events = new Event[100];
   private int index = 0;
   private int next = 0;
   public void add(Event e) {
    if(index >= events.length)
     return; // (In real life, throw exception)
    events[index++] = e;
   }
   public Event getNext() {
    boolean looped = false;
    int start = next;
    do {
     next = (next + 1) % events.length;
     // See if it has looped to the beginning:
     if(start == next) looped = true;
     // If it loops past start, the list 
     // is empty:
     if((next == (start + 1) % events.length)
       && looped)
      return null;
    } while(events[next] == null);
    return events[next];
   }
   public void removeCurrent() {
    events[next] = null;
   }
  }
  
  public class Controller {