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构造函数并完成呢?
以下代码:
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个堆栈帧?
在这里,我试图使用内部静态助手类为我的数据库连接实现单例类:
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()方法时?