当前位置: 首页 > 面试题库 >

Java:私有内部类综合构造函数

澹台臻
2023-03-14
问题内容

我有Outerprivate Inner堂课。

在我的Outer类方法中,我实例化Inner该类,如下所示:

Outer outer = new Outer();
Inner inner = outer.new Inner();

编译器将此代码转换为:

Outer outer = new Outer();
Inner inner = new Inner(outer, null);

使用反射表明Inner该类具有以下综合的构造函数:

private Outer$Inner(Outer)
Outer$Inner(Outer,Outer$Inner)

由于Inner该类是private,因此编译器会将该private构造函数添加到该类中,因此没有人可以实例化该类。但是很明显,Outer该类应该能够实例化它,因此编译器添加了另一个包私有构造函数,后者又调用了私有构造函数。另外,由于package-
private构造函数$的名称中包含该名称,因此普通的Java代码无法调用它。

问题:为什么要综合一个私有和一个私有私有的构造函数?为什么不只合成package-private构造函数并完成呢?


问题答案:

如果您编写类似的代码,

public class Outer {
      private class Inner {}
}

您会注意到,只有一个构造函数 private Outer$Inner(Outer)

JLS的8.8.9节要求此构造函数,该规则规定,如果未定义构造函数,则必须生成默认构造函数,在这种情况下,默认构造函数必须为private,

在类类型中,如果将该类声明为public,则默认构造函数将隐式赋予访问修饰符public(第6.6节);如果该类被声明为受保护的,则默认构造函数将隐式给予访问修饰符保护(第6.6节);如果该类被声明为私有,则默认构造函数被隐式赋予访问修饰符私有(第6.6节);否则,默认构造函数具有无访问修饰符暗含的默认访问权限。

但是,当您使用如下代码实例化“内部内部”实例时,

public class Outer {
    private class Inner {}
        public String foo() {
            return new Inner().toString(); 
        }
}

编译器必须生成一个Outer可以合法调用的构造函数(您不能合法调用私有默认构造函数,因为它是私有的)。因此,编译器必须生成一个新的合成构造函数。根据JLS的13.1节,新的构造函数必须是合成的

除默认构造函数和类初始化方法外,编译器引入的任何在源代码中没有对应结构的构造都必须标记为合成。

此第二个构造函数在源代码中没有对应的构造,因此此新构造函数必须是合成的。由于JLS需要私有默认构造函数,因此仍必须生成第一个私有构造函数。



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

  • 我正在重构一个越来越大的android项目。运行lint使我能够在外部类和内部类之间访问JSME问题私有成员。考虑下面的例子 我得到消息了 应用问题解决方案会将源更改为 我现在有点困惑。直到现在,我还以为这个例子相当于 在这种情况下,我错了吗?还是这是棉绒的问题?

  • 问题内容: 我的代码中有内部类。我想授予对其实例的公共访问权限,但是只有外部类才可以创建此实例,就像在“私有”访问权限中一样。是否可以不做适当的小包装(或为每个这样的内部类创建公共接口)? (对不起,如果我的英语不好:P) 问题答案: 有可能的。将 内部类 声明为 public,但将其构造函数声明为private 。这样,您只能在封闭的类及其内部内部创建它,而不能从外部创建它。

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

  • 我有两个类:Date和Person Person有Date类的两个属性 案例1 类是与Person类分开的类。我有这段代码正常工作: 案例2:内部类(赋值要求) 我把作为Person的私有内部类 现在,上面的构造函数代码不再工作了。以下是错误消息: 说明资源路径位置类型由于某些中间构造函数调用人员,类型Person的封闭实例不可用。java/Wk03_Ch10_文件IO_Ch13_接口/Wk03_

  • 我试图理解为什么在谈到构造函数时,类成员的可访问性之间存在差异。 考虑下面的例子: 的私有成员作为私有成员,不应从访问。对于字段和方法,情况确实如此,但构造函数似乎没有遵循相同的规则。 从JLS-8(6.6.1.确定可访问性)中,我们可以阅读: [...] 引用类型的成员(类、接口、字段或方法)或类类型的构造函数只有在类型可访问且声明该成员或构造函数允许访问时才可访问: > [……] 否则,成员或