大部分时候,类被定义成一个独立的单元,但在某些情况下,会把一个类放在另一个类的内部,这个在内部的类被称为内部类。内部类的作用:
① 提供了更好的封装。
② 内部类成员可以直接访问外部类的私有数据,因为内部类被当成外部类的成员;但外部类不能访问内部类的实现细节。
③ 匿名内部类适合用于创建那些仅需使用一次的类
在语法上,内外部类大致相同,但是内部类比外部类多了三个修饰符:static、private、protected。而且非静态内部类不可以有静态成员。
内部类可以被作为成员内部类定义,也可以被作为局部内部类定义(定义在方法中),大部分时候内部类都是被作为成员内部类定义。成员内部类是类成员,而局部和匿名内部类不是。
成员内部类分两种:
1.非静态内部类
在外部类中使用非静态内部类时,与平时使用普通类没有太大的区别。
* 当在非静态内部类的方法内访问某个变量时,系统优先在该方法内查找是否存在该名字的局部变量,存在则使用,不存在则到所在的内部类中查找是否存在该名字的成员变量,存在则使用,不存在则到外部类中查找。如果同名,则可通过this、外部类.this来区分。
根据静态成员不能访问非静态成员的规则,外部类的静态方法、静态代码块不能访问非静态内部类,包括不能使用非静态内部类创建实例等。总之,不允许在外部类的静态成员中直接使用非静态内部类。而且非静态内部类里不能有静态成员。
2.静态内部类
如果使用static来修饰内部类,则这个内部类就属于外部类本身,而不属于外部类的对象。
静态内部类可以包含静态成员,也可以包含非静态成员。根据静态成员不能访问非静态成员的规则,静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。即使是静态内部类的实例方法也不能访问外部类的实例成员。
外部类不能直接访问静态内部类的成员,但可以使用静态内部类的类名作为调用者来访问静态内部类的类成员,也可以使用静态内部类对象作为调用者来访问静态内部类的实例成员。
|
|