Object类详解

一、==和equals的对比

1.1 ==是一个比较运算符

  1. ==:即可以判断基本类型,又可以判断引用类型
  2. ==:如果判断基本类型,判断的是值是否相等
    • 例如:int i = 10;double d = 10.0
  3. ==:如果判断应用类型,判断的是地址是否相等,即判断是否是一个对象

1.2 equals方法

  1. equals:是Object类中的方法,只能判断引用类型

重写equals方法

题目:判断两个 Person 对象的内容是否相等,如果两个 Person 对象的各个属性值都一样,则返回 true,反之 false

package com.hspedu.object_;

import java.util.Objects;

public class EqualsExercise {
public static void main(String[] args) {
Person person1 = new Person("jack", 10, '男');
Person person2 = new Person("jack", 10, '男'); System.out.println(person1.equals(person2));//false
}
} class Person {//extends object 中的equals
private String name;
private int age;
private char gender; //重写equals方法 @Override
public boolean equals(Object o) {
//如果比较的对象是同一个对象,则直接返回true
if (this == o) {
return true;
}
/* 自己写的
else if (o == null) {
return false;
} else if (o instanceof Person) {
Person p = (Person) o;
return p.getAge() == this.age && p.getName().equals(this.name)
&& p.getGender() == this.gender;
}else {
return false;
}*/ //老师的思路
if (o instanceof Person) {
Person p = (Person) o;
return p.getAge() == this.age && p.getName().equals(this.name)
&& p.getGender() == this.gender;
}
return false;
} @Override
public int hashCode() {
return Objects.hash(name, age, gender);
} public Person(String name, int age, char gender) {
this.name = name;
this.age = age;
this.gender = gender;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public char getGender() {
return gender;
} public void setGender(char gender) {
this.gender = gender;
}
}

二、hashCode方法

功能:返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。

  1. 提供具有哈希结构的容器效率!

  2. 两个引用,如果指向的是同一个对象,则哈希值肯定是一样的!

  3. 两个引用,如果指向的是不同对象,则哈希值不一样的

  4. 哈希值主要根据地址来计算的,但不能将其等价为地址

    package com.hspedu.object_;
    
    public class HashCode_ {
    public static void main(String[] args) {
    AA obj1 = new AA();
    AA obj2 = new AA();
    AA obj3 = obj1;
    System.out.println("obj1.hashCode()="+obj1.hashCode());
    System.out.println("obj2.hashCode()="+obj2.hashCode());
    System.out.println("obj3.hashCode()="+obj3.hashCode());
    }
    } class AA{ }

    5.后面在集合中,hashCode 如果需要,则会重写

三、toString方法

功能:全类名(包名+类名)+@+哈希值的十六进制

  • 重写 toString 方法,打印对象或拼接对象时,都会自动调用该对象的 toString 形式
  • 当直接输出一个对象时,toString 方法会被默认调用
    • 比如:System.out.println(monster);

一般会用重写之后的toString方法会打印类名和其属性

package com.hspedu.object_;

public class ToString {
public static void main(String[] args) {
/*
Object 的toString() 源码
(1) getClass().getName() 全类名(包名+类名)
(2) Integer.toHexString(hashCode()) 将对象的hashCode值转成16进制字符串
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
}*/ Monster monster = new Monster("小妖怪", "巡山", 1000);
System.out.println(monster.toString() + " hashcode=" +monster.hashCode());
//com.hspedu.object_.Monster@49e4cb85
System.out.println("==当直接输出一个对象时,toString 方法会被默认调用==");
System.out.println(monster);
}
} class Monster{
private String name;
private String job;
private double sal; //重写toString方法,输出对象的属性
//使用快捷键 alt+inset -> toString @Override
public String toString() {//重写后,一般是把对象的属性输出,当然程序员也可以自己定制
return "Monster{" +
"name='" + name + '\'' +
", job='" + job + '\'' +
", sal=" + sal +
'}';
} public Monster(String name, String job, double sal) {
this.name = name;
this.job = job;
this.sal = sal;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getJob() {
return job;
} public void setJob(String job) {
this.job = job;
} public double getSal() {
return sal;
} public void setSal(double sal) {
this.sal = sal;
}
}

四、finalize方法

  1. 当对象被回收时,系统自动调用该对象的 finalize 方法。子类可以重写该方法,做一些释放资源的操作

  2. 什么时候被回收: 当某个对象没有任何引用时,则 jvm 就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来 销毁该对象,在销毁该对象前,会先调用 finalize 方法

  3. 垃圾回收机制的调用,是由系统来决定(即有自己的 GC 算法), 也可以通过 System.gc() 主动触发垃圾回收机制,测 试:Car [name

  • 我们在实际开发中,几乎不会运用 finalize , 所以更多就是为了应试
package com.hspedu.object_;

//演示 Finalize的用法
public class Finalize_ {
public static void main(String[] args) {
Car car = new Car("宝马"); //这时 car对象就是个垃圾,垃圾回收器就会回收(销毁)对象,在销毁对象前
//,会调用该对象的finalize方法
//程序员就可以在 finalize中,写自己的业务逻辑(比如释放资源:数据库连接,或者打开文件..)
//,如果不重写finalize,那么就会调用Object类的 finalize,即默认处理
//,如果重写了finalize,就可以实现自己的逻辑
car = null;
System.gc();
System.out.println("程序退出了....");
}
} class Car{
private String name; @Override
protected void finalize() throws Throwable {
System.out.println("我们销毁 汽车" + name);
System.out.println("释放了某些资源...");
} public Car(String name) {
this.name = name;
} }

JAVA Object类方法的更多相关文章

  1. Java Object类方法解析

    Java Object类方法解析 在Java中Object是所有类的父类,任何类都默认继承Object,其提供的方法主要有以下几种: registerNatives() hashCode和equale ...

  2. Java菜鸟学习笔记--面向对象篇(十六):Object类方法

    Object类 什么是Object类? Object类是所有Java类的祖先,每个类都使用 Object 作为超类,所有对象(包括数组)都实现这个类的方法Object类是类层次结构的根,Object类 ...

  3. Java Object 引用传递和值传递

    Java Object 引用传递和值传递 @author ixenos Java没有引用传递: 除了在将参数传递给方法(或函数)的时候是"值传递",传递对象引用的副本,在任何用&q ...

  4. Java Object 构造方法的执行顺序

    Java Object 构造方法的执行顺序 @author ixenos 为了使用类而做的准备工作包括三个步骤 1)加载:类加载器查找字节码(一般在classpath中找),从字节码创建一个Class ...

  5. Java Object 对象创建的方式 [ 转载 ]

    Java Object 对象创建的方式 [ 转载 ] @author http://blog.csdn.net/mhmyqn/article/details/7943411 显式创建 有4种显式地创建 ...

  6. Java Object 对象拷贝答疑

    Java Object 对象拷贝答疑 @author ixenos 摘要:在对象的clone过程需要注意的几点.关于关键字this.super 关于clone[对象拷贝] 在实际编程过程,有时候我们会 ...

  7. Java Object 对象拷贝

    Java Object 对象拷贝 @author ixenos JAVA 对象拷贝 Java里的clone分为:  1.浅拷贝:浅复制仅仅复制所考虑的对象,而不复制它所引用的对象,Object类里的c ...

  8. Java基础-SSM之Spring的POJO(Plain Old Java Object)实现AOP

    Java基础-SSM之Spring的POJO(Plain Old Java Object)实现AOP 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 上次我分享过Spring传统的A ...

  9. java Object解析

    java Object是所有对象的根父类,所有对象都直接或间接集成自该类. java 的Object类也比较简单,有equals(Object).toString().finalize() java方 ...

随机推荐

  1. 巧用python进行接口自动化测试

    一.接口自动化测试的流程 1.需求分析 1.1请求(url,方法.数据) 2.挑选需要做自动化测试的接口 3.设计自动化测试用例 4.搭建自动化测试环境 5.设计自动化执行框架(报告.参数化. 用例执 ...

  2. 通过loganalyzer展示数据库中的日志

    一.安装mysql # yum -y install mariadb-server # systemctl enable --now mariadb && systemctl stat ...

  3. python的namespace的理解

    Python命名空间的本质   python中的名称空间是名称(标识符)到对象的映射. 具体来说,python为模块.函数.类.对象保存一个字典(__dict__),里面就是重名称到对象的映射. -- ...

  4. pytest(6)-Fixture(固件)

    什么是固件 Fixture 翻译成中文即是固件的意思.它其实就是一些函数,会在执行测试方法/测试函数之前(或之后)加载运行它们,常见的如接口用例在请求接口前数据库的初始连接,和请求之后关闭数据库的操作 ...

  5. 34、python并发编程之多进程(操作篇)

    目录: 一 multiprocessing模块介绍 二 Process类的介绍 三 Process类的使用 四 守护进程 五 进程同步(锁) 六 队列(推荐使用) 七 管道 八 共享数据 九 信号量( ...

  6. 聚类算法在 D2C 布局中的应用

    1.摘要 聚类是统计数据分析的一门技术,在许多领域受到广泛的应用,包括机器学习.数据挖掘.图像分析等等.聚类就是把相似的对象分成不同的组别或者更多的子集,从而让每个子集的成员对象都有相似的一些属性. ...

  7. MySQL基本数据类型与约束条件

    昨日内容回顾 数据存储的演变 # 方向: 朝着更加统一和方便管理 数据库的发展史 # 由本地保存逐步演变为线上保存 数据库的本质 # 本质上就是一款CS架构的软件 """ ...

  8. ServiceStack.Redis的源码分析(连接与连接池)

    前几天在生产环境上redis创建连接方面的故障,分析过程中对ServiceStack.Redis的连接创建和连接池机制有了进一步了解.问题分析结束后,通过此文系统的将学习到的知识点整理出来. 从连接池 ...

  9. 解决页面js、css代码样式失效

    解决方式 根据地址不同的层级深度,加上对应的 " . . / "(不推荐): 去掉所有的 " . . / ", 在js或css的路径前 加上 " / ...

  10. 昨天面试被问到的 缓存淘汰算法FIFO、LRU、LFU及Java实现

    缓存淘汰算法 在高并发.高性能的质量要求不断提高时,我们首先会想到的就是利用缓存予以应对. 第一次请求时把计算好的结果存放在缓存中,下次遇到同样的请求时,把之前保存在缓存中的数据直接拿来使用. 但是, ...