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