java中使用Object类中比较遇到的问题,请帮忙解答一下。

问题描述

在java中由于Object是所有类的父类,而且equals方法是public,理论上所有Person类都能够继承并使用该方法。然而以下程序执行结果是false。```classPerson//定义了Person类,实际就是继承了Object类{privateStringname;privateintage;publicPerson(Stringname,intage){this.name=name;this.age=age;}}publicclassTestObject{publicstaticvoidmain(String[]args){Personper1=newPerson("Tyrion",24);Personper2=newPerson("Tyrion",24);System.out.println(per1.equals(per2));}}```但是将程序修改,用Object接收类,结果为true。请大家帮帮忙```classPerson//定义了Person类,实际就是继承了Object类{privateStringname;privateintage;publicPerson(Stringname,intage){this.name=name;this.age=age;}}publicclassTestObject{publicstaticvoidmain(String[]args){Personper1=newPerson("Tyrion",24);Personper2=newPerson("Tyrion",34);Objectobj1=per1;Objectobj2=per2;System.out.println(obj1.equals(per1));}}```看过jdk文档,并没有明确说明。请大家帮忙解答。

解决方案

解决方案二:
1、用object应该也是不相等的这边应该是System.out.println(obj1.equals(obj2));如果这样不是同一个对象吗System.out.println(obj1.equals(per1));如果你要比较两个对象,比如Person,那你应该是重写equals方法
解决方案三:
我的子类并不想覆写Object类的方法,System.out.println(per1.equals(per2));它难道不能区分吗?从逻辑上,子类可以引用父类的方法,且传递的参数可以向上传递。从逻辑上,应该是true
解决方案四:
文档:Object类的equals方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值x和y,当且仅当x和y引用同一个对象时,此方法才返回true(x==y具有值true)。第一个例子Person继承equals方法,没有重写,所以还是比较对象的引用是否相同,-->相同为true,不相同falsep1,p2都是new创建的,在堆分配两块不同的空间,所以false第二个例子obj1.equals(per1),比较的是obj1和per1,Objectobj1=per1;传递时把per1的值传递给obj1,所以两个对象指向同一块空间,返回true;
解决方案五:
看懂了,看来Object类中equals方法还真是要覆写才好用。不覆写比较的是内存空间的地址。
解决方案六:
不覆盖比较也不是内存地址,是hashcode
解决方案七:
文档:如果根据equals(java.lang.Object)方法,两个对象不相等,那么对这两个对象中的任一对象上调用hashCode方法不要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。classPerson//定义了Person类,实际就是继承了Object类{privateStringname;privateintage;publicinthashCode(){return1;}publicPerson(Stringname,intage){this.name=name;this.age=age;}}publicclassTestObject{publicstaticvoidmain(String[]args){Personper1=newPerson("Tyrion",24);Personper2=newPerson("Tyrion",24);System.out.println(per1.equals(per2));}}

返回false,应该比较的是内存地址吧
解决方案八:
Object默认的equals方法比较的是内存地址,必须指向同一个地方才会返回true.
解决方案九:
首先我和你说,你没重写方法,当然可以直接调用obj的eq方法,但是你比较的是什么?你应该比较的是对象,第一种情况你搞出两个对象,那能一样么?你首先要看一下obj的eq方法默认比较的是什么玩意,对不对?再说了,你二种情况,你把一个对象的地址传递给另外一个引用,你拿着同一个对象的两个引用在那比,它能不输出true么?
解决方案十:
在Person重写Object的equals方法publicvoidequals(Objecto){if(oinstanceofPerson)}Personp=(Person)o;returnthis.name.equals(p.name)&&this.age==p.age;}}

解决方案十一:
第二段代码写错了。System.out.println(obj1.equals(per2));都是不等。
解决方案十二:
楼主没写重写equlas方法,Object默认拿==去判断,new了两个对象,肯定不相等;付源码清晰明了publicbooleanequals(ObjectanObject){if(this==anObject){returntrue;}if(anObjectinstanceofString){StringanotherString=(String)anObject;intn=value.length;if(n==anotherString.value.length){charv1[]=value;charv2[]=anotherString.value;inti=0;while(n--!=0){if(v1[i]!=v2[i])returnfalse;i++;}returntrue;}}returnfalse;}

解决方案十三:
第一个比较的是hashcode的值,第二个比较的是ob持有的person对象的引用,

时间: 2025-01-20 10:46:20

java中使用Object类中比较遇到的问题,请帮忙解答一下。的相关文章

Java中的Object类详细介绍_java

理论上Object类是所有类的父类,即直接或间接的继承java.lang.Object类.由于所有的类都继承在Object类,因此省略了extends Object关键字. 该类中主要有以下方法: toString(),getClass(),equals(),clone(),finalize(), 其中toString(),getClass(),equals是其中最重要的方法. 注意: Object类中的getClass(),notify(),notifyAll(),wait()等方法被定义为f

object-java中使用Object类进行比较时遇到的问题

问题描述 java中使用Object类进行比较时遇到的问题 在java中由于Object是所有类的父类,而且equals方法是public,理论上所有Person类都能够继承并使用该方法. 然而以下程序执行结果是false. class Person // 定义了Person类,实际就是继承了Object类 { private String name ; private int age ; public Person(String name , int age) { this.name =nam

string-关于Java中 源代码 String 类中的 equals

问题描述 关于Java中 源代码 String 类中的 equals public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String) anObject; int n = value.length; if (n == anotherString.value.length)

成员变量-如何让JAVA不自动回收某个类中的变量?

问题描述 如何让JAVA不自动回收某个类中的变量? 我的一个web应用中 初始化的时候会给一个类中的静态成员变量赋值,然后隔一段时间会改变成员变量中的值,这样java会自动回收吗?如果长时间不改变成员变量的值会给我回收掉吗?如果回收的话有什么办法可以不让他回收? 解决方案 静态类本身不会回收,但是如果你的程序运行在容器中(比如web程序),而容器本身会回收,这种情况相当于关闭了你的程序.那么当然这些变量全部都没有了. 你有两个办法,一个是根据容器的约定,阻止它回收.比如说容器规定,10分钟没有用

java代码-java初学者提问 在类中 用static成员变量实例化自身类 程序的执行顺序过程是怎样的?

问题描述 java初学者提问 在类中 用static成员变量实例化自身类 程序的执行顺序过程是怎样的? class Demo03 { public static void main(String[] args) { A.show(); } } class A { //构造方法 A(){ System.out.println("构造方法执行"); System.out.println(b); System.out.println(c); } static A a=new A(); sta

JavaScript知识点总结(十一)之js中的Object类详解_javascript技巧

JavaScript中的Object对象,是JS中所有对象的基类,也就是说JS中的所有对象都是由Object对象衍生的.Object对象主要用于将任意数据封装成对象形式. 一.Object类介绍 Object类是所有JavaScript类的基类(父类),提供了一种创建自定义对象的简单方式,不再需要程序员定义构造函数. 二.Object类主要属性 1.constructor:对象的构造函数. 2.prototype:获得类的prototype对象,static性质. 三.Object类主要方法 1

java基础之Object类_java

Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: public class Demo{ // ... } 实际上是下面代码的简写形式: public class Demo extends Object{ // ... } 在Java中,只有基本类型不是对象,例如数值.字符和布尔型的值都不是对象,所有的数组类型,不管是对象数组还是基本类型数组都是继承自

java-Java中在同一个类中把一个方法中的数组元素传到另一个方法中,怎么传啊?麻烦大家说一下,谢谢了!

问题描述 Java中在同一个类中把一个方法中的数组元素传到另一个方法中,怎么传啊?麻烦大家说一下,谢谢了! Java中在同一个类中把一个方法中的数组元素传到另一个方法中,怎么传啊?麻烦大家说一下,谢谢了! 麻烦大家了 解决方案 直接作为参数传就是了 void f1() { int[] x = {1,2,3,4,5}; f2(x[1]); } void f2(int n) { } 解决方案二: Spring AOP代理机制以及方法调用在同一个类的另一个方法的问题 解决方案三: 可以使用全局变量的方

怎么在 python程序编辑中自动加载库中函数或类中的成员??

问题描述 怎么在 python程序编辑中自动加载库中函数或类中的成员?? 在使用import引用系统模块时 如import(sys)中的函数 如:print(sys.path) 调用path函数 在写程序时想写sys . 后自动出现sys中所有的 成员 就像C#或java 中编辑代码一样 我用的是editPlus 编辑器 是不是要安装插件之类的 解决方案 不如直接用python tools for visual studio 解决方案二: 可以试试pycharm编辑器.功能比较强大,目前最好的编