Java的面向对象

13-Object类及其toString()/equals()方法

2021-07-06 366 0

简介 Object类是Java中所有类的父类,其中有比较常用的方法,例如toString()和equals()方法等...

1. Object类的使用

Object类属于java.lang包下

    1.Object类是所有Java类的根父类

    2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类,也就是Object类是所有类的直接父类或间接父类。

    3.Object类中的功能(属性、方法)具有通用性。

      属性:无

      方法:equals() / toString() / getClass() /hashCode() / clone() / finalize()

      wait() 、 notify()、notifyAll()

    4. Object类只声明了一个空参的构造器


2. equals方法


在面试中,经常问到 == 和 equals的区别

一、==

    == :运算符

    1. 可以使用在基本数据类型变量和引用数据类型变量中

    2. 如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同)

    如果比较的是引用数据类型变量:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体

    补充: == 运算符使用时,必须保证符号左右两边的变量类型一致(或者能进行自动类型提升)。

二、equals()

    1. 是一个方法,而非运算符

    2. 只能适用于引用数据类型

    3. Object类中equals()的定义:也就是如果没有重写 equals,那么会调用 Object 类中的改方法,实际上就是使用了 == 运算符

    public boolean equals(Object obj) {

        return (this == obj);

    }

    说明:Object类中定义的 equals() 和 == 的作用是相同的:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体

    4. 像 "String、Date、File、包装类" 等都重写了Object类中的equals()方法。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的"实体内容"是否相同。


以下是JDK8中String类的equals方法的具体实现:

public boolean equals(Object anObject) {
     if (this == anObject) {
         return true;
     }
     if (anObject instanceof String) {
         String anotherString = (String)anObject;
         int n = value.length;
         if (n == anotherString.value.length) {
             char v1[] = value;
             char v2[] = anotherString.value;
             int i = 0;
             while (n-- != 0) {
                 if (v1[i] != v2[i])
                     return false;
                 i++;
             }
             return true;
         }
     }
     return false;
 }


equals() 和 == 的使用举例:

package com.ylaihui.oop8;

import java.util.Date;

public class EqualsTest {
    	public static void main(String[] args) {
    		
    		//基本数据类型
    		int i = 10;
		int j = 10;
		double d = 10.0;
		System.out.println(i == j);//true
		System.out.println(i == d);//true
		
		boolean b = true;
//		System.out.println(i == b);
		
		char c = 10;
		System.out.println(i == c);//true
		
		char c1 = 'A';
		char c2 = 65;
		System.out.println(c1 == c2);//true
		
		//引用类型:
		String str1 = new String("ylaihui");
		String str2 = new String("ylaihui");
		System.out.println(str1 == str2);//false
		System.out.println(str1.equals(str2));//true
		
		Date date1 = new Date(32432525324L);
		Date date2 = new Date(32432525324L);
		System.out.println(date1.equals(date2));//true
	}
}



3. 自定义类重写equals

    通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的"实体内容"是否相同。那么,我们就需要对Object类中的equals()进行重写.

    重写的原则:比较两个对象的实体内容是否相同.


    自定义类,开发中一般使用开发工具自动生成(当然也可以自己写),重写equals方法后, 比较两个自定义类的对象的时候,是比较的内容,如果没有重写,那么调用的是 ==。


    Eclipse 中 alt+shift+s, 生成hashCode 和 equals方法

    

4. toString方法的使用


    Object类中toString()的使用:

    1. 当我们输出一个对象的引用时,实际上就是调用当前对象的toString()

    2. Object类中toString()的定义:

    public String toString() {

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

    }

    3. 像String、Date、File、包装类等都重写了Object类中的toString()方法。使得在调用对象的toString()时,返回"实体内容"信息

    4. 自定义类也可以重写toString()方法,当调用此方法时,返回对象的"实体内容"

    

//ToStringTest.java
package com.ylaihui.oop8;

class Cup{
    	String name;
    
    	// alt + shift + s
    	@Override
    	public String toString() {
		return "Cup [name=" + name + "]";
	}
}

public class ToStringTest {
	public static void main(String[] args) {
		
		Cup cup = new Cup();
		// 输出一个对象的引用时,实际上就是调用当前对象的toString()
		System.out.println(cup);
		System.out.println(cup.toString());
		
		String s = new String("ylaihui");
		System.out.println(s);
		
	}
}


    

点赞 0

文章评论

欢迎您:

纸上得来终觉浅,绝知此事要躬行!

112 文章 36783 浏览 3 评论

联系我

  •   QQ:    361352119
  •  Email:  lisimmy@sina.com
  • 微信: