A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wuchangfeng 中级黑马   /  2015-7-16 09:22  /  368 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

对于这个系列里的问题,

每个学

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

方法是如何实现的:

3 个回复

倒序浏览
你为什么几个字一行的写,,,
回复 使用道具 举报
帅帅loyal 发表于 2015-7-16 09:24
你为什么几个字一行的写,,,

估计编译器出毛病了。。。
回复 使用道具 举报
dragonsoull 发表于 2015-7-16 10:45
估计编译器出毛病了。。。

嗯 是的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马