Java学习【阶段一[05]】常用API第二类(01Object类&Objects类)

一、Object类概述

java.lang.Object类是Java语言中的根类,即所有类的父类。它中间描述的方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object。所有对象都实现这个类的方法

如果一个类没有特别指定父类,那么默认继承来自Object类。

二、Object类的toString方法

作用:打印对象的信息

重写前:打印包名类名@地址值

重写后:打印的是对象中的属性值

package Day12_Demo01;

public class Person {
	private String name;
	private int age;
	
	
	public Person() {
		
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	/*
	直接打印对象的地址值没有意义,重写Object类的toString方法
	打印对象的属性(name,age)
	 */
	
	@Override
	public String toString() {
		return "Person [name=" + name + ", 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;
	}
	

}
package Day12_Demo01;
/*
java.lang.Object类
类Object是类层次结构的根(最顶层)类。每个类都使用Object作为超(父)类
所有对象(包括数组)都实现这个类的方法
 */
public class Demo01ToString {
	public static void main(String[] args) {
		/*
		 Person类默认继承了Object类,所以可以使用Object类中的toString方法
		 String toString() 返回该对象的字符串表示
		 */
		Person p=new Person("张三",18);
		String s=p.toString();
		System.out.println(s);//Day12_Demo01.Person@2f92e0f4
		
		//直接打印对象的名字其实就是调用对象的toString方法  p=p.toString();
		System.out.println(p);//Day12_Demo01.Person@2f92e0f4//Person{name=张三+age=18}
		
		/*看一个类是否重写了toString方法,直接打印这个类对应对象的名字即可
		如果没有重写toString方法,那么打印的就是对象的地址值(默认)
		如果重写了toString方法,那么就按照重写的方式打印
		*/
	}
}

三、Object类的equals方法

boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。
         Object类equals类方法的源码:
         public boolean equals(Object obj){
             return(this==obj);
             }
             参数:
             Object obj:可以传递任意的对象
             方法体:
             ==:比较运算符,返回的就是一个布尔值true,false
             基本数据类型:比较的是值
             引用数据类型:比较的是两个对象的地址值

重写前:比较对象的地址值

重写后:比较对象的属性值

package Day12_Demo01;

public class Demo02Equals {
	public static void main(String[] args) {
		/*
		 Person类默认继承了Object类,所以可以使用Object类的equals方法
		 boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。
		 Object类equals类方法的源码:
		 public boolean equals(Object obj){
		     return(this==obj);
		     }
		     参数:
		     Object obj:可以传递任意的对象
		     方法体:
		     ==:比较运算符,返回的就是一个布尔值true,false
		     基本数据类型:比较的是值
		     引用数据类型:比较的是两个对象的地址值
		     this是谁?哪个对象调用的方法,方法中的this就是哪个对象;p1调用的equals方法,所以this就是p1
		     obj是谁?传递过来的参数p2
		     this==obj-->p1==p2
		 */
		Person p1=new Person("迪丽热巴",18);
		Person p2=new Person("古力娜扎",18);
		
		boolean b=p1.equals(p2);
		System.out.println(b);//重写前false
		
		
		boolean c=p1.equals(p2);//重写后true
		System.out.println(c);//true
	}
}

四、重写Object类的equals方法

比较两个对象的地址值没有意义,如何比较其中的参数,需要对equals方法进行重写

@Override
    public boolean equals(Object obj) {
        //使用向下转型(强转)把Object类型转为Person
        Person p=(Person)obj;
        //比较两个对象的属性:一个是调用方法的this(p1),一个是转型之后的p(obj=p2);
        boolean b=this.name.equals(p.name)&&this.age==p.age;
        return b;

package Day12_Demo01;

public class Person {
	private String name;
	private int age;
	
	
	public Person() {
		
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	/*
	直接打印对象的地址值没有意义,重写Object类的toString方法
	打印对象的属性(name,age)
	 */
	
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	/*
	 Object类的equals方法默认比较的是两个对象的地址值,没有意义
	 所以需要重写equals方法,比较两个对象的属性值(name,age)
	 对象的属性值一样返回true,不一样返回false
	 
	 问题:隐含了一个多态
	 Object obj=p2=new Person("古力娜扎",18);
	 多态的弊端:无法使用子类特有的内容(属性,方法)
	 解决办法:可以使用向下转型(强转)把object类型转换为Person类型
	 */
	
	@Override
	public boolean equals(Object obj) {
		//增加一个判断,传递的参数obj如果是this本身,直接返回true,提高程序效率
		if(obj==this) {
			return true;
		}
		//增加一个判断,传递的参数obj是null,直接返回false,提高程序的效率
		if(obj==null) {
			return false;
		}
		/*
		 增加一个判断,是Person类型再进行转换,防止类型转换异常ClassCastException
		 */
		if(obj instanceof Person) {
		//使用向下转型(强转)把Object类型转为Person
		Person p=(Person)obj;
		//比较两个对象的属性:一个是调用方法的this(p1),一个是转型之后的p(obj=p2);
		boolean b=this.name.equals(p.name)&&this.age==p.age;
		return b;
		}
		//不是Person类型直接返回false
		return false;
	}
	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;
	}
	

}
package Day12_Demo01;

import java.util.Random;

public class Demo02Equals {
	public static void main(String[] args) {
		/*
		 Person类默认继承了Object类,所以可以使用Object类的equals方法
		 boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。
		 Object类equals类方法的源码:
		 public boolean equals(Object obj){
		     return(this==obj);
		     }
		     参数:
		     Object obj:可以传递任意的对象
		     方法体:
		     ==:比较运算符,返回的就是一个布尔值true,false
		     基本数据类型:比较的是值
		     引用数据类型:比较的是两个对象的地址值
		     this是谁?哪个对象调用的方法,方法中的this就是哪个对象;p1调用的equals方法,所以this就是p1
		     obj是谁?传递过来的参数p2
		     this==obj-->p1==p2
		 */
		Person p1=new Person("迪丽热巴",18);
		Person p2=new Person("迪丽热巴",18);
		
		Random r=new Random();
		//p1=p2;//p2地址值给p1,两个地址值相同
		boolean c=p1.equals(p2);
		System.out.println(c);//true
	}
}

五、Objects类的equals()方法

比较两个对象是否相同,但是增加了一些健壮性的判断(空指针安全或者容忍空指针),

可以防止空指针异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值