亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

怎么比較兩個不同子類的值是否相等?

package?com.imooc;

public?class?Animal?{
????public?String?name;
????public?int?age;

????@Override
????public?boolean?equals(Object?obj)?{
????????if?(this?==?obj)
????????????return?true;
????????if?(obj?==?null)
????????????return?false;
????????if?(getClass()?!=?obj.getClass())
????????????return?false;
????????Animal?other?=?(Animal)?obj;
????????if?(age?!=?other.age)
????????????return?false;
????????return?true;
????}
}
package?com.imooc;

public?class?Dog?extends?Animal?{

}
package?com.imooc;

public?class?Cat?extends?Animal?{

}
package?com.imooc;

public?class?Initial?{
????public?static?void?main(String[]?args)?{

????????Dog?dog?=?new?Dog();
????????Dog?dog2=new?Dog();
????????Cat?cat?=?new?Cat();
????????dog.age=1;
????????dog2.age=1;
????????cat.age=1;

????????if(dog.equals(dog2)){
????????????System.out.println("dog和dog2的age相同");
????????}else{
????????????System.out.println("dog和dog2的age不同");
????????}

????????if(dog.equals(cat)){
????????????System.out.println("dog和cat的age相同");
????????}else{
????????????System.out.println("dog和cat的age不同");
????????}
????}
}

結果為dog和dog2的age相同,dog和cat的age不同

為什么new同一個子類時,equals可以比較屬性值,而new不同子類時,不能比較屬性值,怎么修改才能比較不同子類的屬性值

謝謝


正在回答

11 回答

把?這個代碼換成下面那個

?Cat cat = new Cat();

換成這個以后 就是相同的了

Dog cat = new Dog();


至于為啥比較出來不相同 是因為 它們的類型就是不一樣的 所以還沒有比到值 直接在類型這里就返回 flase了

所以不同,修改成相同的類型以后就能比較了

還有想比較兩個類的數據是否相同 可以直接使用 == 來進行對比

if (dog.age ?==?dog2.age){

? ? ??System.out.println("dog和dog2的age相同");

????????}else{

????????????System.out.println("dog和dog2的age不同");

????????}

? ? ? ??

if (dog.age ?==?cat.age=1){

? ? ?System.out.println("dog和cat的age相同");

????????}else{

????????????System.out.println("dog和cat的age不同");

????????}

這樣就可以對比了=-= 簡單粗暴~望采納

0 回復 有任何疑惑可以回復我~
#1

Half_Life 提問者

Animal[] animal={new Dog(),new Cat()} 這樣的話好像就不可以了,具體請看樓下,謝謝
2016-04-08 回復 有任何疑惑可以回復我~

都是初學者,好吧,哭

0 回復 有任何疑惑可以回復我~

天吶,能不能用簡單一點的代碼來寫啊。這本身不是很復雜的問題,但是你的代碼看得我眼花了。

0 回復 有任何疑惑可以回復我~

是的 目前我們所學的知識就是后面可以這么去理解 等到后面慢慢累積了更多知識了 就會理解的更加透徹,現在先理解大概是個啥意思有一個認識 就好了 不能說完全懂了 也不能完全都不懂 ,我現在和你所說的這些也算是我個人學到現在的一些理解,有的地方也不是百分之百正確,基本上大概這么個意思 所以有的東西還是需要自己多多去琢磨 自己琢磨透徹了 在聽別人稍微講解一下 是很容易理解 和加深記憶的~

0 回復 有任何疑惑可以回復我~
#1

Half_Life 提問者

int i1=1;//基本數據類型 Integer i3=new Integer(1);//引用數據類型,利用包裝類把基本數據類型包裝成引用數據類型 基本數據類型如果變量值相等,則兩個變量都指向同一個內存地址; 引用數據類型即使變量值相等,也可能引用的是不同的內存地址 ==比較內存地址,equals()比較值 基本數據類型包括byte, short, long, int, float, double, boolean, char 引用數據類型包括字符串String、數組、類、接口
2016-04-09 回復 有任何疑惑可以回復我~
#2

Half_Life 提問者

比較基本數據類型時用==,應用數據類型時用equals()
2016-04-09 回復 有任何疑惑可以回復我~
#3

qq_文_17 回復 Half_Life 提問者

哈哈,闊以的! 這樣總結一下 理解的就清晰多了,不會迷糊了~ 學習路漫漫~ 多多努力~
2016-04-11 回復 有任何疑惑可以回復我~

new 同一個類 用==比較的是 它們的類型 或者說是內存地址 這個東西它們是使用的一樣的


不同類的時候 == 就無法比較類了,因為 類型不同 所在的 空間地址也不一樣 內存地址也是不同的


但是?equals() 在String 字符串中 比較的時候 他比較的是兩個 變量的 內容是不是一樣的 并不是去比較類型

和內存地址 所以不同的類 就是 需要使用equals()來比較?


equals() 重寫 只是拿來比較對象的 ?來對比這個兩個 對象中間的類型 是否一致 它的屬性是否一致

0 回復 有任何疑惑可以回復我~
#1

Half_Life 提問者

謝謝,有點懂了,也還是有點迷糊。。。 ==在比較基本數據的時候是直接比較的數值,在比較引用數據類型的時候比較的是內存地址。 而視頻例子中如果比較的是dog.age==dog2.age,也就是在比較基本數據類型所以可以用==,但視頻中比較的是dog==dog2,所以就必須用equals(),而且還因為分別new了,所以內存地址不同,就必須重寫equals()才可以比較數值
2016-04-08 回復 有任何疑惑可以回復我~
#2

qq_文_17 回復 Half_Life 提問者

http://zhidao.baidu.com/link?url=sBTDm0r0or_eLyZPHnsGs6-NswPnHsb-O44XPBdACIwXxuD4-Lnymko8aLVTm_WolnxFX7OmWuxjHJf57d9DsHoON6X_MauWt23wJxei24K 有時間可以看看這個 上面的回答比較直接簡明一些
2016-04-09 回復 有任何疑惑可以回復我~
name?測試過調試輸出?name[i]?有數值嗎??=-=?正常賦值了以后是可以判斷和對比的

但是不要用等于號了?直接用???equals()?比較?

貓.equals("貓")??這樣就是判斷?貓這個字符串是否和?貓這個字符串?相等


0 回復 有任何疑惑可以回復我~
#1

Half_Life 提問者

迷糊了,為什么new同一個類的時候==就可以了,new不同類的時候直接equals()就可以了,但是例子中的quals()重寫啥時候用?
2016-04-08 回復 有任何疑惑可以回復我~
#2

qq_文_17 回復 Half_Life 提問者

new 同一個類 用==比較的是 它們的類型 或者說是內存地址 這個東西它們是使用的一樣的 不同類的時候 == 就無法比較類了,因為 類型不同 所在的 空間地址也不一樣 內存地址也是不同的 但是 equals() 在String 字符串中 比較的時候 他比較的是兩個 變量的 內容是不是一樣的 并不是去比較類型 和內存地址 所以不同的類 就是 需要使用equals()來比較 equals() 重寫 只是拿來比較對象的 來對比這個兩個 對象中間的類型 是否一致 它的屬性是否一致 ?
2016-04-08 回復 有任何疑惑可以回復我~
package?com.imooc;

public?class?Animal{
????String?name;
????int?no;
}
package?com.imooc;

public?class?Dog?extends?Animal?{
????public?Dog(){
????this.name="狗";
????this.no=1;
????}
}
package?com.imooc;

public?class?Cat?extends?Animal?{
????public?Cat(){
????this.name="貓";
????this.no=2;
????}
}
package?com.imooc;
import?java.util.Scanner;

public?class?Initial?{
????static?Animal[]?animal={new?Dog(),new?Cat()};
????public?static?void?main(String[]?args)?{
????????Scanner?input=new?Scanner(System.in);
????????System.out.println("請選擇方式:\n1.按品種選擇\n2.按序號選擇");
????????int?choose=input.nextInt();
????????if(choose==1){
????????????searchByName(animal);
????????}else?if(choose==2){
????????????searchByAge(animal);
????????}
????????input.close();
????}
????static?void?searchByName(Animal[]?animal){
????????Scanner?input=new?Scanner(System.in);
????????System.out.println("全部動物如下:\n序號\t品種");
????????for(int?i=0;i<animal.length;i++){
????????????System.out.println(animal[i].no+"\t"+animal[i].name);
????????}
????????System.out.print("請輸入動物名:");
????????String?choose1=input.next();
????????for(int?i=0;i<animal.length;i++){
????????????System.out.println(animal[i].name+choose1);
????????????if(animal[i].name==choose1){
????????????????System.out.println("選擇"+choose1+"成功");
????????????????exitOrContinue(1);
????????????}else?if(i==animal.length-1&&choose1!=animal[i].name){
????????????????System.out.println("選擇"+choose1+"失敗");
????????????????exitOrContinue(1);
????????????}
????????}
????????input.close();
????}
????static?void?searchByAge(Animal[]?animal){
????????Scanner?input=new?Scanner(System.in);
????????System.out.println("全部動物如下:\n序號\t品種");
????????for(int?i=0;i<animal.length;i++){
????????????System.out.println(animal[i].no+"\t"+animal[i].name);
????????}
????????System.out.println("\n請輸入序號");
????????int?choose2=input.nextInt();
????????if(choose2>0&&choose2<=animal.length){
????????????if(choose2==animal[(choose2-1)].no){
????????????????System.out.println("選擇"+choose2+"成功");
????????????????exitOrContinue(2);
????????????}else{
????????????????System.out.println("選擇"+choose2+"失敗");
????????????????exitOrContinue(2);
????????????}
????????}
????????input.close();
????}
????static?void?exitOrContinue(int?eoc){
????????Scanner?input=new?Scanner(System.in);
????????System.out.println("是否繼續:\n1.繼續選擇\n2.退出");
????????int?choose3=input.nextInt();
????????if(choose3==1){
????????????if(eoc==1){
????????????????searchByName(animal);
????????????}else?if(eoc==2){
????????????????searchByAge(animal);
????????????}
?????????}else?if(choose3==2){
????????????System.out.println("歡迎下次再來!");
????????}
????????input.close();
????}
}

no正常判斷,name就無法正常判斷了,即使是有值的

0 回復 有任何疑惑可以回復我~

要想nuw出來的東西直接帶有值

在子類里面 構造一個方法 在這個里面賦值

public class Cat extends Animal{

public ?Cat(){

name ="狗";

age = 2;

}

}

這樣nuw出來的時候就直接有值了!


0 回復 有任何疑惑可以回復我~
#1

Half_Life 提問者

謝謝,我改好了之后,age可以判斷了,但是name還是無法判斷,name是不是就要用到重寫equals()?還是別的,麻煩了
2016-04-08 回復 有任何疑惑可以回復我~

animal[0].name = "狗";

0 回復 有任何疑惑可以回復我~

System.out.println(animal[0].name);

? ? ? ?System.out.println(animal[1].name);


在nuw了以后 打印這句話 你會發現你對象里面的 name是空的 木有值 所以找不到?


你給它賦予一個值以后 就可以去對比了 還有 字符串 是用?equals 去比較呢?


基本數據類型 比如 整形 布爾 ?浮點型 就用 ?== 去比較

0 回復 有任何疑惑可以回復我~
首頁上一頁12下一頁尾頁

舉報

0/150
提交
取消

怎么比較兩個不同子類的值是否相等?

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號