设置对象彼此相等(java)

2024-03-31

所以我有一个名为 Person 的类,看起来像这样

public class Person {

    private String personName;


    public String toString(){
        return personName;
    }

    public Person(String personName){
        this.personName = personName;
    }

}

以及我在其中创建对象人的另一个类

public class IdanJavaTask {

    public static void main(String[] args) {

        Person p1 = new Person("Bob");
        System.out.println("p1 : " + p1);

        Person p2 = new Person("Joe");
        System.out.println("p2 :" + p2);

    }

}

到目前为止一切都很好,我的打印声明是
p1: Bob
p2: Joe

现在我想创建一个新对象 p3 并将其设置为等于 p1 我的班级现在看起来像这样:

public class IdanJavaTask {

    public static void main(String[] args) {

        Person p1 = new Person("Bob");
        System.out.println("p1 : " + p1);

        Person p2 = new Person("Joe");
        System.out.println("p2 :" + p2);

        Person p3 = new Person (p1);
        System.out.println("p3 equal to p1:" + p3.equals(p1));

    }

}

当我尝试这样做时,我收到以下错误消息:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The constructor Person(Person) is undefined

    at vehicleassignment.IdanJavaTask.main(IdanJavaTask.java:13)

我想我需要向我的主(Person)类添加一个方法,但我不知道为什么或要添加什么?为什么我不能将对象设置为彼此相等?


有两种方法可以解释“设置对象彼此相等”。

一是你想要的p1 and p3参考the same目的。就像克拉克·肯特和超人是同一个人的两个名字(参考文献)一样。这将通过以下方式完成:

Person p1 = new Person("Jim");
Person p3 = p1;

在这种情况下,如果发生任何事情p1,同样的事情也发生在p3。如果你杀死了克拉克·肯特,你就杀死了超人(因为他们是同一个人)。 Java 判断相等性equals(Object o)方法 - 两个对象a and b相等当且仅当a.equals(b) and b.equals(a) return true。使用基数这两个对象将相等Object平等的定义,所以你不必担心这个。

另一种解释你的意思的方法是创建一个newperson 对象,它恰好是第一人称的精确副本。为此,您必须向 person 类添加另一个构造函数,该构造函数将 person 作为参数:

public class Person {

    private String personName;

    public String toString(){
        return personName;
    }

    public Person(String personName){
        this.personName = personName;
    }

    public Person(Person personToCopy){
        this.personName = personToCopy.personName;
    }

}

通过此设置,您可以在 main.c 中执行您正在执行的操作。

Person p1 = new Person("Bob");
Person p3 = new Person(p1); //Will have name Bob.

为了要做p1 and p3equal,我们必须教 Person 类使用它的字段来检查相等性。我们可以通过覆盖来做到这一点equals类人中的方法。

public boolean equals(Object o){
    if(! (o instanceof Person)) return false; //a Person can't be equal to a non-person

    Person p = (Person) o;
    return personName == null && p.personName == null || personName.equals(p.personName);
}

每当我们覆盖equals方法,最好也覆盖hashcode方法,它返回一个唯一的int对于每个对象。由于唯一的字段Person对象有它的名称,我们可以简单地使用该哈希码。

public int hashCode(){
    return personName == null ? 0 : personName.hashCode();
}

总之,我们的 Person 类看起来像这样:

public class Person {

    private String personName;

    public String toString(){
        return personName;
    }

    public Person(String personName){
        this.personName = personName;
    }

    public Person(Person personToCopy){
        this.personName = personToCopy.personName;
    }

    public boolean equals(Object o){
        if(! (o instanceof Person)) return false; //a Person can't be equal to a non-person

        Person p = (Person) o;
        return personName == null && p.personName == null || personName.equals(p.personName);
    }

    public int hashCode(){
        return personName == null ? 0 : personName.hashCode();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设置对象彼此相等(java) 的相关文章

随机推荐

  • 可以将 std::numeric_limits 专门用于用户定义的类似数字的类吗?

    的文档std numeric limits
  • PHP 忽略 php.ini 中的curl.cainfo 设置(显然)

    我正在尝试修复 Windows 服务器 运行 IIS 上的 php curl 调用 该调用返回熟悉的错误 SSL 证书问题 请验证 CA 证书是否正常 详细信息 错误 14090086 SSL 例程 SSL3 GET SERVER CERT
  • 如何在 Apps 脚本中设置表格的水平对齐方式

    我无法找到使用 Google Apps 脚本水平对齐 Google 文档中表格的方法 我彻底检查了所有文档 也盲目地尝试了几种方法 尝试一 var cells Company rowData 3 Title rowData 4 var ta
  • 循环展开优化,它是如何工作的

    考虑这个 C 代码 int sum 0 for int i 0 i lt 5 i sum i 这可以用 伪 汇编方式翻译 无需循环展开 pseudo code assembly ADDI R10 0 sum ADDI R11 0 i LOO
  • 自动提供数据库中的唯一ID

    在我的项目中 我需要注册一位捐赠者 我需要用户输入他的信息 系统会注册他并为捐赠者生成一个唯一的 ID 制作一个带有字段ID的表 该表具有索引并且具有自动递增功能 CREATE TABLE Persons ID int NOT NULL A
  • 如何尾部除第一行之外的所有行[重复]

    这个问题在这里已经有答案了 例如 我有一个文件 1 2 3 然后我想从第二行输出到尾部 我怎样才能在linux下做到这一点 tail n 2 my file 将输出所有行myfile从第 2 行开始 n2会显示最后两行 tail有很多更多的
  • 算法时间复杂度分析

    您好 我正在尝试分析该算法的时间复杂度 但我很难解开并计算最终循环将执行的次数 我意识到第一个循环是 log n 但之后我似乎无法得到一个评估良好的总和 这是算法 for int i 1 i lt n i 2 i for int j 1 j
  • Ramda 循环数组

    循环可能是错误的术语 但它描述了我正在尝试的事情 我想为平面数据提供结构 但我还需要跟踪它来自的数组 基本上我的规则是 每个数组 如果级别 1 存在 给它name该项目的 以及typechild大批 每次出现级别 1 时 即使在同一个数组中
  • 寻找单调序列并考虑达到最大值时重新启动序列

    我有一个 data table 说 dt name lt letters 1 22 score lt c 42 82 43 32 47 48 49 50 54 59 76 9 13 88 91 99 4 6 8 12 14 15 class
  • Vim 中可以显示缩进指南吗?

    我是 Vim 的长期用户 三四年 最近开始处理一些深度嵌套的代码 此代码使用空格缩进 而不是制表符 我想要一些干净且不分散注意力的缩进指示 以帮助在我查看多个层次的深度内容时跟踪我所在的代码块 set list 只显示制表符和结束行字符 我
  • ASP.Net Core 1.0 RC2:web.config 中提到的 LAUNCHER_PATH 和 LAUNCHER_ARGS 是什么?

    有在 ASP NET 5 RC2 版本中 它更名为 ASP NET Core 1 0 ASP NET 5 已死 http www hanselman com blog ASPNET5IsDeadIntroducingASPNETCore10
  • 在 React 中将组件数组作为 Props 传递

    我正在寻找一种将组件数组传递给选项卡组件的道具的方法 只是想知道这是否可能 因此 我需要创建一个组件来缩短材质 ui 的选项卡方法 但我找不到一种方法来将组件数组作为 prop 传递 以便将其渲染在该组件上 这是我的代码的示例
  • 文件被隐藏了吗?

    如何确定某个路径是否指向隐藏文件 文件夹 NSString file my file some where BOOL fileIsHidden lt what do I do here 我知道隐藏文件以句点为前缀 这不是隐藏文件的唯一标准
  • 将现有 java 项目转换为 osgi 包的最佳方法

    我们有很多组件 我们只想模块化其中的几个 想知道 在我的构建环境的上下文中 从所有这些组件创建捆绑包的最佳方法是什么 我的环境 Java 6 Maven 2 2 1 Hudson 技术 Spring 3 0 5 WebSphere 7 Hi
  • 故障安全集成测试期间的错误不会导致 Maven 构建失败

    我有 Failsafe 运行 Selenium 集成测试 如果我在测试中的断言之一未通过并且测试失败 那么 Maven 构建将按预期失败 但是 如果测试错误 构建会意外成功 输出如下 Tests run 1 Failures 0 Error
  • 使用 OleDbConnection 连接

    我正在尝试连接到具有两个表的数据库 但是 当我尝试登录后 出现错误 该错误表明零点处没有行 我认为这是因为我的联系 using System using System Collections Generic using System Lin
  • sscanf 读取数据不准确

    在 Matlab 中 可以将元胞数组中数字的字符串表示形式转换为双精度数组中的数字表示形式str2double或组合str2num and cellfun A 最近贴文 https stackoverflow com a 21794549
  • 是否可以使用 Selenium WebDriver 来自动化桌面应用程序?

    我正准备为目前处于开发初始阶段的 Web 桌面应用程序编写自动化测试 将使用的技术是 Laravel VueJS 和最重要的 Electron Framework Electron 是一个使用 JavaScript HTML 和 CSS 等
  • 从 SQL Server 2008 中的所有表中选择所有列

    如何从数据库的所有表中选择所有列 例如 Select From 在 SQL Server 2008 中 表列表非常非常大 并且有这么多列 是否可以不写列名来完成 或者也许进行一个返回表名称的选择 这个 SQL 将执行此操作 DECLARE
  • 设置对象彼此相等(java)

    所以我有一个名为 Person 的类 看起来像这样 public class Person private String personName public String toString return personName public