内部类即在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,且依附于外部类而存在。
内部类的访问规则:
(1)内部类可以直接访问外部类中的成员,包括私有。
(2)外部类需要访问内部类时,必须建立内部类对象。访问格式:外部类名.内部类名 变量名 = 外部类对象.内部类对象
内部类之所以可以直接访问外部类中的成员,是因为内部类中持有了外部类的引用。访问格式:外部类名.this。
例:
class Outer//外部类 { int num=3; class Inner//内部类 { void show() { System.out.println("Inner num="+num); } } void function() { Inner in =new Inner(); in.show(); } } class InnerClassDemo { public static void main(String[] args) { //Outer.out=new Outer();//内部类访问外部类中的成员 //out.function(); Outer.Inner in =new Outer().new Inner();//外部类访问内部类成员 in.show(); } }
当内部类被static修饰后,内部类只能直接访问外部类中的static成员,出现了访问局限。当内部类中定义了静态成员,该内部类也必须是静态的。当外部类中的静态方法访问内部类时,内部类也必须是静态的。当内部类定义在局部时,它不可以被成员修饰符修饰,但是内部类依然可以访问外部类类中的成员,因为内部类仍然持有外部类的引用,但是不可以访问它所在的局部变量,只能访问被final修饰的局部变量。
内部类分为成员内部类、静态嵌套类、方法内部类和匿名内部类。接下来我只介绍匿名内部类。
匿名内部类,顾名思义,没有名字的内部类。表面上看起来它们似乎有名字,实际那不是它们的名字。匿名内部类其实就是内部类的简写格式。对于匿名内部类,我们要注意以下几点:
(1)定义匿名内部类的前提:内部类必须是继承一个类或者实现接口。
(2)匿名内部类的定义格式:new 父类或者接口(){定义子类的内容}
(3)匿名内部类中定义的方法最好不要超过3个。
(4)匿名内部类不能定义任何静态成员、方法和类。
(5)匿名内部类不能有构造方法。
例:
interface Inter { void method(); } class Test { static Inter function() { return new Inter()//匿名内部类 { public void method() { System.out.println("method run!"); } }; } } class InnerClassTest { public static void main(String[] args) { //Test.function():Test类中有一个静态的方法function。 //.method():function这个方法运算后的结果是一个对象。 Test.function().method(); } }