[Java].java and .class,
[Java].java and .class,
今天在看《Java编程思想》第五章-隐藏实施过程时候,对有句话很迷惑。
原文是这样的:编译一个.java文件时,我们会获得一个名字完全相同的输出文件;但对于.java文件中的每个类,它们都有一个.class扩展名。
因此,我们最终从少量的.java文件里有可能获得数量众多的.class文件。
所以,关于这些我的个人理解是:一个.java文件会出现 >= 1 个的.class文件。所以很疑惑,查了下资料。
在stackflow中查找到了相关解释:https://stackoverflow.com/questions/1031962/multiple-class-files-generated-for-a-class。
给出了下面的Demo
class Foo {
class Bar { }
static class Baz { }
void run() {
Helper t = new Helper() {//这个是匿名内部类
int helpMethod() {
return 2;
}
};
}
}
上面代码的解释为:
These are for inner classes(非静态嵌套类,又称内部类) and static nested classes(静态嵌套类). The ones with numbers are anonymous inner classes.
This will produce class files Foo.class
, Foo$Bar.class
,Foo$Baz.class
and Foo$1.class
(for the implementation of theHelper
interface)。
看老外对代码的解释有点晕,然后查找了关于inner classes(内部类的资料):
https://www.cnblogs.com/lgk1002/p/6069784.html <--这里总结得比较全。
嵌套类分为静态嵌套类和非静态嵌套类。
静态嵌套类:使用很少。
非静态嵌套类:最重要是非静态嵌套类,又称为内部类。
内部类又分成三类:
1.在一个类(外部类)中直接定义的内部类;
2.在一个方法(外部类的方法)中定义的内部类;
3.匿名内部类。然后自己写了一个Demo编译了一下:
package innerclass;
//demo from https://stackoverflow.com/questions/1031962/multiple-class-files-generated-for-a-class
class Foo {
class Bar { }
static class Baz { }
int run() {
Object t = new Object() {
//new Object() {......} <-- 匿名内部类
//这里重写了Object的hashCode方法,原方法中的访问修饰符是public,所以这里必须为public
public int hashCode() {
return 2;
}
};
return t.hashCode();
}
public static void main(String[] args) {
Foo foo = new Foo();
System.out.println(foo.run());
}
}
在src同一级的bin目录下有:
除了Foo$1.class之外,其他3个还是比较清楚的,然后打开Foo$1.class看了下:
里面有innerclass/Foo$1 java/lang/Object
LocalVariableTable this Linnerclass/Foo$1; hashCode ()I 等字样,应该是给就是 new Object() {......} <-- 匿名内部类 的.class文件。
另外至于.java 与.class的关系就是:
.java为Java的源文件后缀,编写的代码需要写在.java文件中。
而.class是字节码文件,是.java源文件通过javac命令编译后生成的文件。
Java虚拟机就是去运行.class文件从而实现程序的运行。
负责加载Java class的这部分就叫做Class Loader
相关文章
- 暂无相关文章
用户点评