博客
Java-常用API(初级)

文章目录

  • Object
    • Object类的hashCode()和getClass()成员方法
    • Object类的toString()成员方法
    • Obejct类的equals()成员方法
    • Object类的finalize()方法和clone()成员方法

Object

Object类中成员方法:public int hashCode()public final Class getClass()public String toString()public boolean equals(Object obj)protected void finalize()protected Object clone()
Object类的hashCode()和getClass()成员方法

Object:类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。
每个类都直接或者间接的继承自Object类。

Object类的方法:public int hashCode():返回该对象的哈希码值。(该值多次执行是会变化的,是因为内存空间被占了,重新分配了新的内存)注意:哈希值是根据哈希算法计算出来的一个值,这个值和地址值有关,但是不是实际地址值。你可以理解为地址值。public final Class getClass():返回此 Object 的运行时类Class类的方法:public String getName():以 String 的形式返回此 Class 对象所表示的实体Class类就是字节码对象所说的类。

代码演示

 */
public class StudentTest {public static void main(String[] args) {Student s1 = new Student();System.out.println(s1.hashCode()); // 11299397Student s2 = new Student();System.out.println(s2.hashCode());// 24446859Student s3 = s1;System.out.println(s3.hashCode()); // 11299397System.out.println("-----------");Student s = new Student();Class c = s.getClass();String str = c.getName();System.out.println(str); // cn.itcast_01.Student//链式编程String str2  = s.getClass().getName();System.out.println(str2);}
}
Object类的toString()成员方法

总结:ObejcttoString()方法输出的信息,是没有任何意义,建议所有的子类都应该重写该方法。
public String toString():返回该对象的字符串表示。

Integer类下的一个静态方法:public static String toHexString(int i):把一个整数转成一个十六进制表示的字符串

但是这个信息是没有任何意义的。所以,建议所有子类都重写该方法。
怎么重写呢?
把该类的所有成员变量值组成返回即可。
重写的最终版方案就是自动生成toString()方法。

注意:直接输出一个对象的名称,其实就是调用该对象的toString()方法。

代码演示

class Student {private String name;private int age;public Student() {super();}public Student(String name, int age) {super();this.name = name;this.age = age;}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;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + "]";}// @Override// public String toString() {// // return super.toString();// // return "hello";// return "姓名:" + name + ",年龄:" + age;// }}public class StudentDemo {public static void main(String[] args) {Student s = new Student();System.out.println(s.hashCode());System.out.println(s.getClass().getName());System.out.println("--------------------");System.out.println(s.toString());// cn.itcast_02.Student@42552cSystem.out.println("--------------------");// toString()方法的值等价于它// this.getClass().getName()+'@'+Integer.toHexString(this.hashCode())// getClass().getName() + '@' + Integer.toHexString(hashCode())// cn.itcast_02.Student@42552c// cn.itcast_02.Student@42552cSystem.out.println(s.getClass().getName() + '@'+ Integer.toHexString(s.hashCode()));System.out.println(s.toString());// 直接输出对象的名称System.out.println(s);}
}
Obejct类的equals()成员方法
public boolean equals(Object obj):指示其他某个对象是否与此对象“相等”。
这个方法,默认情况下比较的是地址值。比较地址值一般来说意义不大,所以我们要重写该方法。
怎么重写呢?
一般都是用来比较对象的成员变量值是否相同。
重写的代码优化:提高效率,提高程序的健壮性。
最终版:其实还是自动生成。看源码:public boolean equals(Object obj) {//this - s1//obj - s2return (this == obj);}**==:**基本类型:比较的就是值是否相同引用类型:比较的就是地址值是否相同**equals:**引用类型:默认情况下,比较的是地址值。不过,我们可以根据情况自己重写该方法。一般重写都是自动生成,比较对象的成员变量值是否相同

代码演示
从写equals第一版

//Student类
class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public int getAge() {return age;}//重写父类equals()方法@Overridepublic boolean equals(Object obj) {//向下转型Student s = (Student)obj;return this.name.equals(s.name)&&this.age==s.age;}
}
//Student测试类
public class StudentDemo {public static void main(String[] args) {//比较对象中的姓名和年龄是否相等Student s1 = new Student("格雷福斯",23);Student s2 = new Student("卡特琳娜",18);//没有重写equals()方法事前,使用的是Obeject的,默认比较的是地址值。//System.out.println(s1.equals(s2)); true//重写父类Object的equals()方法System.out.println(s1.equals(s2));//false}
}

从写equals第二版(优化版)
代码演示

 class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public int getAge() {return age;}//重写父类equals()方法@Overridepublic boolean equals(Object obj) {//如果两个对象是一致,直接返回true,提高了效率。if(this==obj){return true;}//向下转型Student s = (Student)obj;return this.name.equals(s.name)&&this.age==s.age;}
}

从写equals第三版(改错版)
从写 public boolean equals(Object obj)方法如果传入是一个其他类型比如说Demo
向下转型把Demo类型转为Student类型报错,类型转换出错

加上下面代码就好了
if(obj instanceof Student){return false;}
package com.ginger.demo01;public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public int getAge() {return age;}//重写父类equals()方法@Overridepublic boolean equals(Object obj) {//如果两个对象是一致,直接返回true,提高了效率。if(this==obj){return true;}//如果传入对象不属于Student直接放回false;if(obj instanceof Student){return false;}//向下转型Student s = (Student)obj;return this.name.equals(s.name)&&this.age==s.age;}
}

从写equals第四版(最终版)其实和第三版一样
if (o == null || getClass() != o.getClass()) return false;
上面一段代码getClass() != o.getClass()的意思,是获取字节码文件对象,同一个类的字节码文件对象在内存中,只会有一个。

代码演示

public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public int getAge() {return age;}/*//重写父类equals()方法@Overridepublic boolean equals(Object obj) {//如果两个对象是一致,直接返回true,提高了效率。if(this==obj){return true;}//如果传入对象不属于Student直接放回false;if(obj instanceof Student){return false;}//向下转型Student s = (Student)obj;return this.name.equals(s.name)&&this.age==s.age;}*/@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age &&Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}
Object类的finalize()方法和clone()成员方法

protected void finalize():当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。用于垃圾回收,但是什么时候回收不确定。
protected Object clone():创建并返回此对象的一个副本。
因为clone()方法被protected修饰只能在子类中使用,在其他的类中使用不了,所以要从写该方法。
A:重写该方法

Cloneable:此类实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。
这个接口是标记接口(没有方法和属性),告诉我们实现该接口的类就可以实现对象的复制了。
为什么要使用标记接口,如果每个类都可以被复制,是不合理的只有实现了Cloneable接口才可以复制。

代码演示

//Student实体类
class Student implements Cloneable{private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public int getAge() {return age;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}}//Studnet测试类
public class StudentDemo {public static void main(String[] args) throws CloneNotSupportedException {//比较对象中的姓名和年龄是否相等Student s1 = new Student("格雷福斯",23);//直接调用不可以,因为该方法被protected修饰只能在Student中使用//s.clone();//在Student重写clone()方法Object c = s1.clone();//向下转型(复制的对象)Student s2 = (Student)c;//将s1对象引用赋值给s3Student s3 = s1;System.out.println(s1.getName()+"---"+s1.getAge());System.out.println(s2.getName()+"---"+s2.getAge());System.out.println(s3.getName()+"---"+s3.getAge());System.out.println("------------------------------");//我将s3姓名和年龄重新赋值,因为s1和s3地址值是一样的。他们的姓名和年龄都会变成亚索---30s3.setName("亚索");s3.setAge(30);System.out.println(s1.getName()+"---"+s1.getAge());System.out.println(s2.getName()+"---"+s2.getAge());System.out.println(s3.getName()+"---"+s3.getAge());}
}

结果:
结果分析
只有和s1和s3结果变了,因为s1的引用已经赋值给了s3,s3重新设置值所以姓名为亚索年龄是30
s2没有变化,是因为在第一次复制的时候,就记录下了值,s3后面在怎么改变属性值,不会影响已经记录下来的值。

格雷福斯---23
格雷福斯---23
格雷福斯---23
------------------------------
亚索---30
格雷福斯---23
亚索---30

day12Java-Object相关推荐

  1. 在kotlin companion object中读取Bean,注入Bean对象

    在kotlin companion object中读取Bean,注入Bean对象 在使用kotlin时,或多或少地会使用到一些公共组件,如 http. mongo. redis相关的组件.   使用组 ...

  2. 在kotlin companion object中读取spring boot配置文件,静态类使用@Value注解配置

    在kotlin companion object中读取配置文件 静态类使用@Value注解配置 class Config {@Value("\${name}")fun setNam ...

  3. Object的finalize()方法的作用是否与C++的析构函数作用相同

    Object的finalize()方法的作用是否与C++的析构函数作用相同 public class Finalization {private static Finalization finaliz ...

  4. libgstreamer-1.0.so.0: cannot open shared object file: No such file or directory

    1. 问题现象 error while loading shared libraries: libgstreamer-1.0.so.0: cannot open shared object file: ...

  5. RuntimeError: Expected object of backend CUDA but got backend CPU for argument

    RuntimeError: Expected object of backend CUDA but got backend CPU for argument #4 'mat1' 原因:变量没有加cud ...

  6. RuntimeError: Expected object of device type cuda but got device type cpu for argument pytorch数据位置

    RuntimeError: Expected object of device type cuda but got device type cpu for argument #2 'target' i ...

  7. Python错误:AttributeError: 'generator' object has no attribute 'next'解决办法

    今天在学习生成器对象(generation object)运行以下代码时,遇到了一个错误: #定义生成器函数 def liebiao(): for x in range(10): yield x #函 ...

  8. Java OOP(Object Oriented Programming)个人理解及总结

    面向对象编程(Object Oriented Programming,OOP,面向对象程序设计) 其三大特征:封装,继承,多态: 封装:解决数据的安全问题. 继承:解决代码的重用问题. 多态:解决程序 ...

  9. 目标检测数据集The Object Detection Dataset

    目标检测数据集The Object Detection Dataset 在目标检测领域,没有像MNIST或Fashion MNIST这样的小数据集.为了快速测试模型,我们将组装一个小数据集.首先,我们 ...

  10. 多尺度目标检测 Multiscale Object Detection

    多尺度目标检测 Multiscale Object Detection 我们在输入图像的每个像素上生成多个锚框.这些定位框用于对输入图像的不同区域进行采样.但是,如果锚定框是以图像的每个像素为中心生成 ...

最新文章

  1. 程序员转型AI,成功几率有几分?
  2. 关于HTML Object中三个Style实例的区别
  3. java、上转型对象
  4. dell r740如何做raid_戴尔入门级4K、IPS广色域显示器:S2721QS表现如何?
  5. struts2学习笔记(常见错误)
  6. 【转载】广告系统架构解密
  7. Makefile 入门教程
  8. sigmoid函数求导_吴恩达老师课程笔记系列第 28节 - 逻辑回归之代价函数 (4)
  9. 关于Unicode字符集
  10. 2020身高体重标准表儿童_2020儿童身高标准表出炉,10岁长到1米4才合格,你家娃达标了吗...
  11. 什么叫嵌入式开发 嵌入式开发的要求
  12. 最新易支付多功能系统源码+全开源
  13. 上海会计师事务所选哪家?
  14. html打开网页过场动画_一款谷歌(Google)打造的广告网页设计制作软件
  15. unity 模型销毁_Unity中销毁游戏对象的方式
  16. 抖音什么题材最吸粉 抖音发什么内容容易火
  17. Python 数据可视化基础教程
  18. sg-uap mysql_SG-UAP常用注解介绍
  19. (滁院20级计科专用)期末考试复习-计组
  20. 购买商品复选框全选 单选

热门文章

  1. 多多自走棋改动_多多自走棋:新版本改动,装备继承终于出现,祝福功能备受欢迎...
  2. Opencv——图像添加椒盐噪声、高斯滤波去除噪声原理及手写Python代码实现
  3. qiankun原理解析
  4. oracle创建表执行时间好长,Oracle数据库建表语句连续执行的问题
  5. java批量执行查询sql语句_如何从Java执行多个SQL语句
  6. Servlet入门总结及第一个Servlet程序
  7. 本、硕、博到底有什么区别?清华教授的“兔子理论”让你快速弄懂
  8. VFW-MFC视频采集
  9. win10开机自动静音解决办法
  10. java queryinterface_COM编程中的接口查询QueryInterface的实现原理