该当理解的Java底子知识[Java编程]
本文“该当理解的Java底子知识[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
关于这个系列里的问题,每个学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办法是若何实现的:
boolean equals(Object o){
return this==o;
}
Object对象默许利用了==操作符.所以假如你自创的类没有覆盖equals办法,那你的类利用equals和利用==会得到一样的后果.一样也可以看出,Object的equals办法没有到达equals办法应当到达的目标:对比两个对象内容能否相等.因为答案应当由类的成立者决意,所以Object把这个任务留给了类的成立者.
看一下一个极度的类:
Class Monster{
private String content;
...
boolean equals(Object another){ return true;}
}
我覆盖了equals办法.这个实现会招致无论Monster实例内容若何,它们之间的对比永久返回true.
所以当你是用equals办法判断对象的内容能否相等,请不要想当然.因为大概你认为相等,而这个类的作者不这样认为,而类的equals办法的实现是由他掌握的.假如你需求利用equals办法,大概利用任何基于散列码的调集(HashSet,HashMap,HashTable),请察看一下java doc以确认这个类的equals逻辑是若何实现的.
以上是“该当理解的Java底子知识[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |