黑马程序员技术交流社区

标题: 关于单例初始化 [打印本页]

作者: amen0205    时间: 2013-3-6 21:57
标题: 关于单例初始化
本帖最后由 门文通 于 2013-3-8 03:29 编辑
  1. 单例:略

  2. class Demo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 Single s=Single.getInstence();
  7.                 //System.out.println("Hello World!");
  8.         }
  9. }
复制代码
上述代码中 把Single类加载进内存是在编译时还是运行时?  那对象初始化过程的那些步骤是发生在编译时期的?
作者: 张豪杰    时间: 2013-3-6 23:21
楼主你搞错了~~~
编译,实际上可以看成是一个翻译的过程。
我们用的java语言,还有c语言,c++等,实际上是方便我们和计算机才创造出来的程序语言,这仅仅是出于方便我们人类学习和认识而已
但是对于计算机,根本不认识这些语句,计算机只能识别:1010100011000这些二进制数据,所以就用到了编译器,它的作用就像是个翻译官,把我们写的程序,翻译成jvm可以识别的文件(字节码文件即.class文件)
我们写的java程序,通过java编译器进行编译,生成字节码文件,这个文件里的内容,只有jvm可以识别,然后jvm会调用类加载器加载进内存中,然后通过执行引擎根据自己所处的环境(操作系统)运行程序。

整个编译阶段,都没有触及到内存分配,仅仅是检查语法和生成字节码文件而已。所以像对象初始化这些过程,都是在运行时期进行的!
用代码举个例子
class Demo{
   public static void main(String[] args){
       int[] a = new int[0];//定义一个长度为0的数组
       System.out.println(a[0]);//输出第1个元素,这里编译不会报错,运行出错
}
}

上面的代码,编译时期是没问题的,但是运行时期就报ArrayIndexOutOfBoundsException了。这就说明,在编译阶段,根本没有为int[] a分配内存空间,因为没必要,它只是先检测语法,语法没问题后才生成字节码文件。
但是运行时期就确确实实分配了内存地址了,所以一运行就出错
以上是个人理解,如果有什么疏漏,还请大神更正
作者: wahaha    时间: 2013-3-7 00:21
本帖最后由 夏添 于 2013-3-7 00:24 编辑

简单明了的回答哈,写多了,估计哥们都懒得看
你这代码应该是单例的一部分是吧,我觉得你混淆了一些概念.

1.编译期,虚拟机只是把源代码(.java)文件编译成字节码(.class)文件,跟内存没什么关系(我指的是java虚拟机内存,不谈芯片级别和计算机系统底层的内存);
2.在运行期,才谈论内存的问题;
3.函数和变量先进内存的方法区-->方法进栈-->有对象产生(直接new 对象或调用产生对象的方法)在堆区产生对象,本例中,具体指你的single s

大致是这样,敬请指正补充~~~


作者: amen0205    时间: 2013-3-8 03:28
张豪杰 发表于 2013-3-6 23:21
楼主你搞错了~~~
编译,实际上可以看成是一个翻译的过程。
我们用的java语言,还有c语言,c++等,实际上是 ...

谢谢  知道了  对象初始化过程都是运行时的事  就OK了 呵呵
作者: amen0205    时间: 2013-3-8 03:28
夏添 发表于 2013-3-7 00:21
简单明了的回答哈,写多了,估计哥们都懒得看
你这代码应该是单例的一部分是吧,我觉得你混淆了一些概念.

明白了 OK




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2