内部类的详细描述
(1).概述:在一个类的内部定义的另一个类,内部类的主要作用是将逻辑上相关联的类放到一起。类体内部的类为内部类,包含内部类的类为外部类。内部类几乎可以处于一个类内部任何位置,可以与实例变量处于同一级,或处于方法之内,甚至是一个表达式的一部分。
(2)、内部类定义上可分为三类:
1.在外部类中直接定义的内部类,与外部类成员处于同一级;
2.在一个外部类的方法中定义的内部类;
3.匿名内部类。
(3)、表现形式上分为:
⒈成员内部类
⒉静态内部类
⒊局部内部类
⒋匿名内部类
(4)、访问注意事项:
1.内部类可以直接访问外部类的字段和方法。
2.外部类访问内部类成员需要通过其对象来访问。
3.可以相互访问其私有的成员(注意)
例1:
编译结果:
编译器生"外部类$内部类.class"文件
1.成员内部类
(1)、在其它类中(非外部类)创建成员内部类对象
格式:外部类名.内部类名 对象名 = 外部类对象.new 内部类名();
OuterClass.InnerClassA inner = out.new InnerClassA();
例2:
编译结果:
注意:
new InnerClass().val
等价于
InnerClass inner = new InnerClass();
inner.val;
2.静态内部类
(1)、用static修饰的内部类就是静态内部类。静态内部类能直接访问外部类的静态成员,而只能通过外部类的对象访问外部类的实例成员。
(2)、在其它类(非外部类)中创建静态内部类对象
格式:外部类名.内部类名 对象名 = new 外部类对象.内部类名();
OuterClass.InnerStaticClass a = new OuterClass.InnerStaticClass();
例3:
编译结果:
3.局部内部类
概述:定义在方法中的类称之为内部类。类名不能被private、protected、public、static等修饰,但可以被final或abstract修饰,且访问权限仅局限在方法中。
注意:局部内部类只能访问被定义为final或static的外部变量。
例4:
编译结果:
4.匿名内部类
概述:定义在类和方法中,不取名字的类,在定义类的同时又new一个对象的类称之为匿名类。
特点:1.不取类名,直接用父类的名字或所实现接口的名字。
2.类名前面不能有修饰符。
3.类中不能定义构造方法,因为它没有名字。在构造对象时,使用父类的构造方法。
如果实现接口,则接口后的圆括号中不能带参数。
格式:
new 类名或接口名(){…}
例5:
编译结果: