【JAVA_SE学习笔记】Object类
Object 类是类层次结构的根类。每个类都使用 Object 作为超类(父类)。所有对象(包括数组)都实现这个类的方法
常用方法:
1. public int hashCode()
返回该对象的哈希码值
hashCode()—–>通过哈希算法(哈希表:hashtable)—->地址值(不是实际意义上的地址值!)
2. public final Class getClass()
返回此 Object 的运行时类 (Java反射机制中讲!)
Class类中有一个方法:
public String getName()以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称(全路径名称)
3. public String toString()
返回该对象的字符串表示(建议所有子类都重写此方法)
默认情况返回的字符串:完整类名+@+哈希码
直接输出一个对象,其实就是输出该对象的toString方法返回的字符串
toStirng源码:
public String toString() {
return this.getClass().getName() + "@" + Integer.toHexString(this.hashCode());
}
可以方法重写,通过toString方法返回对象信息
4. public boolean equals(Object obj)
指示其他某个对象是否与此对象“相等”
判断两个对象是否为同一个对象,默认是比较的内存地址
equals()方法的源码:
public boolean equals(Object obj) {
return (this == obj);
}
由于Object类中的equals()方法底层是通过”==”来实现的,所以默认比较的是地址值,如果想比较内容是否相同,需要重写equals()方法
5.protected void finalize()throws Throwable
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法,但是,什么时候调用垃圾回收器不确定
System类中的一个方法:
public void gc();运行垃圾回收器,这个垃圾回收器最终调用的就是finalize()方法
6.protected Object clone()throws CloneNotSupportedException
创建并返回此对象的一个副本
注意:Object 类的 clone 方法执行特定的复制操作。首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException
要去使用clone()方法,当前对象所在的类一定要实现cloneable接口
举例:
public class Demo1 {
public static void main(String[] args)throws CloneNotSupportedException{
Object o = new Object();
System.out.println(o.hashCode());//648199445 输出哈希值
System.out.println(o.toString());//java.lang.Object@26a2bd15
System.out.println(o);//java.lang.Object@26a2bd15 直接输出一个对象,等于输出toString方法输出的字符串
Class c=o.getClass();
System.out.println(c.getName());//java.lang.Object 获取当前正在运行的这类的全路径名称!
Student s1=new Student("张三");
System.out.println(s1.name);//张三
//复制s1这个对象
Object obj = s1.clone() ;
//向下转型:
Student s2 = (Student) obj;
System.out.println(s2.name);//张三
}
}
//要去使用clone()方法,当前对象所在的类一定要实现Cloneable接口
class Student implements Cloneable{
String name;
public Student() {
}
public Student(String name) {
this.name = name;
}
//重写clone方法
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
java规范:一般在重写equals方法时都会重写hashCode方法
==和equal()方法的区别:
==:比较的是两个对象的地址值是否相同
equals()方法:默认比较的是两个对象的地址值是否相同,如果重写了Object类中的equals()方法,那么默认比较就是两个对象的内容是否相同
举例:
public class Demo2 {
public static void main(String[] args) {
Person p1=new Person("狗蛋",15);
Person p2=new Person("狗蛋",15);
Person p3=new Person("狗剩",23);
System.out.println(p1.equals(p2));//true
System.out.println(p1.equals(p3));//false
}
}
class Person{
String name;
int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
return super.hashCode();
}
@Override
public boolean equals(Object obj) {
if(this==obj){//是否为同一对象
return true;
}else if(this==null){//传来的对象是否为空
return false;
}else if(this.getClass()!=obj.getClass()){//运行时类是否一样
return false;
}
//比较对象数据信息是否一样
Person p=(Person) obj;
if(p.name!=this.name){
return false;
}else if(p.age!=this.age){
return false;
}
return true;
}
}