2013-07-09 31 views
5

Tôi có một chương trình là sở thú và trong sở thú có các phân nhóm con của các loài động vật là loài bò sát. Khi tôi làm một phương thức equals, chương trình chính biên dịch và nó chạy. Tôi đang nhầm lẫn như thế nào java biết để sử dụng phương pháp equals nếu tôi so sánh các đối tượng và không cụ thể int hoặc String?Phương thức equals có hoạt động với các đối tượng không? Nếu vậy, làm thế nào?

public class Zoo { 

    public static void main(String[]args) { 
     Animal a=new Animal("Bob"); 
     Reptile komodo= new Reptile("Snakey"); 
     komodo.bask(); 
     a.size=3; 
     komodo.size=5; 
     System.out.println(a); 
     System.out.println(komodo); 
     Turtle t= new Turtle("Slowy"); 
     t.hide(); 
     t.size=6; 
     t.numlegs=4; 
     System.out.println(t); 
     System.out.println(t.equals(komodo)); 
    } 
} 

public class Animal { 
    public String name; 

    public boolean equals(Animal other) { 
     return other.size==this.size; 
    } 

    public Animal(String s) { 
     name=s; 
    } 
    public void setName(String n) { 
     this.name=n; 
    } 
    public void eat(String meal) { 
     System.out.println("chump chump yummy "+meal); 
    } 
    public int size; 

    public String toString() { 
     return "I am "+name+" and I'm "+size+" cm long"; 
    } 

} 

public class Reptile extends Animal { 

    public Reptile(String n) { 
     super(n); 
     numlegs=0; 
    } 
    public Reptile(String n, int l) { 
     super(n); 
     numlegs=l; 
    } 

    public void bask() { 
     System.out.println("basking..."); 
    } 
    public String toString() { 
     return super.toString()+numlegs+" legs"; 
    } 

    public int numlegs; 
} 
public class Turtle extends Reptile { 

    public Turtle(String n) { 
     super (n,4); 
     shellColor="Brown"; 
    } 
    public void hide() { 
     System.out.println("you cant see me"); 
    } 
    public String toString() { 
     return super.toString()+" and my shell is"+ shellColor; 
    } 
    public String shellColor; 

    public void bask() { 
     super.bask(); 
     System.out.println("turtle is basking..."); 
    } 

} 

Trả lời

11

Bạn không ghi đè phương pháp Object#equals nhưng quá tải. Trong tuyên bố phương pháp của bạn, bạn sử dụng Animal loại thay vì Object:

public boolean equals(Animal other) 

Một trọng tốt của phương pháp này sẽ được sử dụng toán tử instanceof. Hiển thị một ví dụ:

@Override 
public boolean equals(Object other) { 
    if(other instanceof Animal) { 
     Animal otherAnimal = (Animal)other; 
     //comparison logic... 
    } 
    return false; 
} 

Thông tin thêm về đề tài này:

+0

+1 Để là người đầu tiên và chính xác ;-). –

+0

PS. Một phương pháp ghi đè tốt cũng nên được chú thích. ;-). –

+0

@LuiggiMendoza upvote vì rất nhanh chóng và chính xác –

2

Đối với câu hỏi của bạn trên java biết cách làm thế nào để so sánh các đối tượng, bạn cần ghi đè phương thức equals

public boolean equals(Object other){ 
    // return true or false based on your logic 

    } 

Trong khi so sánh, bằng phương pháp được sử dụng. Bạn có thể xem hướng dẫn hay này giải thích tầm quan trọng của phương thức equals.

http://www.thejavageek.com/2013/06/26/what-is-the-significance-of-equals-method-in-java/

Ngoài ra, chỉ trọng bằng là không đủ nếu bạn đang sử dụng các đối tượng vào bộ sưu tập những sử dụng băm. Bạn sẽ tìm thấy một hướng dẫn tốt tại

http://www.thejavageek.com/2013/06/28/significance-of-equals-and-hashcode/

+0

Đối tượng không có kích thước thành viên. –

+0

Vâng, hãy chỉnh sửa nó :) –

+0

+1 để đề cập đến băm quá mức, tôi muốn nói rằng mặc dù băm luôn luôn bị ghi đè nếu bằng được ghi đè nếu không hợp đồng bị hỏng. Một IDE tốt sẽ tạo ra băm mới cho bạn –

0

Mỗi lớp kế thừa lớp Object âm thầm. Và lớp Object có phương thức equals. Vì vậy, nếu bất kỳ lớp không ghi đè lên bằng phương pháp sau đó nó sẽ sử dụng các cài đặt mặc định của Object.equals.

Từ doc

Các bằng phương pháp cho lớp đối tượng thực hiện các sáng suốt nhất quan hệ tương đương có thể trên các đối tượng; tức là, đối với bất kỳ giá trị tham chiếu không rỗng là x và y, phương thức này trả về true nếu và chỉ khi x và y tham chiếu đến cùng một đối tượng (x == y có giá trị đúng).

Từ mã nguồn của Object.equals

public boolean equals(Object obj) { 
    return (this == obj); 
} 

Vì vậy, Nếu bất kỳ đối tượng không có nó thực hiện riêng của bình đẳng thì method equals đơn giản sẽ kiểm tra xem tài liệu tham khảo đối tượng là giống nhau hay không.

Vì vậy, có được kết quả mong muốn từ bằng bạn cần tự mình triển khai như được đề cập trong câu trả lời khác

Các vấn đề liên quan