Java内部类之静态内部类(附详细代码示例)

    /** 先上概况:关于静态内部类的总结:
     * 1、静态内部类具有正常类的结构。
     * 2、静态内部类的方法只能访问外部类的static相关的信息,不能访问实例相关的信息。
     * 3、外部类只能访问内部类的static相关的信息,不能访问实例相关的信息。
     * 4、使用:外部类.内部类 引用=new 外部类.内部类(); 来生成内部类对象;
     * 5、利用引用.成员信息(属性、方法)调用(和正常一样的使用)。
     * 6、访问静态内部类的静态信息,直接外部类.内部类.静态信息 的方式。
     * 7、静态内部类可以独立存在,不依赖于其他外部类,类加载的时候同时加载内部类。
     */

 1 package cn.goktech.staticinner;
 2 
 3 public class OutClass {
 4     public static String outStaticField = "外部类static属性";
 5     public int outInstanceField = 1;
 6 
 7     
 8     static {
 9         System.out.println("外部类OutClass的静态代码块");
10     }
11     
12     /**
13      * 外部类的实例方法和static方法中: 
14      * 1、只能访问内部类的static相关的信息 
15      * 2、不可以访问内部类实例信息
16      * (理解:整个内部类已经是static,就是静态成员,和其他静态成员的访问规则一样)
17      */
18     public void outInstanceMethod() {
19 //        System.out.println(innerInstanceField);  //报错
20 //        innerInstanceMethod();  //报错
21         System.out.println(StaticInnerClass.innerStaticField); // 使用外部类名访问static属性
22         StaticInnerClass.innerStaticMethod();
23     }
24 
25     public static void outStaticMethod() {
26 //        System.out.println(innerInstanceField);
27 //        innerInstanceMethod();
28         System.out.println("在外部类的静态方法中访问内部类静态信息:" + StaticInnerClass.innerStaticField); // 使用外部类名访问static属性
29         StaticInnerClass.innerStaticMethod();
30     }
31 
32     static class StaticInnerClass { // 声明一个静态内部类
33         public static String innerStaticField = "内部类static属性";
34         public int innerInstanceField = 1;
35         
36         static {
37             System.out.println("内部类StaticInnerClass的静态代码块");
38         }
39 
40         /**
41          * 内部类的实例方法和static方法中:
42          *  1、只能访问外部类的static相关的信息 
43          *  2、不可以访问外部类实例信息
44          *  (理解:整个内部类已经是static,就是静态成员,和其他静态成员的访问规则一样)
45          */
46         public void innerInstanceMethod() {
47             System.out.println("在内部类中的实例方法中访问外部类static属性:" + outStaticField); // 可以访问外部static属性
48             OutClass.outStaticMethod(); // 可以访问外部static方法
49             // System.out.println(outInstanceField); //报错,不可以访问外部非静态成员
50         }
51 
52         public static void innerStaticMethod() {
53             System.out.println("在内部类中的静态方法中访问外部类static属性:" + outStaticField); // 可以访问外部static属性
54             //OutClass.outStaticMethod(); // 可以访问外部static方法,对重复调用所以暂时注释
55             // System.out.println(outInstanceField); //报错,不可以访问外部非静态成员
56         }
57     }
58     
59 }

编写一个测试类

 1 public class Test {
 2     public static void main(String[] args) {
 3         // 生成外部类对象,无法访问任何内部类信息
 4         OutClass out = new OutClass(); 
 5 
 6         // 外部类.内部类.内部静态方法
 7         OutClass.StaticInnerClass.innerStaticMethod(); 
 8         // 外部类.内部类.内部静态属性
 9         System.out.println(OutClass.StaticInnerClass.innerStaticField); 
10 
11         // 外部类.内部类 引用 = new 外部类.内部类();
12         OutClass.StaticInnerClass inner = new OutClass.StaticInnerClass();
13         System.out.println("通过内部类的实例访问“内部类的实例属性”:" + inner.innerInstanceField);
14     }
15 
16 }

输出结果简单展示:

 各路大神多多指教!欢迎评论!

 

posted @ 2019-10-17 15:58  Viking_牧马人  阅读(442)  评论(0)    收藏  举报