java - 如何在 Java 中实现成员明智比较?

标签 java operator-overloading overriding

我有 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();
  }
}

需要注意两点:

  1. 上面的代码更像是 Java 风格而不是 C++ 风格。我强烈建议您在编写 Java 代码时采用 Java 编码约定。如果您是 Java 的新手,您应该尝试学习它们;和
  2. Java 有一个 equals/hashCode 约定,这意味着如果两个对象相等,则它们的哈希码必须相等。

关于java - 如何在 Java 中实现成员明智比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2115017/

相关文章:

c++ - 在运算符重载中使用带有 const 引用的友元函数

java - 继承中的 ArrayStoreException

java - 使用 Scanner 类获取构造函数变量的用户输入

java - 在 Java EE 6 Web 应用程序中登录用户的不同方式

java - IE11 上的 Selenium WebDriver 在 URL 中总是有 "--port="

api - Odoo 新 API - 覆盖旧 API 函数字段

c++ operator += 重载返回引用

c++ - 如何使用静态成员函数创建一个矩阵,然后可以使用运算符重载打印该矩阵?

css - Bootstrap 没有覆盖我自己的 css

c++ - 为什么在编译时选择这个虚方法的实现?