关于java初始化的讨论 默认分类 随手记 no tag November 17, 2018 在CSDN论坛上看到的,一个帖子的回复 ### [cheuqoi](https://my.csdn.net/cheuqoi "cheuqoi")的回复 前几天我刚刚买了这本书《疯狂Java:突破程序员基本功的16课@李刚》,我看了前3章,感觉还是相当不错的。 尤其是第3章讲的HashMap、HashSet、TreeSet、TreeMap的实现细节,可以说非常透彻。 关于楼主提出的2点,我有点疑问 第一个说法是楼主自己想出来的?还是没记清?正好我手边有书,我把书上原话敲出来: 数组的初始化有两种方式: - 静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度。 - 动态初始化:初始化时程序员只指定数组长度,由系统为数组元素分配初始值。 我觉得这个总结很到位啊,不知道这有什么问题?楼主能说说吗? 书中的代码: ~~~java //采用静态初始化方式初始化第一个数组 String[] books = new String[] { "疯狂Java讲义", "轻量级Java EE企业应用实战", "疯狂Ajax讲义", "疯狂XML讲义" }; //采用静态初始化的简化形式初始化第二个数组 String[] names = { "孙悟空", "猪八戒", "白骨精" }; //采用动态初始化的语法初始化第三个数组 String[] strArr = new String[5]; ~~~ 与楼主的“所谓动态就是使用用new了”好像不是一回事?我仔细翻了书,好像没看到李刚书中有这句话啊。 感觉楼主是自己搞了错误的概念,然后自己“震精”自己啊! 至于楼主说的第二个问题, ~~~java String[] a = {"eee"}; String[] b = a;//这个b没有被初始化 ~~~ 就我个人觉得,这种方式我还真不觉得叫初始化! 比如我们初始化一个对象,是不是意味着重新分配内存,如果是对象,是不是要调用这个对象的初始化块、构造器进行初始化?但第二条代码还真没有这些过程!!它只是将一个引用指向另一个已经存在的数组。 例如我们这样写 ~~~ java Object obj1 = new Object(); Object obj2 = obj1; ~~~ 我觉得这里只初始化了一个Java对象!难道楼主认为这里初始化了几个对象? 再者!我要告诉楼主一个基本概念:对象(包括数组)才需要初始化! 当然,就我个人的感觉,这种概念性的东西其实没必要在名称上纠缠。 让我们来看看书中解释: 始终记住:**Java的数组变量是引用类型的变量,它并不是数组对象本身**,只要让数组变量指向有效的数组对象,程序中即可使用该数组变量。 ... 我们说对数组执行初始化,**其实并不是要对数组变量执行初始化,而是要对数组对象执行初始化**——也就是为该**数组对象分配一块内存空间**。虽然上面程序中的prices变量看似没有经过初始化,但执行prices = nums;就会让prices变量直接指向一个已经执行初始化的数组。 我觉得书中的说明其实很中允(注意文中用的是“看似”),恕我技术不行,我实在看不出这段解释有任何问题。 反倒是楼主,你所认为的String[] b = a;语句是初始化!我还真不觉得是初始化! 关于对象初始化,我想说下我的观点。 String\[\] a = {"test"}; String\[\] b = a; b 是经过初始化的。 ### [wakeUpDoNottLazy](https://my.csdn.net/wakeUpDoNottLazy "wakeUpDoNottLazy")的回复 原因:**所谓“初始化”是对“对象 ”而言,而不是对象的引用。** 那么 b 这个引用,所引用的对象是什么呢?无疑就是 “{"test"}” 这个数组。也就是说 b 所引用的对象在 String\[\] a = {"test"}; 时经历了初始化。 对象不初始化是不能使用的啊 我在初学 SSH 的时候看过李刚的一本书,怎么说呢。....不完美,但有所获。总体来说不敢恭维。 String\[\] a = {"test"}; 时经历了初始化。这点我完全同意啊。 我的意思是: String\[\] b = a; 这条代码。这里是否有经过初始化呢?你说之前就对数组对象初始化了,这也没错啊。 我想问: 这里到底初始化了几个对象? 只有一个吧! 我觉得**String\[\] b = a; 这条代码没有任何初始化动作吧?**\,它只是让一个引用变量指向另一个已有的对象,谈不上什么初始化吧!**要说初始化,也是由String\[\] a = {"test"}; 这条代码完成的!!与String\[\] b = a无关!!**.