12.3.4  静态内部类

在上一小节我们讨论了内部类,即在一个类中包含有另外一个或者多个类(见本书 12.3.3 小节)。与内部类相似,静态内部类指在一个类的内部包含有另外一个或者多个静态类。例如:

 

public class OuterClass { 
 
  
    ...
 
  
    static class StaticInnerClass1 {            // 
   内部静态类
 
  
        // 
   只可以访问 
   OuterClass 
   的静态成员
 
  
        ...
 
  
    }                                           //StaticInnerClass 
   结束
 
  
    ...                              
 
  
    static class StaticInnerClassN {            // 
   更多静态内部类
 
  
       // 
   只可以访问 
   OuterClass 
   的静态成员
 
  
       ...
 
  
    }                                           //StaticInnerClassN 
   结束
 
  
}  //OuterClass 
   结束

 

       与一般内部类不同,在静态代码中不能够使用 this 操作,所以在静态内部类中只可以访问外部类的静态变量和静态方法。使用静态内部类的目的和使用内部类相同。如果一个内部类不依赖于其外部类的实例变量,或与实例变量无关,则选择应用静态内部类。

如下例子演示怎样使用静态内部类:

 

/// 
   完整程序存在本书配套资源目录 
   Ch12 
   名为 
   StaticInnerClassTest.java
 
  
public class StaticInnerClassTest {
 
  
    public static void main( String args[] ) {
 
  
        OuterClass2 outer = new OuterClass2();
 
  
        OuterClass2.StaticInnerClass.innerMethod();                                                   // 
   调用静态内部类的静态方法
 
  
         OuterClass2.outerMethod();
 
  
        // 
   创建静态内部类对象
 
  
         OuterClass2.StaticInnerClass staticInner = new OuterClass2.StaticInnerClass();
 
  
         int num = staticInner.innerMethod2();   // 
   调用静态内部类实例方法
 
  
    }
 
  
}
 
  
class OuterClass2 {                             // 
   外部类
 
  
    private double x = 0.0;                     // 
   内部静态类不可以访问外部类实 
                                                  
   例变量
 
  
     static private int n = 10;                  // 
   外部类静态变量
 
  
     static void outerMethod() {                 // 
   外部类静态方法
 
  
        System.out.println("from OuterClass...");
 
  
    }
 
  
    void outerMethod2() {
 
  
        System.out.println("from OuterClass’ instance method2()...");
 
  
    }
 
  
     static class StaticInnerClass {             // 
   静态内部类
 
  
        static private int m = 5;               // 
   静态内部类静态变量
 
  
        static void innerMethod() {             // 
   静态内部类静态方法
 
  
            int sum;
 
  
            n = 20;                             // 
   只可以访问外部类静态变量
 
  
            sum = n + m;
 
  
            System.out.println("from InnerClass sum = " + sum);
 
  
            outerMethod();                      // 
   只可以调用外部类静态方法
 
  
        }
 
  
        int innerMethod2() {
 
  
            n = 100;
 
  
            outerMethod();
 
  
            System.out.println("from InnerMethod2() n = " + n);
 
  
            return n;
 
  
        }
 
  
    }       // 
   静态内部类结束
 
  
}           // 
   外部类结束

 

如同不用创建对象就可调用静态方法一样,上例静态内部类中的静态方法利用:

 

OuterClass2.StaticInnerClass.innerMethod(); // 
   静态内部类调用其静态方法

 

来调用。注意,可以在静态内部类的方法中,直接访问外部类的静态变量 n 和调用静态方法 outerMethod() 。但不允许访问外部类的实例变量 x 以及实例方法 outerMethod2() 。

       静态内部类中也可以提供实例方法,如:

 

 

static class StaticInnerClass {
 
  
        int innerMethod2() {
 
  
            n = 100;                        // 
   只可访问外部类静态变量
 
  
            outerMethod();                  // 
   只可调用外部类静态方法
 
  
            System.out.println("from InnerMethod2() n = " + n);
 
  
            return n;
 
  
        }
 
  
    }       // 
   静态内部类结束

 

       静态内部类的实例方法中亦只允许访问外部类的静态成员。

可以使用下列语法格式创建一个静态内部类对象并且调用其实例方法,以及静态方法:

 

OuterClass2.StaticInnerClass staticInner = new OuterClass2.StaticInner Class();                                 // 
   创建静态内部类对象
 
  
int num = staticInner.innerMethod2();       // 
   调用实例方法
 
  
staticInner.innerMethod();                  // 
   调用其静态方法

转载于:https://blog.51cto.com/yqgao/165373