javaObject类型

Object类位于Java.lang包中,java.lang.Object类 对象(物体、客体、东西)

  • 所有类的 根类/顶层父类 都是Object类型,一切皆对象
    Object类型的引用变量,可以指向任何一个对象。
    定义Java类时如果没有显示的指明父类,就默认继承了Object类,
  • 例如
public class Demo{
    //...
}
  • 实际上是下面代码的简写形式:
- public class Demo extends Object{
            //...
}
  1. Object类中,封装了所有类的共有方法(11个)
clone()
1
 equals(Object obj)  *
1
 finalize()
1
 getClass()
1
 hashCode()  *
1
 notify()
1
 notifyAll()
1
 toString()  *
1
 wait()
1
 wait(long timeout)
1
 wait(long timeout, int nanos)

equals()方法

(1)基本数据类型,直接使用比较数值是否相等
(2)引用类型变量的比较
使用等号比较时比较的是引用变量的地址值,即:判断的是两个引用变量是否指向同一个对象
使用equals()时,是比较引用变量所指向对象 中的内容/属性是否是相同的
(3)如果子类中,没有重写equals()方法,会沿用父类中默认的写法,简单的比较地址值是否一样

public boolean equals(Object obj) {
  	return (this == obj);
}

(4)实际开发中,在自定义封装类型时必须重写equals()方法
代码重写时,只需要关注类中核心的属性是否相同即可

封装像素点类型:Point {x,y,color...}

在比较具体属性之前,提前关注:null,自身对象,类型是否一致
(5)equals()方法,更加偏向于,从业务角度上考虑,两个对象(内容)是否是一样的。
(6)API中大多数类型,都重写了equals()方法

Integer, String, Date ...

比如:

Point p1 = new Point(200, 100, Color.RED);
	  Point p2 = new Point(200, 101, Color.RED);
	  Point p3 = new Point(200, 100, Color.BLUE);
	  System.out.println("p1和p2引用变量地址值的比较:" + (p1==p2) );//false
	  System.out.println("p1和p2引用的对象内容比较:" + p1.equals(p2) );//false
	  System.out.println("p1和p1引用变量地址值的比较:" + (p1==p1) );//true
	  System.out.println("p1和p1引用的对象内容比较:" + p1.equals(p1) );//true
	  System.out.println("p1和p3引用变量地址值的比较:" + (p1==p3) ); //false
	  System.out.println("p1和p3引用的对象内容比较:" + p1.equals(p3) ); //true

hashCode()方法

(1)在重写equals()方法,可同时重写hashCode()方法
(2)重写hashCode()方法的目的,为了更好地支持HashMap集合工具中的hash算法(后面详细讲)
(3)重写的要求:
a. hashCode()算法中涉及到的关键属性要和equals()方法保持一致
b. 对象相同equals方法为true,hashCode方法的返回值必须相同
c. 对象不同equals方法为false,hashCode方法的返回值尽可能不同
d. hashCode方法具体编写时,没有规定的格式,只要保证以上三点,以及数值是散列的即可
(4)可以直接使用IDE开发工具,帮着编写hashCode()算法

  • 例如:(坐标实现哈希方法)
@Override //类中
	public int hashCode() {
		return this.x*10000 + this.y*100;
	}
//主方法中,p1,p2的值为上面equals方法用到的
    int code1 = p1.hashCode();
	int code2 = p2.hashCode();
	int code3 = p3.hashCode();
	System.out.println("p3的哈希散列值是:" + code3);
// p3的关键属性/核心属性,和p1是一样的,得到的散列值一样!正确!好事!
// p1和p3进行equals比较为true,hashCode得到的值应该保持一致!
	System.out.println("p1的哈希散列值是:" + code1);
	System.out.println("p2的哈希散列值是:" + code2);
	// p1 和 p2得到的散列值的确是散开的,符合算法要求

结果:p1的哈希散列值是:2010000
      p2的哈希散列值是:2010100
      p3的哈希散列值是:2010000

toString()方法

(1)方法返回对象的文本描述信息,尽可能将对象说明清楚
(2)Object类型中,toString()的实现代码是:

return getClass().getName() + "@" + Integer.toHexString(hashCode());

返回的内容是:对象的完整类型名,拼接@符号,再拼接对象哈希码值的十六进制形式;
(3)实战时,该方法一般用于测试打印,可直接调用IDE工具中的菜单重写该方法就可;
(4)使用打印输出对象时,默认会调用这个toString()方法。

System.out.println(p1);
// 直接输出对象时,会先调用对象的toString()方法,得到文本描述信息,再输出
System.out.println(p2.toString());
// 一般toString()是可以省略,不用写!
System.out.println(p3.toString());

结果为:
Point [x=200, y=100, color=java.awt.Color[r=255,g=0,b=0]]
Point [x=200, y=101, color=java.awt.Color[r=255,g=0,b=0]]
Point [x=200, y=100, color=java.awt.Color[r=0,g=0,b=255]]

暂时到这,后续再整理