我有 C++ 背景,今天才开始学习 Java。假设我有一个包含几个数据成员的类。例如:
public class Person {
//Constructors/Destructor
public Person(String strFirstName, String strLastName) {
m_strFirstName = strFirstName;
m_strLastName = strLastName;
m_strFullName = m_strFirstName + m_strLastName;
}
//Getters
public String GetFullName() { return m_strFullName; }
public String GetFirstName() { return m_strFirstName; }
public String GetLastName() { return m_strLastName; }
//Private Data Members
private String m_strFirstName;
private String m_strLastName;
private String m_strFullName;
}
现在假设我这样做:
Person john = new Person("john", "doe");
Person johndoe = new Person("john", "doe");
if (john == johndoe) {
System.out.println("They are Equal");
} else {
System.out.println("They are NOT Equal");
}
这里的结果是“他们不相等”。我知道这是因为 Java 正在比较引用(内存地址),并且由于它们位于内存中的不同位置,因此测试失败。我读过 Java 不支持运算符重载,所以我不能重载运算符 ==,那么有没有我要重写的方法来实现我的成员比较? object.equals 方法看起来很有前途,但我读到过重写这个方法是不好的做法。
更新: 好的,我相信重写等于是可以的!我找不到那篇说它不好的文章。感谢您的帮助,我在学习 Java 时可能会有更多问题!!
最佳答案
你这样做:
if (john.equals(johndoe)) {
...
}
并在您的对象上实现 equals()
方法:
public class Person {
private String firstName;
private String lastName;
private String fullName;
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
this.fullName = firstName + lastName;
}
public String getFirstName() { return firstName; }
public String getLastName() { return lastName; }
public String getFullName() { return fullName; }
@Override
public boolean equals(Object ob) {
if (ob == null) return false;
if (ob.getClass() != getClass()) return false;
Person other = (Person)ob;
if (!firstName.equals(other.firstName)) return false;
if (!lastName.equals(other.lastName)) return false;
if (!(fullName.equals(other.fullName)) return false;
return true;
}
@Override
public int hashCode() {
return firstName.hashCode() ^ lastName.hashCode() ^ fullName.hashCode();
}
}
需要注意两点:
- 上面的代码更像是 Java 风格而不是 C++ 风格。我强烈建议您在编写 Java 代码时采用 Java 编码约定。如果您是 Java 的新手,您应该尝试学习它们;和
- Java 有一个 equals/hashCode 约定,这意味着如果两个对象相等,则它们的哈希码必须相等。
关于java - 如何在 Java 中实现成员明智比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2115017/