Java继承四:Object类,包括equals()方法,toString()方法。(String类重写这两个方法)

1.Object类

       equals(Object obj)方法:判断调用equals方法的引用和传进来的参数对象引用,两个引用是否一致,即这两个引用是否指向的是同一块内存地址,返回值为boolean;即一个类中,如果没有重写equals方法,那么此时该类(继承过来的)equals方法和“==”的作用是一样的,所以,equals是在类型中经常重写的一个方法;(如String类中重写了equals方法,使其的作用是判断两个字符串的值是否相等);

Java继承四:Object类,包括equals()方法,toString()方法。(String类重写这两个方法)

Java继承四:Object类,包括equals()方法,toString()方法。(String类重写这两个方法)


两个特殊情况:关于String类本身的问题

Java继承四:Object类,包括equals()方法,toString()方法。(String类重写这两个方法)Java继承四:Object类,包括equals()方法,toString()方法。(String类重写这两个方法)

以下为上述现象的解:(参考https://www.cnblogs.com/taochen-go/p/9475947.html

Java继承四:Object类,包括equals()方法,toString()方法。(String类重写这两个方法)

代码详解

  1. 首先,通过main()方法进栈。
  2. 然后再栈中定义一个对象s1,去堆中开辟一个内存空间,将内存空间的引用赋值给s1,“hello”是常量,然后去字符串常量池 查看是否有hello字符串对象,没有的话分配一个空间存放hello,并且将其空间地址存入堆中new出来的空间中。
  3. 在栈中定义一个对象s2,然后去字符串常量池中查看是否有”hello”字符串对象,有,直接把”hello”的地址赋值给s2.
  4. 即s1中存的是堆中分配的空间,堆中分配的空间中存的是字符串常量池中分配空间存放”hello”的空间的地址值。而s2中之间存的是字符串常量池中分配空间存放”hello”的空间的地址值。
  5. 由于s1与s2中存放的地址不同,所以输出false。因为,类String重写了equals()方法,它比较的是引用类型的 的值是否相等,所以输出true。即结果为false、true。

即上述涉及到:在创建String变量时,其字符串常量创建和指向的过程需要明确,


重写equals()方法:

根据实际业务需求,可以重写目标类的equals方法,根据实际业务需求设计自己的equals方法逻辑即可;

(又一次体现了对继承方法的重载,当然子类可以不重写继承自父类的方法,而只是重载这个方法也行;且下面也体现了引用判null)

Java继承四:Object类,包括equals()方法,toString()方法。(String类重写这两个方法)


另一个常重写的方法是:toString()方法:

Java继承四:Object类,包括equals()方法,toString()方法。(String类重写这两个方法)

Java继承四:Object类,包括equals()方法,toString()方法。(String类重写这两个方法)

常见的重写格式如下:一般也是根据具体类的业务需求去重写:(比如String类就重写了toString方法,其返回的是字符串的值)

 一般来说,根据以往经验,常在bean类中重写toString方法,该方法返回该类所有属性的字符串;

注:(1)Java的基本数据类型没有上述equals()和toString()的,字符串String是个类,有上述的equals()和toString();

       (2)Java中不允许被重写的方法:1.final 修饰的 、2.static 修饰的 、3.private 修饰的:因为私有的在子类中不可见 、4.如果跨包的话,修饰符缺省的也不能被重写,因为缺省的挎包不可见