内部类,有时叫做嵌套类,被附加到JDK1.1及更高版本中。内部类允许一个类定义被放到另一个类定义里。内部类是一个有用的特征,因为它们允许将逻辑上同属性的类组合到一起,并在另一个类中控制一个类的可视性。
6.14.1  内部类基础
    下述例子表示使用内部类的共同方法:
1. import java.awt.*;
2. import java.awt.event.*; 
3. public class MyFrame extends Frame{ 
4.     Button myButton;
5.     TextArea myTextArea;
6.     int count;; 
7. 
8.     public MyFrame(){
9.         super("Inner Class Frame");
10.     myButton = new Button("click me");
11.     myTextArea = new TextArea(); 
12.     add(myButton,BorderLayout,CENTER); 
13.     add(myTextArea,BorderLayout,NORTH);
14.     ButtonListener bList = new ButtonListener(); 
15.     myButton.addActionListener(bList); 
16. } 
17. class ButtonListener implements ActionListener{ 
18.   public void actionPerformed(ActionEvent e){ 
19.   count ++ 
20.     myTextArea.setText("button clicked" + {
21.         count + "times");
22.   }
23. }// end of innerclass ButtonListener
24. 
25. public static void main(String args[]){ 
26.   MyFrame f = new MyFrame();
27.   f.setSize(300,300);
28.   f.setVisible(true);
29. }
30. } // end of class MyFrame     前面的例子包含一个类MyFrame,它包括一个内部类ButtonListener。编译器生成一个类文件,MyFrame$ButtonListener.class以及toMyFrame.class。它包含在MyFrame.class中,是在类的外部创建的。6.14.2  如何做内部类工作?
    内部类可访问它们所嵌套的类的范围。所嵌套的类的成员的访问性是关键而且很有用。对嵌套类的范围的访问是可能的,因为内部类实际上有一个隐含的引用指向外部类上下文(如外部类“this”)。
1. public class MyFrame extends Frame{
2.     Button myButton;
3.     TextArea myTextarea;
4.     public MyFrame(){
5.       ......................
6.       ......................
7.       MyFrame$ButtonListener bList = new 
8.               MyFrame$ButtonListener(this); 
9.       myButton.addActionListener(bList); 
10.   }
11.   class MyFrame$ButtonListener implements 
12.   ActionListener{
13.   private MyFrame outerThis;
14.   Myframe$ButtonListener(MyFrame outerThisArg){ 
15.       outerThis = outerThisArg; 
16.   }
17.   
18.   public void actionPerformed(ActionEvent e) { 
19.   outerThis.MyTextArea.setText("buttonclicked"); 
20.   ......................
21.   ......................
22.   }
23.   public static void main(String args[]){
24.     MyFrame f = new MyFrame();
25.     f.setSize(300,300);
26.     f.setVisible(true);
27.   }
28. } 
    有时可能要从static方法或在没有this的某些其它情况下,创建一个内部类的一个实例(例如,main)。可以如下这么做:
public static void main(String args[]){
    MyFrame f = new MyFrame();
    MyFrame.ButtonListener bList =
          f.new ButtonListener(); 
    f.setSize(50,50);
    f.setVisible(true); 
}6.14.3  内部类属性内部类属性    类名称只能用在定义过的范围中,除非用限定的名称。    内部类的名称必须与所嵌套的类不同。    内部类可以被定义在方法中。    任何变量,不论是本地变量还是正式参数,如果变量被标记为final,那么,就可以被内部类中的方法访问。
    内部类有如下属性:
    类名称只能用在定义过的范围中,除非用在限定的名称中。内部类的名称必须与所嵌套的类不同。
    内部类可以被定义在方法中。这条规则较简单,它支配到所嵌套类方法的变量的访问。任何变量,不论是本地变量还是正式参数,如果变量被标记为final,那么,就可以被内部类中的方法访问。
内部类可以使用所嵌套类的类和实例变量以及所嵌套的块中的本地变量。
内部类可以被定义为abstract.
    属性
    只有内部类可以被声明为private或protected,以便防护它们不受来自外部类的访问。访问保护不阻止内部类使用其它类的任何成员,只要一个类嵌套另一个。
    一个内部类可以作为一个接口,由另一个内部类实现。
    被自动地声明为static的内部类成为顶层类。这些内部类失去了在本地范围和其它内部类中使用数据或变量的能力。
    内部类不能声明任何static成员;只有顶层类可以声明static成员。因此,一个需求static成员的内部类必须使用来自顶层类的成员。

解决方案 »

  1.   

    内部类
    除了在gui中作为一个整体封装以外还有别的用法吗
      

  2.   

    就好像C++中的结构类型和枚举类型,完全可以没有,但提供了灵活性。而java的内部类更强,可以有方法,又可以承继。
      

  3.   

    内部类一般是用在GUI中作为一个匿名内部类进行事件处理,其它的应用,就我个人的经历来看的话还没有。SL275中也是放在GUI的事件处理部分讲述的。