package com.test;
public class OuterClass {
public class InnerClass {
public class InnerInnerClass {
}
}
public class InnerClass2 {
}
//this class should not exist in OuterClass after dummifying
private class PrivateInnerClass {
private String getString() {
return "hello PrivateInnerClass";
}
}
public String getStringFromPrivateInner() {
return new PrivateInnerClass().getString();
}
}
Run Code Online (Sandbox Code Playgroud)
当javac在命令行上运行时Sun JVM 1.6.0_20,此代码生成6个.class文件:
OuterClass.class
在OuterClass $ 1.class
在OuterClass $ InnerClass.class
在OuterClass $ InnerClass2.class
在OuterClass $ $将InnerClass InnerInnerClass.class
在OuterClass $ PrivateInnerClass.class
在eclipse中运行JDT时,它只生成5个类.
OuterClass.class
$在OuterClass 1.class …
出于好奇,为什么有时在编译后为类生成多个Java .class文件?例如,我的应用程序有六个类.对于一个类,总共生成了10个.class文件,从MyClass#1开始到MyClass#10.
AFAIK,Java中的隐式构造函数总是为没有构造函数的类生成[1],[2].
但在字节码中,我无法在JVMS上找到这样的限制.
所以:
根据JVMS来定义一个没有构造函数的类只有在下面的jasmin hello世界中使用它的静态方法是有效的吗?
除了无法创建它的实例之外还有其他任何后果吗?我将无法使用invokespecial初始化实例,new根据https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.10.2.4,这些实例无效(可以不使用未初始化的对象.
Jasmin代码:
.class public Main
.super java/lang/Object
.method public static main([Ljava/lang/String;)V
.limit stack 2
getstatic java/lang/System/out Ljava/io/PrintStream;
ldc "Hello World!"
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
return
.end method
Run Code Online (Sandbox Code Playgroud)
也就是说,没有构造函数:
.method public <init>()V
aload_0
invokenonvirtual java/lang/Object/<init>()V
return
.end method
Run Code Online (Sandbox Code Playgroud)
?
运行与java Main给出预期的输出Hello World!.
我检查了javap -v输出,与Java不同,jasmin没有生成默认构造函数.
我还试着打电话new Main();来看看会发生什么:
public class TestMain {
public static void main(String[] …Run Code Online (Sandbox Code Playgroud) 我使用的Eclipse MAT,试图在Android的跟踪资源泄漏(如果你改变屏幕方向很多),当我去柱状图来看,我看到我的活动与以$连连列出的相同活动一起上市在它之后.
所以喜欢:
com.test.TestActivity
com.test.TestActivity$1
com.test.TestActivity$2
com.test.TestActivity$3
Run Code Online (Sandbox Code Playgroud)
只是想知道$ 1,$ 2和$ 3意味着什么...
TIA.
我正在使用Mac 上的Sublime Text创建一个简单的文本编辑器程序,当我通过命令行编译时,它会生成6个.class文件.
我在终端中使用以下命令来编译我的类.
javac Notepad.java
控制台日志如下图所示......

有谁知道它为什么会产生多个.class文件?奇怪的是我可以删除它们然后使用java Notepad它仍然可以完美运行...为什么Java甚至会创建它们?我确定我做的事情很愚蠢.
这里是我的git存储库,而不是发布完整的代码.
java ×4
class ×2
android ×1
bytecode ×1
command-line ×1
constructor ×1
eclipse ×1
javac ×1
jvm ×1
memory-leaks ×1