
本文共 1319 字,大约阅读时间需要 4 分钟。
HTML
内部类简介
内部类(inner class)是定义在另一个类中的类。通常有两种主要原因:
- 内部类可以对同一包内的其他类进行隐藏。
- 内部类方法可以访问定义它的外围类的所有数据,包括私有数据。
内部类对外围类的访问特点
内部类的对象总有一个隐式引用,指向创建它的外围类对象。这个引用在编译器才看的定义中增加。这意味着内部类的实例总能访问外围类的成员变量,也能调关于外围类的方法。
内部类构造器的特殊情况
外围类的引用在构造内部类实例时会被传为参数。编译器会自动修改内部类的构造器,添加这个引用。外围类引用在源代码中表示为OuterClass.this,或者在构造内部类时可有参数形式,如outerObject.new InnerClass(parameters)。
内部类的编译规则
外围类的引用可以通过OuterClass.this表示。此外,为了更清晰地编写构造器,可以采用outerObject.new InnerClass(construction parameters)的形式。在外围类的代码中,内部类要被使用的方式为OuterClass.InnerClass。
关于内部类的限制
需要注意的是,内部类中定义的所有静态字段都必须是final值,并且初始化为编译常量。此外,内部类不能声明静态方法。
内部类的使用场景与安全性
内部类实际上只是一个编译器生成的特殊元数据,编译器将其转换为常规的类文件。例如,外围类中会额外添加一个实例字段this$0,用于存储外围类的引用。为了访问这些字段,编译器在外围类中添加了一个名为access$0的静态方法,返回这种额外的引用。
安全隐患与防范措施
这种设计带来了一个潜在的安全风险:通过调用这些合成方法,攻击者可以窃取外围类的私有字段。因此,这些方法名可能不可见,但通过类文件编辑,专业人员可以利用虚拟机的指令执行攻击。因此,内部类的访问方式必须谨慎处理。
局部内部类的应用场景
如果一个类只需要在特定方法中短暂使用,可以在该方法内部定义局部内部类。这种局部类的作用域仅限于其定义所在的块,它们甚至可以被外围类中的其他代码访问。另外,局部类不需要有访问说明符,而且它的所有变量都必须是final,只能在构造器中进行初始化。
通过局部变量访问内部类
局部内部类不仅可以访问外围类的字段,还可以访问局部变量。然而,这些变量必须是实例变量,并且只能在构造器中被初始化。编译器会为每个局部变量创建相应的实例字段,并在构造器中将它们复制进去,以确保访问的一致性。
匿名内部类(Anonymous Inner Class)的特点
有时,只需创建一个内部类的实例,即可完成任务,而不需要为类命名。这样的内部类名可以是匿名的。匿名内部类不能有构造器,但可以通过初始化块来提供对象初始化逻辑。
静态内部类(Static Inner Class)的优势
使用静态内部类提高了安全性。静态内部类不需要持有外围类对象的引用,可以在外围类中自由访问。它们可以有静态字段和方法,且无法访问外围类的非静态成员。如果不需要访问外围类对象的行为,可以考虑使用静态内部类,这样可以最大限度地隐藏类的内容,同时优化性能。
发表评论
最新留言
关于作者
