为什么编译非静态内部类会在父类上创建隐藏的,包可见的方法

时间:2018-12-19 09:01:57

标签: java inner-classes

想法说

  

报告非静态内部类。此类的编译会导致在父类上创建隐藏的,包可见的方法,这可能会损害安全性。

所以我想知道这是什么意思。

演示代码

public class TaiquShortV2 implements Serializable {
    private static final long serialVersionUID = 1L;

    class TaiquData implements Serializable {//IDEA report TqiquData Class
        private static final long serialVersionUID = 1L;

    }
}

2 个答案:

答案 0 :(得分:1)

我们必须区分源代码和JVM级别。

  • 在源代码级别,内部类Inner可以访问例如封闭类Enclosing的私有字段。

  • 在JVM级别上,没有内部类的概念:内部类只是一个具有特殊名称(通常包含$符号,例如Enclosing$Inner)的独立类,位于内部。与Enclosing类相同的软件包。与其他任何类一样,该Enclosing$Inner类无法访问Enclosing的私有字段。为了允许访问私有字段(根据源代码级别的要求),编译器扮演了一个骗局:它秘密地将getter和setter添加到字段中,而不使用合成名称(不是传统的getField()setField()名称) ),并让内部类使用这些访问方法代替直接字段访问。而且,由于两个类都在同一个包中,因此访问方法至少需要包可见性,这就是编译器创建它们的方式。

因此,这些方法使同一包中声明的任何其他类都可以访问Enclosing类的私有字段,从而打破了对私有字段的常规封装。

由您决定风险是否重要,因为在Java内部,还有其他可能性可以破坏访问规则。因此,从体系结构的角度来看,我个人总是很高兴在适当的地方创建内部类。

答案 1 :(得分:0)

内部类(非静态)与该类的任何其他属性或方法一样,它们可以访问其他成员。但是静态类没有此访问权限。 因此,可能是IDEA警告您,如果您不需要访问嵌套类中的其他成员,那么最好将其设置为静态。

请提供您的代码以对其进行更好的分析。

您还可以查看this thread