内部类是面向对象(下)的最后一节,胜利就在眼前。
定义:在java中,可以将一个类定义在一个另一个类内部,则称为内部类。如果定义在一个方法的内部,则称为外部类。
一、实例内部类:未被static修饰。
(1):定义了一个Outclass类,并分别定义了三个整形变量,其中b用static修饰。然后给出了一个methodA方法,并将a赋值为10,打印a。再给出了一个静态方法methodB,然后打印b。
(2): 然后定义了一个实例内部类,然后定义了一个整形变量c。给出了一个methodIneer方法,将a赋值为100,b赋值为200,并先后调用methodA方法和methodB方法,之后将c赋值为300,然后打印c。
在实例内部类中可以直接访问外部类中:任意访问限定符修饰的成员。内部类没有定义变量a和b,所以这里是访问的外部类的a和b。
如果外部类和实例内部类中具有相同名称成员时,优先访问的是内部类自己的。这里的外部类和内部类都有c,优先访问内部类中的c。
如果要在实例内部类中访问外部类同名成员的时候,必须:外部类名称.this.同名成员名字。
(3):main方法中通过new关键字实例化了一个对象outClass,并分别访问变量a、b和c,并分别调用methodA方法和methodB方法。
然后创建了两个实例内部类对象innerClass1和innerClass2,并调用实例内部类中的methodInner方法。
【1】要访问实例内部类中成员,必须要创建实例内部类的对象。
【2】因为普通内部类定义与外部类成员定义位置相同,因此创建实例内部类对象时必须借助外部类。创建实例内部类对象时,必须先创建外部类对象。
【3】创建实例内部类对象:外部类.实例内部类 对象名 = new 外部类().new 实例内部类();
(4):输出结果:
外部类中成员变量a、b、c均未赋值,所以输出结果为0。
打印外部类中的methodA方法,输出结果为10。
打印外部类中的methodB方法,b仍然为未赋值,所以输出结果为0。
然后在实例内部类中调用methodA和methodB方法,分别打印10和200。
然后分别打印外部类和实例内部类中的变量c,分别输出300和400。
二、静态内部类:被static修饰的内部类。
(1):定义了一个外部类OutClass,分别定义了两个整形变量a和b,其中b用static修饰。给出了一个methodA方法,将a赋值为10,然后打印值a。再接着给出了一个methodB静态方法,用static修饰,打印值b。
接着定义了一个静态内部类InClass,用static修饰。接着给出了一个methodInner方法,在静态内部类中只能访问外部类的静态成员和静态方法。所以在静态内部类中给a赋值和调用methodA方法都会导致编译器报错。在静态内部类中给b赋值和调用methodB方法则可以正常运行。
(2):在main方法中创建了一个静态内部类对象inclass,然后调用methodInner方法,其实就是调用methodB方法。
创建静态内部类对象时,不需要先创建外部类对象。
(3): 输出结果:
在静态内部类中b被赋值为200,所以调用methodB方法,最终打印结果为200。
三、局部内部类:定义在方法体内部。
概念:定义在外部类的方法体或者{}中,该种内部类只能在其定义的位置使用,一般使用得比较少,简单了解即可。
定义了一个外部类OutClass,然后定义了一个整形变量a,赋值为10,再给出了一个method方法,将b赋值为10。再在method方法中定义了一个局部内部类InnerClass,再在局部内部类中定义了一个methodInnerClass方法,分别打印a和b。再创建了一个innerClass对象,然后调用methodInnerClass方法。
局部内部类:定义在方法体内部,不能被public、static等访问限定修饰符。且只能在该方法体内部使用,其他位置都不能用。