使用内部类
内部类一共有三种使用方法:
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(); } }
从上面的两个例子可以看出,在外部类以外的地方使用静态内部类和非静态内部类的语法差不多,不过,静态内部类只需使用外部类的类名即可,而非静态内部类必须时用外部类的实例对象来调用构造器。