两分钟“手撕”Object类

2024-05-02 20:12
文章标签 object 两分钟

本文主要是介绍两分钟“手撕”Object类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、什么是Object类

二、Object常见的类

1.toString()方法

2.equals()方法

3.hashcode()方法 


一、什么是Object类

Object是Java默认提供的一个类。Java里面除了Object类,所有的类都是存在继承关系的。默认会继承Object父类。即所有类的对象都可以使用Object的引用进行接收。简单来讲:Object类是所有类的父类。

class Person{}
class Student{}public class Test {public static void main(String[] args) {Func(new Person());Func(new Student());}public static void Func(Object obj){System.out.println(obj);}
}
//执行结果
ObjectPratice.Person@3b07d329
ObjectPratice.Student@404b9385

既然可以向上转型,那就说明Person和Student继承于Object这个类。 

二、Object常见的类

1.toString()方法

这是一个常见的方法,如果要打印对象中的内容,可以直接重写Object类中的toString()方法。

怎么重写:右键generate->toString();

// Object类中的toString()方法实现:
public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

2.equals()方法

在Java中,==进行比较时:

a.如果==左右两侧是基本类型变量,比较的是变量中值是否相同

b.如果==左右两侧是引用类型变量,比较的是引用变量地址是否相同

c.如果要比较对象中内容,必须重写Object中的equals方法,因为equals方法默认也是按照地址比较的: 

class Person {public String name;public int age;public Person(String name, int age) {this.name = name;this.age = age;}
}public class Test {public static void main(String[] args) {int a = 10;int b = 10;Person person1 = new Person("zhangsan", 4);Person person2 = new Person("zhangsan", 4);System.out.println(a==b);System.out.println(person1==person2);System.out.println(person1.equals(person2));}
}
//执行结果
true
false
false

Person类重写equals方法后,然后比较: 

import java.util.Objects;class Person {public String name;public int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic boolean equals(Object obj) {if (obj == null) {return false;}if (this == obj) {return true;}
// 不是Person类对象if (!(obj instanceof Person)) {return false;}
//因为传值过去是向上转型,这时候不能使用子类的name,需要向下转型Person person = (Person) obj; // 向下转型,比较属性值return this.name.equals(person.name) && this.age == person.age;}
}
public class Test {public static void main(String[] args) {int a = 10;int b = 10;Person person1 = new Person("zhangsan", 4);Person person2 = new Person("zhangsan", 4);System.out.println(a==b);System.out.println(person1==person2);System.out.println(person1.equals(person2));}
}
//执行结果
true
false
true

结论:比较对象中内容是否相同的时候,一定要重写equals方法。 

3.hashcode()方法 

hashCode()这个方法,他帮我算了一个具体的对象位置,我们不大正规的可以说它是个内存地址。

hashcode方法源码:(该方法是一个native方法,底层是由C/C++代码写的。我们看不到。)

public native int hashCode();

我们认为两个名字相同,年龄相同的对象,将存储在同一个位置,如果不重写hashcode()方法,我们可以来看示例 代码: 

class Person {public String name;public int age;
public Person(String name, int age) {this.name = name;this.age = age;
}
}
public class TestDemo4 {
public static void main(String[] args) {Person per1 = new Person("zhangsan", 20) ;Person per2 = new Person("zhangsan", 20) ;System.out.println(per1.hashCode());System.out.println(per2.hashCode());
}
}
//执行结果
460141958
1163157884

 注意事项:两个对象的hash值不一样。

但是若两个对象,他们名字和年龄一样的话,在我们的业务逻辑中,我们可以认为他们是同个人 ,用同一个hash值。

像重写equals方法一样,我们也可以重写hashcode()方法。此时我们再来看看:

class Person {
public String name;public int age;
public Person(String name, int age) {this.name = name;this.age = age;
}
//重写hashCode方法
@Override
public int hashCode() {return Objects.hash(name, age);
}
}
public class TestDemo4 {
public static void main(String[] args) {Person per1 = new Person("gaobo", 20) ;Person per2 = new Person("gaobo", 20) ;System.out.println(per1.hashCode());System.out.println(per2.hashCode());
}
}
//执行结果
460141958
460141958

结论:

1、hashcode方法用来确定对象在内存中存储的位置是否相同

2、事实上hashCode() 在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置。

这篇关于两分钟“手撕”Object类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/955073

相关文章

深入探讨Java 中的 Object 类详解(一切类的根基)

《深入探讨Java中的Object类详解(一切类的根基)》本文详细介绍了Java中的Object类,作为所有类的根类,其重要性不言而喻,文章涵盖了Object类的主要方法,如toString()... 目录1. Object 类的基本概念1.1 Object 类的定义2. Object 类的主要方法3. O

【Python报错已解决】AttributeError: ‘list‘ object has no attribute ‘text‘

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查属性名2.2 步骤二:访问列表元素的属性 三、其他解决方法四、总结 前言 在Python编程中,属性错误(At

error while loading shared libraries: libnuma.so.1: cannot open shared object file:

腾讯云CentOS,安装Mysql时: 1.yum remove libnuma.so.1 2.yum install numactl.x86_64

java基础总结12-面向对象8(Object类)

1 Object类介绍 Object类在JAVA里面是一个比较特殊的类,JAVA只支持单继承,子类只能从一个父类来继承,如果父类又是从另外一个父类继承过来,那他也只能有一个父类,父类再有父类,那也只能有一个,JAVA为了组织这个类组织得比较方便,它提供了一个最根上的类,相当于所有的类都是从这个类继承,这个类就叫Object。所以Object类是所有JAVA类的根基类,是所有JAVA类的老祖宗

王立平--Object-c

object-c通常写作objective-c或者obj-c,是根据C语言所衍生出来的语言,继承了C语言的特性,是扩充C的面向对象编程语言。它主要使用于MacOSX和GNUstep这两个使用OpenStep标准的系统,而在NeXTSTEP和OpenStep中它更是基本语言。Objective-C可以在gcc运作的系统写和编译,因为gcc含Objective-C的编译器。在MA

COD论文笔记 ECCV2024 Just a Hint: Point-Supervised Camouflaged Object Detection

这篇论文的主要动机、现有方法的不足、拟解决的问题、主要贡献和创新点: 1. 动机 伪装物体检测(Camouflaged Object Detection, COD)旨在检测隐藏在环境中的伪装物体,这是一个具有挑战性的任务。由于伪装物体与背景的细微差别和模糊的边界,手动标注像素级的物体非常耗时,例如每张图片可能需要 60 分钟来标注。因此,作者希望通过减少标注负担,提出了一种仅依赖“点标注”的弱

COD论文笔记 Adaptive Guidance Learning for Camouflaged Object Detection

论文的主要动机、现有方法的不足、拟解决的问题、主要贡献和创新点如下: 动机: 论文的核心动机是解决伪装目标检测(COD)中的挑战性任务。伪装目标检测旨在识别和分割那些在视觉上与周围环境高度相似的目标,这对于计算机视觉来说是非常困难的任务。尽管深度学习方法在该领域取得了一定进展,但现有方法仍面临有效分离目标和背景的难题,尤其是在伪装目标与背景特征高度相似的情况下。 现有方法的不足之处: 过于

《Zero-Shot Object Counting》CVPR2023

摘要 论文提出了一种新的计数设置,称为零样本对象计数(Zero-Shot Object Counting, ZSC),旨在测试时对任意类别的对象实例进行计数,而只需在测试时提供类别名称。现有的类无关计数方法需要人类标注的示例作为输入,这在许多实际应用中是不切实际的。ZSC方法不依赖于人类标注者,可以自动操作。研究者们提出了一种方法,可以从类别名称开始,准确识别出最佳的图像块(patches),用

sqlplus: error while loading shared libraries: libnsl.so.1: cannot open shared object file: No such

在Zabbix Server服务器上安装oracle-instantclient11.2后,结果使用sqlplus命令时遇到“sqlplus: error while loading shared libraries: libnsl.so.1: cannot open shared object file: No such file or directory“错误,下面总结一下解决过程。

Object::connect: No such slot

信号槽出现这样的问题一定要注意以下几点: ThreadFromQThread work_download ; QObject::connect(this, SIGNAL(send_down_sig(int)),\ &work_download, SLOT(recv_down_info(int))); 注意槽函数仅仅是填