有时我们可以在另一个类中声明一个类,这种类型的类称为内部类。
语法:
class OuterClass{ class InnerClass{ } }
1.0版中引入的内部类概念可修复GUI错误。
如果没有机会存在另一种对象,那么如果没有现有的一种对象,那么我们应该去内部类。
示例
在此示例中,如果没有现有的手指类对象,那么就不会有现有的戒指类对象。
class Fingers{ class Ring{ } }
内部类是HAS-A关系(即,如果没有现有的外部类对象,那么就不会存在现有的内部类对象)。
当我们直接在另一个类中声明名称或标识符定义的类而不使用静态修饰符时,此类的类称为普通内部类。
当我们编译内部类时,将生成两个.class文件(外部类名.class和外部类名$inner-class-name)。
在内部类内部,我们不能声明任何静态变量或方法,包括main方法。
如果要从外部类的静态区域访问内部类方法,则应首先创建一个外部类对象(即,如果没有现有的外部类对象,则内部类对象可能不存在),然后才能访问内部类方法。
示例
class OuterClassStaticAccess{ class InnerClassStaticAccess{ public void innerClass(){ System.out.println("Welcome in inner class"); } } public static void main(String[] args){ OuterClassStaticAccess o = new OuterClassStaticAccess(); InnerClassStaticAccess i = o.new InnerClassStaticAccess(); i.innerClass(); } }
输出:
D:\Java Articles>java OuterClassStaticAccess Welcome in inner class
如果要从外部类的实例区域访问内部类方法,则还应该首先创建一个外部类对象(即,如果没有现有的外部类对象,则内部类对象可能不存在),然后才能访问内部类方法。
示例
class OuterClassInstanceAccess{ class InnerClassInstanceAccess{ public void innerClass(){ System.out.println("Welcome in inner class"); } } public void outerInstanceClass(){ InnerClassInstanceAccess i = new InnerClassInstanceAccess(); i.innerClass(); } public static void main(String[] args){ OuterClassInstanceAccess o = new OuterClassInstanceAccess(); o.outerInstanceClass(); } }
输出结果
D:\Java Articles>java OuterClassInstanceAccess Welcome in inner class
如果要从外部类的外部区域访问内部类方法,则还应该首先创建一个外部类对象(即,如果没有现有的外部类对象,则内部类对象可能不存在),然后才能访问内部类方法。
示例
class OuterOuterClassAccess{ class InnerClassAccess{ public void innerMethod(){ System.out.println("Welcome in inner class"); } } public void outerMethod(){ InnerClassAccess ica = new InnerClassAccess(); ica.innerMethod(); } } class Demo{ public static void main(String[] args){ OuterOuterClassAccess ooca = new OuterOuterClassAccess(); ooca.outerMethod(); } }
输出结果
D:\Java Articles>java Demo Welcome in inner class