java学习——内部类(二)

时间:2022-02-05 15:28:33

使用内部类

内部类一共有三种使用方法:

1.在外部类中使用内部类

      在外部类中使用内部类,与平常使用内部类没有区别,可以直接通过内部类的类名来定义变量,通过new调用内部类的构造方法来创建实例。

      唯一的区别是,不要再外部类的静态成员中使用非静态内部类,因为静态成员是不能访问非静态成员的。

2.在外部类以外使用非静态内部类

  如果希望再外部类以外使用内部类(包括静态内部类和非静态内部类),则内部类不能使用private来修饰,private修饰的内部类只能再外部类内部使用。对于其他修饰符的内部类,则只能控制符对应的访问限权中使用

       *省略修饰符的内部类,只能被与外部类同一包中的类使用。

  *使用protected的内部类,只能被与外部类处于同一包中的类和外部类的子类访问。

  *使用public修饰的内部类,可以在任何地方使用。

  语法(包括静态和非静态)

   OutClass.InnerClass varName

  在外部类以外使用内部类是,完整的类名应该是OutClass.InnerClass。如果外部类前面还有包的话,则应该增加包名。

package cn.it.demo01;

class Out {
    // 定义一个内部类,不使用访问修饰符
    class In {
        public In(String msg) {
            System.out.println(msg);
        }
    }
}

public class CreateInnerInstance {
    public static void main(String[] args) {
        Out.In in = new Out().new In("测试信息");

        /*
         * 以上代码可改为如下三行代码 Out out=new Out(); Out.In in; in=out.new In("测试信息");
         */
    }
}

注意:如果需要在外部类以外的地方使用非静态内部类,非静态内部类的构造器必须使用外部类 的实例对象来调用。

3.在外部类以外使用静态内部类

  因为静态内部类是外部类相关的,因此创建静态内部类对象时无需创建外部类对象,在外部类以外的地方使用创建静态内部类实例的语法如下:

  new OuterClass.InnerConstrutor()

package cn.it.demo01;

class StaticOut {
    // 定义一个静态内部类
    // 既同一个包中的类才能访问此静态内部类
    static class StaticIn {
        public StaticIn() {
            System.out.println("静态内部类的构造器");
        }
    }
}

public class CreateStaticInnerstance {
    public static void main(String[] args) {
        StaticOut.StaticIn in = new StaticOut.StaticIn();
    }

}

  从上面的两个例子可以看出,在外部类以外的地方使用静态内部类和非静态内部类的语法差不多,不过,静态内部类只需使用外部类的类名即可,而非静态内部类必须时用外部类的实例对象来调用构造器。