对于这个系列里的问题,
每个学
Java
的人都应该搞懂。
当然,
如果只是学
Java
玩玩就无所
谓了。如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行
列。
问题一:我声明了什么!
String s = Hello world!;
许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个
String
,
内容是“Hello
world!”。这样模糊的回答通常是概念不清的根源。如果要准确的回答,
一半的人大概会回答错误。
这个语句声明的是一个指向对象的引用,
名为“s”,
可以指向类型为
String
的任何对
象,目前指向
Hello world!
这个
String
类型的对象。这就是真正发生的事情。我们并没
有声明一个
String
对象,
我们只是声明了一个只能指向
String
对象的引用变量。
所以,
如
果在刚才那句语句后面,如果再运行一句:
String string = s;
我们是声明了另外一个只能指向
String
对象的引用,名为
string
,并没有第二个对象
产生,
string
还是指向原来那个对象,也就是,和
s
指向同一个对象。
问题二:
==
和
equals
方法究竟有什么区别?
==
操作符专门用来比较变量的值是否相等。比较好理解的一点是:
int a=10;
int b=10;
则
a==b
将是
true
。
但不好理解的地方是:
String a=new String(foo);
String b=new String(foo);
则
a==b
将返回
false
。
根据前一帖说过,
对象变量其实是一个引用,
它们的值是指向对象所在的内存地址,
而
不是对象本身。
a
和
b
都使用了
new
操作符,意味着将在内存中产生两个内容为
foo
的字符
串,既然是“两个”,它们自然位于不同的内存地址。
a
和
b
的值其实是两个不同的内存地
址的值,所以使用
==
操作符,结果会是
false
。诚然,
a
和
b
所指的对象,它们的内容都是
foo
,应该是“相等”,但是
==
操作符并不涉及到对象内容的比较。
对象内容的比较,正是
equals
方法做的事。
看一下
Object
对象的
equals
方法是如何实现的:
|
|