闂傚倸鍊搁崐鎼佸磹閹间礁纾圭€瑰嫭鍣磋ぐ鎺戠倞妞ゆ巻鍋撴潻婵嬫⒑闁偛鑻晶鎾煛鐏炲墽銆掗柍褜鍓ㄧ紞鍡涘磻閸涱厾鏆︾€光偓閸曨剛鍘搁悗鍏夊亾闁逞屽墴瀹曚即寮介婧惧亾娴g硶妲堟俊顖氬槻閻楁岸姊洪崨濠傚闁稿鎸歌濠㈣泛顑勭换鍡涙煟閹板吀绨婚柍褜鍓氶崹鍨暦閺囩喓绡€婵﹩鍓涢鍡涙⒑鐠恒劌娅愰柟鍑ゆ嫹 (0) +1 闂傚倸鍊搁崐鎼佸磹瀹勬噴褰掑炊瑜忛弳锕傛煕椤垵浜濋柛娆忕箳閳ь剙绠嶉崕閬嶅箯鐎n喖瑙﹂悗锝庡枟閻撴洟鏌嶉埡浣告灓婵炲牄鍨归湁缁绢參鏀辩€氾拷 (0) +1 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻鎾闁稿鍨块幃妤€鈽夊▎瀣窗濡炪倐鏅滈悡锟犲蓟閿濆绠i柨婵嗘-濡嫮绱撴担鍝勵€岄柛銊ョ埣瀵濡搁埡鍌氫簽闂佺ǹ鏈粙鎴︻敂閿燂拷 (0) +1
闂傚倸鍊搁崐鎼佸磹閹间礁纾圭€瑰嫭鍣磋ぐ鎺戠倞妞ゆ巻鍋撴潻婵嬫⒑闁偛鑻晶鎾煛鐏炲墽銆掗柍褜鍓ㄧ紞鍡涘磻閸涱厾鏆︾€光偓閸曨剛鍘搁悗鍏夊亾闁逞屽墴瀹曚即寮介婧惧亾娴g硶妲堟俊顖氬槻閻楁岸姊洪崨濠傚闁稿鎸歌濠㈣泛顑勭换鍡涙煟閹板吀绨婚柍褜鍓氶崹鍨暦閺囥垹钃熼柕澶堝劚閻庮參姊虹粔鍡楀濞堟棃鏌﹂崘顏勬灈闁哄矉缍佸顕€宕堕妷銏犱壕闁逞屽墴閺屾稓鈧綆鍋呯亸顓㈡煃閽樺妲搁柍璇茬Ч椤㈡ǹ顦辩紒銊ャ偢閺岀喐绗熼崹顔碱潎閻庤娲橀崕濂杆囬鈧弻锟犲焵椤掑嫭鍤嶉柕澶涚导缁ㄥ姊洪崫鍕窛闁稿鍋よ棢闁绘劗鍎ら崐鍨叏濡厧浜鹃悗姘炬嫹闂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣捣閻棗銆掑锝呬壕濡ょ姷鍋為悧鐘汇€侀弴銏犖ч柛鈩冦仦缁剝淇婇悙顏勨偓鏍礉瑜忕划濠氬箣閻樺樊妫滈梺绉嗗嫷娈曢柣鎾存礋閺岀喖鏌囬敃鈧悘閬嶆煕閵堝拋鍎旈柡灞诲€濆鍫曞箰鎼粹€叉樊闂備礁鎼張顒傜矙閹达箑鐓″璺号堥弸搴ㄦ煙闁箑鏋ら柍璇茬箳缁辨捇宕掑顑藉亾妞嬪孩濯奸柡灞诲劚閻ら箖鏌eΟ娆惧殭闁藉啰鍠栭弻锝夊籍閸屾瀚涢梺杞扮缁夌數鎹㈠┑鍥╃瘈闁稿本纰嶉悘鎾绘⒑閸濆嫭锛嶉柛妯恒偢閳ユ棃宕橀鍢壯囨煕閹扳晛濡煎┑顔惧厴濮婃椽鎮烽弶鎸庮唨闂佺懓鍤栭幏锟�>>

正在阅读:每个Java初学者都应该搞懂的六个问题每个Java初学者都应该搞懂的六个问题

2006-07-19 09:27 出处: 作者:雷少 责任编辑:xietaoming

  对于这个系列里的问题,每个学Java的人都应该搞懂。当然,如果只是学Java玩玩就无所谓了。如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列。内容均来自于CSDN的经典老贴。

  问题一:我声明了什么!

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逻辑是如何实现的。

键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品
闂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣捣閻棗霉閿濆牊顏犵紒鈧繝鍌楁斀闁绘ɑ褰冮埀顒€顕槐鎾愁潩鏉堛劌鏋戦梺鍝勫暙閻楀嫰鍩€椤戣法绐旂€殿喕绮欓、姗€鎮欓懠鍨涘亾閸喒鏀介柨娑樺娴犙呯磼椤曞懎鐏︾€殿噮鍋婇幃鈺冪磼濡攱瀚奸梻鍌欑贰閸嬪棝宕戝☉銏″殣妞ゆ牗绋掑▍鐘绘煙缂併垹鏋熼柣鎾寸懄閵囧嫰寮埀顒勵敄濞嗗繄缂氶柟鎵閻撴瑧鈧懓瀚晶妤呭吹閸モ斁鍋撶憴鍕8闁告柨绉堕幑銏犫攽鐎n亞锛滃┑鐐叉閸旀牠鍩㈤弴鐔虹瘈闁汇垽娼у暩濡炪倧缍€濡嫬宓勯梺鍛婄⊕濞兼瑧澹曟繝姘厵闁硅鍔﹂崵娆戠磼閻欌偓閸ㄥ爼寮婚妸鈺傚亞闁稿本绋戦锟�闂傚倸鍊搁崐鎼佸磹閹间礁纾归柣鎴eГ閸婂潡鏌ㄩ弴鐐测偓鍝ョ不閺嶎厽鐓曟い鎰剁稻缁€鈧紒鐐劤濞硷繝寮婚悢鐓庣畾闁绘鐗滃Λ鍕磼閹冣挃缂侇噮鍨抽幑銏犫槈閵忕姷顓哄┑鐐叉缁绘帗绂掓總鍛娾拺闁告繂瀚銉╂煕鎼达絾鏆鐐插暙椤粓鍩€椤掑嫬绠栨繛鍡樻尭缁狙囨煕椤垵鏋ょ憸鐗堝灥閳规垿鎮欓懠顒佹喖缂備緡鍠栫粔鍫曞礆閹烘绠婚悹鍥蔼閹芥洖鈹戦悙鏉戠仧闁糕晛瀚板顐﹀礃椤旂晫鍙嗗┑鐘绘涧濡瑩藟閻樼偨浜滈柨鏂挎惈閸旓附鎱ㄦ繝鍐┿仢鐎规洏鍔嶇换婵嬪礃閻愵剦妫濋梻鍌欒兌閹虫捇宕甸弽顓炵闁跨噦鎷�