[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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值