内部类
定义在类中的类,体现了一种代码的隐藏机制和访问控制机制,内部类与外部类有一定的关系,往往只有该外部类调用此内部类,所以没必要专门用一个Java文件存放内部类
- 内部类被
private
关键字修饰,代表该内部类只对它的外部类可见- 内部类被
public
关键字修饰,那么可以被其他外部类使用,但必须经由它的外部类来实例化内部类对象- 内部类包含一个对外部类的this指针,从而可以访问外部类的所有属性和方法,包括
private属性和方法
- 同样的,外部类对内部类所有元素具有访问权
分类
- 成员内部类:
- 若一个类定义在另一个类的内部作为实例成员,这样的类称之为成员内部类
- 在成员内部类的里面可以无条件的访问外部类的任何成员(包括
private成员和静态成员
)- 在外部类中访问成员内部类的成员,必须要通过内部类的对象才能访问,而不能直接访问
- 当内部类拥有和外部类相同的成员或方法时,会发生隐藏现象,默认情况下访问的是内部类的成员或方法,如果要访问外部类的同名成员,需要显示的通过
外部类.this.成员变量(方法)
- 局部内部类:
- 局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。局部内部类同局部变量一样,不能加任何访问修饰符,在其作用域外不能被访问
- 匿名内部类:
- 匿名内部类通过父类类名加上子类类体new出子类对象,减少了单独定义子类的环节
- 匿名内部类没有构造方法,大部分匿名内部类用于接口回调
- 静态内部类:
- 静态内部类也是定义在另一个类里面的类,只是被static关键字修饰
- 静态内部类是不需要依赖于外部类的,它不持有指向外部类对象的引用
this
,并且它不能使用外部类的非static
成员或方法- 创建静态内部类对象,不需要通过外部类对象创建
- 作为类的静态成员它只能访问外部类的静态成员 ,而不能访问外部类的实例成员
- 外部类中也不能直接访问静态内部类成员,必须要通过内部类的对象才能访问
- 若外部类访问的是静态内部类的静态成员,则可以通过类名来完成,就无需创建静态内部类对象
为什么使用内部类
内部类一般只为其外部类使用;内部类提供了某种进入外部类的窗户;每个内部类都能独立地继承一个类,而无论外部类是否已经继承了某个类。因此,内部类使多重继承的解决方案变得更加完整。
内部类与静态内部类的区别:
- 静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。
- 静态内部类只能够访问外部类的静态成员,而非静态内部类则可以访问外部类的所有成员(方法,属性)。
- 实例化一个非静态的内部类的方法:
- 先生成一个外部类对象实例 OutClassTest oc1 = new OutClassTest();
- 通过外部类的对象实例生成内部类对象 OutClassTest.InnerClass no_static_inner = oc1.new InnerClass();
- 实例化一个静态内部类的方法:
- 不依赖于外部类的实例,直接实例化内部类对象 OutClassTest.InnerStaticClass inner = new OutClassTest.InnerStaticClass();
- 调用内部静态类的方法或静态变量,通过类名直接调用 OutClassTest.InnerStaticClass.static_value OutClassTest.InnerStaticClass.getMessage()