当前位置: 首页 > 知识库问答 >
问题:

私有内部类的构造函数也是私有的吗?

傅泉
2023-03-14

我正在重构一个越来越大的android项目。运行lint使我能够在外部类和内部类之间访问JSME问题私有成员。考虑下面的例子

public class Outer {
    private Inner mInner = new Inner();

    private class Inner {}
}

我得到消息了

Name
   private field Inner mInner

Location
   class Outer (default package)

Problem synopsis
   Access to private member of class 'Inner' at line 2

Problem resolution
   Make 'Inner' constructor package-local

应用问题解决方案会将源更改为

public class Outer {
    private Inner mInner = new Inner();

    private class Inner {
        Inner() {}
    }
}

我现在有点困惑。直到现在,我还以为这个例子相当于

public class Outer {
    private Inner mInner = new Inner();

    private class Inner {
        public Inner() {}
    }
}

在这种情况下,我错了吗?还是这是棉绒的问题?

共有2个答案

金承嗣
2023-03-14

您的理解是错误的,但是linter并不是特别清楚,而且建议可能与Android(不是J2ME)无关。

正如David所解释的,内部类的隐式默认构造函数与类本身具有相同的访问修饰符,但是私有成员可以在相同的编译单元(Java文件)中访问。没有语言理由避免使用私有构造函数

但是,在内部,由于类被编译成单独的输出文件,编译器必须创建合成适配器方法,以便为类提供对私有成员的访问。这些方法在运行时的缺点与桌面应用程序无关,但对于像J2ME这样局促的应用程序来说,通过使成员可以直接访问(使用包范围)来消除这种差异可能是值得的。

Android对类文件执行重要的后处理,并且Android设备不像J2ME设备那样受到限制。除非您正在编写针对这两种平台的代码,否则我将更改lint配置。

阙新觉
2023-03-14

Java语言规范第8.8.9节“默认构造函数”中说:

在类类型中,如果该类被声明为public,则默认构造函数被隐式地赋予访问修饰符public(§6.6);如果该类被声明为受保护,则默认构造函数隐式地被赋予访问修饰符protected(§6.6);如果类被声明为private,则默认构造函数被隐式地赋予访问修饰符private(§6.6);否则,默认构造函数具有由无访问修饰符暗示的默认访问权限。

 类似资料:
  • 问题内容: 我有一堂课。 在我的类方法中,我实例化该类,如下所示: 编译器将此代码转换为: 使用反射表明该类具有以下综合的构造函数: 由于该类是,因此编译器会将该构造函数添加到该类中,因此没有人可以实例化该类。但是很明显,该类应该能够实例化它,因此编译器添加了另一个包私有构造函数,后者又调用了私有构造函数。另外,由于package- private构造函数的名称中包含该名称,因此普通的Java代码

  • 问题内容: 警告#1:实际上这是一个潜在的两部分:首先,私有内部类的构造函数是否具有形式参数?如果是,为什么JLS拒绝呢?如果没有,怎么/为什么不呢? 注意事项2: 此问题不用于推测。 我仅在寻找 权威 答案。 默认构造函数在JLS 8.8.9 中定义,该声明(部分说明): 除了在 非私有 内部成员类中之外,默认构造函数没有形式参数,在默认情况下,默认构造函数隐式声明一个表示该类的立即封闭实例的形

  • 我有一个类,它有一个类。 在我的类方法中,我按如下方式实例化类: 编译器将此代码转换为: 使用反射显示类具有以下合成构造函数: 由于类是,编译器向其添加构造函数,因此没有人可以实例化该类。但是显然,类应该能够实例化它,因此编译器添加了另一个包私有构造函数,该构造函数反过来调用私有构造函数。另外,由于包私有构造函数的名称中有,所以普通Java代码不能调用它。 问题:为什么要合成一个私有构造函数和一个

  • 问题内容: 在Java中,在抽象类中使用私有构造函数的目的是什么? 在一个评论中,我得到了这个问题,我很好奇,在什么情况下我们需要以这种方式使用构造函数? 我认为它可以与抽象类中的另一个构造函数一起使用,但这非常简单。它也可以用于构造将超过抽象类的静态内部类。 也许还有更优雅的用法? 问题答案: 如果构造函数是类的 唯一 构造函数,则原因很明确:防止子类化。一些类仅充当静态字段/方法的持有者,而不

  • 我有一个java类,它只有静态方法和字段,所以我不想为此创建任何对象。我可以从两个方面来理解, 创建类摘要 使用私有构造函数。 这两种方法哪一种更好?

  • 问题内容: 构造函数可以是私有的吗?私有构造函数有何用处? 问题答案: 是的,构造函数可以是私有的。这有不同的用途。一个这样的用途是用于singleton设计反模式,我建议您不要使用它。另一个更合法的用法是委托构造函数;您可以有一个构造函数,它接受许多不同的选项,这实际上是一个实现细节,所以您将其设为私有,但剩余的构造函数将其委托给它。 作为委托构造函数的一个例子,下面的类允许您保存一个值和一个类