Object

Object:

1、在Java类继承结构中,java.lang.Object类位于顶端;

2、如果定义一个Java类时没有使用extends关键字声明其父类,则其父类型默认为java.lang.Object类。

3、Object类型的引用变量可以指向任何类型对象。

4、Object中的方法默认被子类继承。

Object中的方法:

1、toString()方法: 用于返回当前这个对象的文本描述。

1)、Java认为任何对象都可以用文字描述,所以Object类上定义了toString()方法,任何类型都继承了这个方法。

2)、建议子类重写这个方法,提供具体的文本描述。

3)、一般都在子类中重写这个方法。

4)、java很多API会回调这个方法的结果

        println(obj),就会回调toString()

public class DemotoString {

	public static void main(String[] args) {
		Person p=new Person("Tom",12);
		System.out.println(p);//自动回调toString()方法
	}

}
class Person{
	String name;
	int age;
	public Person(String name,int age) {//利用构造函数初始化
		this.name=name;
		this.age=age;
	}
	public String toString() {//若不重写,调用Object的方法,结果为类名@散列码
		return name+","+age;
	}
}

       5)、Java几乎所有的API类都重写了toString

              如:String、 StringBuilder类也重写了toString

       6)、如何重写toString():一般返回属性(密码不能返回,就泄密了)

2、equals()方法:

1)、Object中的方法,作用在于检测一个对象是否等于另外一个对象;

2)、在Object类中,这个方法用于判断两个对象是否具有相同的引用,即是否为相同的对象;

3)、在实际应用中,一般需要重写该方法,通过比较对象的成员属性,使该方法有意义。例如,对于Cell类,如果不重写equals方法,cell1和cell2在指向同一个对象时才为true,可以将其重写为:当x坐标和y坐标相等时两个对象即相等,这样才有意义。

4)、String的equals方法用于比较两个字符串对象的字符序列是否相等。

5)、StringBuilder没有重写equals方法。

        public void testEquals() {
		Cell c1=new Cell(4,5);
		Cell c2=new Cell(3,4);
		Cell c3=c1;
		Cell c4=new Cell(4,5);
		//c1和c3引用了同一个对象Cell(4,5)
		//c2引用了对象Cell(3,4)
		//c4引用了对象Cell(4,5)
		//c1和c4引用的不是同一个对象,但是在业务逻辑上c1和c4引用的对象是"相等的",不是同一个对象
		//Object的默认的equals方法,同一个对象就是true,否则就是false
		System.out.println(c1.equals(c2));//false
		System.out.println(c1.equals(c3));//true
		System.out.println(c1.equals(c4));//false
		//以上结果说明:默认的equals不能比较对象逻辑上相等,所以建议子类重写为自定义的对象比较逻辑。建议根据业务规则比较相等。
	}
	class Cell{
		int row;
		int col;
		public Cell(int row,int col) {
			this.row=row;
			this.col=col;
		}
	}
	
	public void testEquals2() {
		Point p1=new Point(3,4);
		Point p2=new Point(4,5);
		Point p3=p1;
		Point p4=new Point(3,4);
		Point p5=null;
		//重写的equals方法实现了业务逻辑层面的“对象相等”
		System.out.println(p1.equals(p2));//false
		System.out.println(p1.equals(p3));//true
		System.out.println(p1.equals(p4));//true
		System.out.println(p1.equals(p5));//false
		System.out.println(p1.equals(p1));//true
		System.out.println(p1.equals("3,4"));//false,p1是Point类型,"3,4"是字符串类型,在java中字符串永远可以传递给object,
		                                     //因为object可以引用任何类型
		//equals方法的重写是"模式化"的方案,要使用直接将重写的拷贝过去改一下就行,模式不用改
	}
	class Point{
		int x;
		int y;
		public Point(int x,int y) {
			this.x=x;
			this.y=y;
		}
		public boolean equals(Object obj) {
			if(obj==null) {//若传进来的参数(p5)是空的,就认为是不相等
				return false;
			}
			if(this==obj) {//当前对象(p1)this和引用参数这个对象(p3)相等,返回true
				return true;
			}
			if(obj instanceof Point) {//检查传进来的obj是不是Point类型,如果不是,直接返回false
				Point other=(Point)obj;//若是Point类型,将obj转换为Point,因为obj本身没有x,y属性,Point才有,所以必须强转
				return this.x==other.x&&this.y==other.y;
			}
			return false;
		}
	}
	
	public void testEquals3() {
		String s1=new String("abc");
		String s2=new String("abc");
		String s3=new String("ABC");
		//String的equals方法用于比较两个字符串对象的字符序列是否相等。
		System.out.println(s1.equals(s2));//true
		System.out.println(s1.equals(s3));//false
		System.out.println(s1.equalsIgnoreCase(s3));//true,equalsIgnoreCase忽略大小写
		
		//StringBuilder没有重写equals方法
		StringBuilder ss=new StringBuilder("abc");
		StringBuilder ss2=new StringBuilder("abc");
		StringBuilder ss3=new StringBuilder("ABC");
		System.out.println(ss.equals(ss2));//false
		System.out.println(ss.equals(ss3));//false
		
		//Integer重写了equals方法
		Integer i1=new Integer(5);
		Integer i2=new Integer(5);
		Integer i3=new Integer(7);
		System.out.println(i1.equals(i2));//true
		System.out.println(i1.equals(i3));//false
	}		

equals和==的区别:

1、==用于比较变量的值,可以应用于任何类型,如果用于引用类型,比较的是两个引用变量中存储的值(地址信息),判断两个变量是否指向相同的对象;

2、equals是Object的方法,重写以后,可以用于比较两个对象的内容是否“相等“;

3、需要注意的是,Object默认的quals方法的比较规则同==

public void testEquals4() {
		int i=4;//i在内存中的存储形式:00000000 00000000 00000000 00000100
		int n=4;//n在内存中的存储形式:00000000 00000000 00000000 00000100
		System.out.println(i==n);//true,i与n按位比较是否相等
		String s1=new String("abc");//s1是new String("abc")这个对象的首地址,
		String s2=s1;//赋值,赋值了地址数值
		System.out.println(s1==s2);//true,比较的是数字也就是首地址是否相等,不是比较的对象!==是用来比较值是否相等。
		//==不能用于比较对象是否相等!
		//==也不能用于比较字符串是否相等!
		System.out.println(s1.equals(s2));//true,比较的是引用是不是同一个对象
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值