Object类
API—Application Programming Interfaces(提供一系列的接口以及接口下的类)
API里提供的所有方法要么是被protected修饰要么就是不写(public)
1.概念
Object类是java的顶级父类,每个类默认继承Object类。
2.重要方法
1.clone():把原对象的属性值赋值到新对象中并且把新对象进行返回
类实现Cloneable接口产生对象才能支持克隆操作
//当接类实现Cloneable口产生的对象就能支持克隆操作
//Cloneable接口是空接口没有内容
//当类实现接口时会给类添加一个标记,类产生的每个对象都会有这个标记
//当做克隆操作时检测出对象有标记就可以进行正常的克隆操作
public class ObjectDemo1 implements Cloneable{
int i=1;
public static void main(String[]args)throws CloneNotSupportedException{
//创建对象(Object类的子类对象)
Object Demo1od=new ObjectDemo1();//调用父类Object类里clone方法
//Alt+回车---提示键
//CloneNotSupportedException----克隆不支持异常
Object Demo1od1=(ObjectDemo1)od.clone();
//克隆对象属性值和原对象的属性值一致
//System.out.println(od1.i);
//false把原对象的属性值赋值到新对象中
System.out.println(od==od1);
}
}
2.finalize():通知系统进行垃圾回收
3.getClass():返回的Object的实际创建类的类型(包名+类名)
/*//创建对象 Object Demo2od=new ObjectDemo2(); Objectod1=new ObjectDemo2(); //包名+类名 System.out.println(od.getClass()); //Object的实际创建类类型 System.out.println(od1.getClass());*/
4.hashcode():返回对象的哈希码值
哈希码值(1.取值范围广、2.散列分布—不会出现重复)
//不同对象的哈希码值不一样
//哈希码值特点(1.取值范围广(41亿左右)2.散列分布(均匀分布))
//哈希码值是不会重复---内存地址值要唯一---用哈希码值代表地址值
System.out.println(new Object().hashCode());
//把十进制转成十六进制
System.out.println(Integer.toHexString(new Object().hashCode()));
5.toString():拼接对象地址值
为了获取的是对象的属性值需要重写toString()
public class ObjectDemo3{
public static void main(String[]args){
//创建对象
/*Object Demo3od=new ObjectDemo3(); //od对象传入到底层valueOf()中要去调用Object类里toString() //Object类里的toString方法默认给对象来拼接地址值 System.out.println(od); //od对象直接调用Object类里toString()来拼接地址值 System.out.println(od.toString());*///
Person p=new Person();
p.name="豆豆";
p.age=10;
p.gender='男';//调用Person类重写toString方法来输出对象属性值
System.out.println(p);
}
}
//
class Person{
String name;
char gender;
int age;//重写Object类里toString方法,为了获取对象的属性值
//Ctrl+O---展示出可以重写的方法
/*@Override publicStringtoString(){ returnthis.name+","+this.gender+","+this.age; }*///java自动生成
@Override
public String toString(){
return"Person{"+
"name='"+name+'\''+
",gender="+gender+
",age="+age+
'}';
}
}
6.equals():根据对象地址值来判断对象是否相等
为了更加全面的来判断对象是否相等根据对象地址值以及对象属性值来综合判断。需要重写equals方法(1.对象地址值 2.参数对象是否为null 3.两个对象类型 4.比较属性值)
import java.util.Objects;public class ObjectDemo4{
public static void main(String[]args){
//创建对象
Student s1=new Student();
s1.name=null;
s1.age=10;
s1.gender='男';
Student s2=new Student();
s2.name=null;
s2.age=10;
s2.gender='男';
//Object类里equals方法是根据对象地址值来判断对象是否相等
System.out.println(s1.equals(s2));
}
}
class Student{
//属性
String name;
int age;
char gender;//根据对象地址值以及属性值来综合判断对象是否相等
//需要重写equals方法
/*@Override public boolean equals(Object obj){ //1.判断对象地址值是否相等 if(this==obj){ return true; }//2.判断参数对象是否为null if(obj==null){ return false; }//3.判断两个对象的类型是否一致 //把所有类型不同的情况都排除掉 if(this.getClass()!=obj.getClass()){ return false; } //当代码执行到此行表面从逻辑上两个对象的类型一致 //但是从语法上而言两个对象的类型不一致 Students=(Student)obj;//4.比较对象的属性值//比较两个对象的年龄 if(this.age!=s.age){ return false; }//比较两个对象的性别 if(this.gender!=s.gender){ returnfalse; }//比较两个对象的姓名 //根据两个那么对象的地址值来判定name对象相等 //name对象是String类型调用的是String类重写的equals方法 //重写的方法---先比较对象地址值再比较对象的内容 if(this.name==s.name||this.name!=null&&this.name.equals(s.name)){ return true; } //两个对象的name属性不相等 returnfalse;}*/
//java自动生成的
@Override
public 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&&
gender==student.gender&&
Objects.equals(name,student.name);
}
@Override
public int hashCode(){
return Objects.hash(name,age,gender);
}
}
练习:
1.Teacher类(String name,int age,char gender,String dept 重写equals方法)
public class ObjectText{
}
class Teacher{
//属性
String name;
int age;
char gender;
String dept;
//重写equals方法
@Override
public boolean equals(Object obj){
//1.判定对象地址值是否相等
if(this==obj){
return true;
}
//2.判定参数对象是否为null
if(obj==null){
return false;
}
//3.判断两个对象类型是否一致
if(this.getClass()!=obj.getClass()){
return false;
}
//强转
Teachert=(Teacher)obj;
//4.比较属性
//比较两个对象的年龄
if(this.age!=t.age){
return false;
}
//比较两个对象的性别
if(this.gender!=t.gender){
return false;
}
//比较两个对象的名称是否一致
if(!(this.name==t.name||this.name!=null&&this.name.equals(t.name))){
return false;
}
//比较两个对象的部门是否一致
if(this.dept==t.dept||this.dept!=null&&this.dept.equals(t.dept)){
return true;
}
return false;
}
}