一.示例类 package com.lala.effctivejava.test; public class OuterClass { public final static int IS_RECOMMOND = 1; public final static int IS_TOP_HOT = 1; //1.使用static可以声明一个内部类, 可以直接在外部调用 static class InnerStaticClass{ // 定义的内部类(静态) public final static int staticFiled = 1; public int noStaticFiled = 0; } //2.不使用statc声明一个内部类 ,使外部调用,需要创建对象调用 public class InnerNoStaticClass{ // 定义的内部类(非静态) public final static int staticFiled = 1; public int noStaticFiled = 0; } //3.在方法中定义内部类 ,通过方法达到外部调用内部类 private String info = "hello world" ; // 定义外部类的私有属性 public void fun(final int temp){ // 定义外部类的方法 class InnerMethodClass{ // 在方法中定义的内部类 public void print(){ // 定义内部类的方法 System.out.println("类中的属性:" + info) ; // 直接访问外部类的私有属性 System.out.println("方法中的参数:" + temp) ; } }; new InnerMethodClass().print() ; // 通过内部类的实例化对象调用方法 } } 二.测试类 package com.lala.effctivejava.test; public class Test { public static void main(String[] args) { //1.外部类调内部类的静态字段 int staticFiled = OuterClass.InnerStaticClass.staticFiled; System.out.println("InnerStaticClass.staticFiled:" + staticFiled); OuterClass.InnerStaticClass innerStaticClass = new OuterClass.InnerStaticClass(); System.out.println("InnerStaticClass.noStaticFiled:" + innerStaticClass.noStaticFiled); System.out.println("================================================="); //2.外部类调内部类的非静态字段 int staticFiled1 = OuterClass.InnerNoStaticClass.staticFiled; System.out.println("InnerNoStaticClass.staticFiled:" + staticFiled1); OuterClass outerClass = new OuterClass(); OuterClass.InnerNoStaticClass cg = outerClass.new InnerNoStaticClass(); int noStaticFiled = cg.noStaticFiled; System.out.println("InnerNoStaticClass.noStaticFiled:" + noStaticFiled); System.out.println("================================================="); //3.调用方法中定义的内部类 outerClass.fun(2); } }
运行结果:
InnerStaticClass.staticFiled:1
InnerStaticClass.noStaticFiled:0
=================================================
InnerNoStaticClass.staticFiled:1
InnerNoStaticClass.noStaticFiled:0
=================================================
类中的属性:hello world
方法中的参数:2
三.总结
1.内部类的静态成员都是可以直接调用;
2.内部类的非静态成员是要先创建内部类对象,然后对象去调用内部类的非静态成员.