关于String a = new String("b") 的精确解析 (精)
String a = new String("b"); 到底是几个对象呢?
我的答案: 只有一个对象!
帖子中回答两个的居多; 而且在baidu google上搜索居然也是回答两个的居多!
大部分认为: 一个是new String()出来的; 一个是"b";
我学java以来,不断的提醒自己 对象是new new new new !~ 不new 哪里来的对象呢?.
我将自己的观点剖析给大家, 如果我的观点错误了,请大家给予反驳:
很多人认为"b";是一个对象; 那要从String 这个类说起了!~
String 是个引用类型, 引用类型是以对象的形式存在;这句话确实不假!
可是大家已经发现了 new String () 和"b" 没有放在同一个位置; 一个放在堆中; 一个放在池中!
大家认为正常吗?. 对象是可以随便放的吗?. 说到这里可能有人反驳:那又怎么样!~ 以后还要把对象放在栈中!
(有人反驳观点的时候竟然把基础数据类型也当成对象来说!详在后面!)
这样一来, 大家乱放,我们怎么控制其位置啊?.
我们要看清楚String池; 它是一个固定的!~ 我们可以从里面取值; 却无法改变它!如果你说那里面的全是对象,
那我倒想问问那里面有多少对象?. 难道要说不计其数的对象?.说到这里可能有人会说:你的抽象思维有待提高啊!
有String池 是不是还有Integer池 是不是还有Boolean池 等等;; 我不信它把对象一个一个都给你创建好了?.
创建对象---就是用java提供的new关键字为对象分配存储空间; 这样的对象全部都在heap中; 这样的对象才可以称得为java中的对象;
而字符串常量是放在dataSegment中; 方法体也放在这里; 为什么非要将一个字符串常量规定说明为一个对象呢?. 既然是那样!
那还规定常量做什么?. 规定变量做什么?. 人们大肆想象!~ 甚至我可以说对象是个永远不存在的东西算了!~我们在面临逻辑思维思考时是有条件的!~难道你没有学过离散数学的命题逻辑吗?. 在一定的条件下进行推理!
说到这里,先将有人将基础数据类型想象成对象的问题说明一下:
他的反驳观点是这样的:
Object o = 5;//可行
5,是一个int类型的常量 却变成了一个Object对象; 难道你不认为这个int类型常量也是一个对象吗?.
基础数据类型更不可能成为一个对象了!~ 不信你去instanceof一下!~
一个是引用类型; 一个是基础数据类型; 连类型都不相同; 怎么可能会是一个对象?.
说到这里有人可能疑惑了; 那上面可行啊!~你这不是胡说吗?. 那要看它里面的运行过程了!~
我们都知道java将基础数据类型全都给了包装类!目的就是为了实现基础数据类型与引用类型之间的交换!
说到交换, 大家看下面的一组例子:
int i1 = 5;
Object o = 5;
Integer i2 = 5;
Integer i3 = new Integer(5);
Integer i4 = new Integer(5);
i1 == i2; i1 == i3; i1 == i4; i1 == o; i2 == o;//true
i2 != i3 i3 != i4 o != i4;//true
从上面可以看出 o已经变成了一个Integer类型的 Object类型 对象;
这里全是引用类型!~ Integer 不是基础类型, 而是引用类型;
但是5只是一个int类型的常量, 不管你声明的是什么?...