1.clone()
把原对象中属性值拷贝到新对象中并且返回新对象类
需要实现Cloneable接口产生的对象才支持克隆
//类实现Cloneable接口产生的对象支持克隆操作
//Cloneable接口中没有任何内容只是给类增加标记,标记可以支持克隆操作
public class ObjectDemo1 implements Cloneable{
int i=2;
public static void main(String[] args) throws CloneNotSupportedException {
//创建对象
ObjectDemo1 od=new ObjectDemo1();
//通过对象调用clone方法返回克隆对象
//方法返回值的类型是Object需要强转成对象的对应的类型
//CloneNotSupportedException---克隆不支持异常
ObjectDemo1 od1= (ObjectDemo1) od.clone();
//输出的克隆对象的属性值和原对象的属性值一致
System.out.println(od1.i);
//false---是把原对象里的属性值复制一份到新对象中并且返回javax(java扩展包)org(第三方厂商的包 Apache )新对象
System.out.println(od1==od);
}
2.finalize()
通知系统进行垃圾回收
3.getClass()
返回Object的实际创建类的类型(本质是返回的是对象的类型---包名+类名)
public class ObjectDemo2 {
public static void main(String[] args) {
//返回的就是对象的类型
ObjectDemo2 od=new ObjectDemo2();
//
System.out.println(od.getClass());
//返回的是Object的实际创建类的类型(包名+类名)
Object od1=new ObjectDemo2();
System.out.println(od1.getClass());
}}
4.hashcode()
返回对象的哈希码值,不同对象的哈希码值不一样
哈希码特点(取值范围广、散列分布---唯一的---代表内存地址值)
//对象不一样,哈希码值也不一样
//哈希码值取值范围有41亿左右,取值范围很大,重复概率极低
//哈希码值是散列分布,可以进行均匀分布
//根据以上两个特点可得数据重复的概率几乎不会出现---取值是唯一的
//内存地址值不能重复只能是唯一的---用哈希码值来表示地址值
System.out.println(new Object().hashCode());
System.out.println(Integer.toHexString(new Object().hashCode()));
5.toString()
Object类里的toString方法是拼接对象地址值来返回
希望操作对象看到的是对象属性值而不是地址值需要重写Object类里toString方法以后定义类需要重写toString方法
public class ObjectDemo3 {
public static void main(String[] args) {
//
Object o1=new Object();
//底层默认让对象调用Object类里的toString方法来拼接地址值
System.out.println(o1);
//对象调用Object类里toString方法,方法功能是拼接对象地址值
System.out.println(o1.toString());
//
Person p=new Person();
p.setName("lili");
p.setAge(10);
p.setGender('女');
//底层默认让对象去调用重写的toString方法来操作对象的属性值
System.out.println(p);
}
}
//定义代表人的类---父类是Object类
class Person{
//属性
private String name;
private int age;
private char 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;
}
//重写Object类里的toString方法---对象的属性值
//Ctrl+o---提示可以重写的方法
/*@Override
public String toString() {
return this.name+" "+this.age+" "+this.gender;
}*/
//idea提供---Alt+inert---toString
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
'}';
}
}
6.equals()
根据对象地址值来比较两个对象是否相等
想根据对象地址值和对象属性值综合来判断两个对象是否相等需要重写equals方法(1.判断 对象地址值是否相同、2.判 断参数对象是否位null、3.判断两个对象的类型是否一致、4.判断 对象的属性值是否一致(关注引用类型))
public class ObjectDemo {
public static void main(String[] args) {
//创建对象
Person p1=new Person();
//p1.name=new String("lili");
p1.name=null;
p1.age=10;
p1.gender='女';
//创建对象
Person p2=new Person();
p2.name=null;
p2.age=10;
p2.gender='女';
//Object类里的equals方法功能是根据对象地址值来判断两个对象是否相等
//System.out.println(p1.equals(p2));
//调用重写的equals方法根据对象的地址值和属性值来比较对象是否相等
System.out.println(p1.equals(p2));
} }
//
class Person{
String name;
int age;
char gender;
//对Object类里的equals方法进行重写
//实现根据对象地址值以及对象属性值来判断对象是否相等
@Override
public boolean equals(Object obj) {
//1.判断对象地址值是否相同
if(this==obj){//this指代成当前类正在活动对象---前面调用方法的对象
return true;
}
//2.判断参数对象是否为null
if(obj==null){
return false;
}
//3.判断对象的类型是否一致
//把所有不相等的情况判断进去
if(this.getClass()!=obj.getClass()){
return false;
}
//逻辑上执行到这个位置两个对象类型已经相同
//但是从语法上说参数对象的类型是Object,必须强制类型转换为Person类型,在语法上才能调用属性
Person p=(Person) obj;
//4.判断对象的属性值是否相对等
//判断age属性是否相等
if(this.age!=p.age){
return false;
}
//判断gender属性是否相等
if(this.gender!=p.gender){
return false;
}
//判断name属性是否相等(比较地址值)
//String类里有对Object类的equals方法的重写
//重写的功能既比较对象地址值也比较对象的内容
//如果this.name的地址值为null再从null里获取信息
//就会导致报错---NullPointerException
//this.name==p.name这个比较地址值需要加上为了避免出现两个name对象值都为null的情况
if(this.name==p.name||this.name!=null&&this.name.equals(p.name)){
return true;
}
//name属性不相等
return false;
} }