相关疑难解决方法(0)

Java内部类和静态嵌套类

Java中的内部类和静态嵌套类之间的主要区别是什么?设计/实施是否在选择其中一个方面发挥作用?

java inner-classes static-classes

1691
推荐指数
21
解决办法
70万
查看次数

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

我有Outer一个private Inner班级.

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

Outer outer = new Outer();
Inner inner = outer.new Inner();
Run Code Online (Sandbox Code Playgroud)

编译器将此代码转换为:

Outer outer = new Outer();
Inner inner = new Inner(outer, null);
Run Code Online (Sandbox Code Playgroud)

使用反射显示Inner该类具有以下合成构造函数:

private Outer$Inner(Outer)
Outer$Inner(Outer,Outer$Inner)
Run Code Online (Sandbox Code Playgroud)

由于Inner类是private,编译器将该private构造函数添加到它,因此没有人可以实例化该类.但显然Outer该类应该能够实例化它,因此编译器会添加其他包私有构造函数,后者又调用私有构造函数.此外,由于package-private构造函数$在其名称中具有该名称,因此普通Java代码无法调用它.

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

java inner-classes

16
推荐指数
1
解决办法
2461
查看次数

为什么lambda调用有2个堆栈帧?

以下代码:

public static void main(String[] args) {
    Collections.singleton(1).stream().forEach(i -> new Exception().printStackTrace());
}
Run Code Online (Sandbox Code Playgroud)

打印:

java.lang.Exception
    at PrintLambdaStackTrace.lambda$main$0(PrintLambdaStackTrace.java:6)
    at PrintLambdaStackTrace$$Lambda$1/1831932724.accept(Unknown Source)
    at java.util.Collections$2.tryAdvance(Collections.java:4717)
    at java.util.Collections$2.forEachRemaining(Collections.java:4725)
    at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
    at PrintLambdaStackTrace.main(PrintLambdaStackTrace.java:6)
Run Code Online (Sandbox Code Playgroud)

lambda调用是如何实现的?为什么有2个堆栈帧?

java lambda java-8

11
推荐指数
1
解决办法
179
查看次数

何时将静态嵌套类(以及其中的静态成员)加载到内存中?

在这里,我试图使用内部静态助手类为我的数据库连接实现单例类:

package com.myapp.modellayer;

public class DatabaseConnection {

    private DatabaseConnection() {
        //JDBC code...
    }

    private static class ConnectionHelper {
        // Instantiating the outer class
        private static final DatabaseConnection INSTANCE = new DatabaseConnection();
    }

    public static DatabaseConnection getInstance() {
        return ConnectionHelper.INSTANCE;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我怀疑这个静态内部类ConnectionHelper何时被加载到JVM内存中:

在加载DatabaseConnection类时,还是在调用getInstance()方法时?

java singleton static-members nested-class

10
推荐指数
2
解决办法
2433
查看次数