Java11常用类1:Object类

1. Object类

[Java八大常用类:包装类、String类、StringBuffer和StringBuilder类、Date和DateFormat类、calendar类、Jdk8的日期类、Math类和Random类、枚举](https://blog.csdn.net/qq_43446733/article/details/124782050?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167898487116800227438444%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=167898487116800227438444&biz_id=0&utm_medium=distribute.pc_search_result.n one-task-blog-2alltop_positive~default-1-124782050-null-null.142%5Ev74%5Einsert_down1,201%5Ev4%5Eadd_ask,239%5Ev2%5Einsert_chatgpt&utm_term=Java%E5%B8%B8%E7%94%A8%E7%B1%BB&spm=1018.2226.3001.4187)

由官方介绍可见,Object属于Java.lang包内的一个类,而且提供了很多种方法, Object 是类层次结构的根类。每个类都以 Object 作为超类。所有对象(包括数组)都实现这个类的方法。 简单的说 Object类就是所有类的父类,包括我们所写的类,我们在使用类的时候就会利用 Object类中的方法,因为所有的父类都自动的继承了这个类,所以我们在日常学习和开发中见不到 Object这个类。子类拥有 Object类的所有方法,并且可以对这些方法进行重写,以满足我们的业务需求。

1.1 getClass()

返回此 Object 运行时的类,获取对象的真实类的全名称。比如:在使用多态时,父类引用变量,使用getClass()方法就可以看到真实的类:

应用场景:

  1. 查看当前使用该方法的对象,到底是哪个类;
  2. 在使用多态时,当代码多的时候使用 getClass()方法可以方便、快捷的知道 指向的是哪个子类。
package com.lCommonClasses.obj;
public class Object1 {
    public void eat(){
        System.out.println("吃");
    }
}
class HashTest extends Object1{
    @Override
    public void eat() {
        System.out.println("吃水果");
    }
}
class Test{
    public static void main(String[] args) {
        Object1 obj1 = new HashTest();// 使用多态
        Object1 obj2 = new Object1();
        obj1.eat(); // 子类重写了父类的eat(),使用的是子类的方法
        
        /**1.getClass():查看obj1归属于哪个 class*/
        // 结果,class com.lClass.HashTest
        System.out.println(obj1.getClass());
        // 结果,class com.lClass.Object1
        System.out.println(obj2.getClass());
    }
}

1.2 hashcode()

hashcode作用是获取哈希码,也称为散列码;它实际上是返回一个 int整数。
哈希码的作用是:确定该对象在哈希表中的索引位置。

package com.lCommonClasses.obj;
public class Object1 {
    public static void main(String[] args) {
        HashTest hash1 = new HashTest(8);
        HashTest hash2 = new HashTest(8);

        /**1.调用hashCode()方法:
         * 结果,460141958:这个数也就是哈希码,也称为散列码*/
        System.out.println(hash1.hashCode());
    }
}

1.3 equals()

package com.lCommonClasses.obj;
public class Object1 {
    public static void main(String[] args) {
        HashTest hash1 = new HashTest(8);
        HashTest hash2 = new HashTest(8);
        /**2.调用equals()方法:
         * 没有重写equals方法前为false;重写之后为true*/
        System.out.println(hash1.equals(hash2));
    }
}

源码很简单,就是两个==号,但是我们知道类的引用类型的数据。用两个等于号去判断两个引用类型,其实是判断两者的内存地址是否相同,当一个类去new一个新对象时,是在堆内存内开辟了一个新的空间;创建两个或者多个类的时候,每个类肯定有属于自己的空间,所有也有一个独一无二的地址,这就是为什么这个判断不成立的原因。
但是比较对象的引用对于我们在实际开发中没有意义,我们一般还是要重写该方法,比如去判断两者的参数是否相等:

package com.lClass;
public class HashTest {
    private int age;

    public HashTest() {}
    public HashTest(int age) {this.age = age;}
    public int getAge() {return age;}
    public void setAge(int age) {this.age = age;}

    /* 重写equals方法。如果HashTest生成的对象,它们传入的age等参数相等,
    就可以用equals()判断两者一致,此时equals就不再是去判断两者的地址是否相同*/
    @Override
    public boolean equals(Object obj) {
        HashTest h = (HashTest) obj;    //多态
        if(this.age == h.getAge()) {
            return true;
        }
        return false;
    }
}

1.3.1 == 和 equals 的区别

1)== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同 一个对象。

  • (基本数据类型== 比较的是值,引用数据类型 == 比较的是内存地址)

2)equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:

  1. 若该类没有重写equals() 方法。当通过 equals() 比较该类的两个对象时, 等价于通过“==”比较这两个对象。
  2. 若该类重写了 equals() 方法。(一般,我们都覆盖 equals() 方法 将两个对象 的内容相等;)若它们的内容相等,则返回 true (即,认为这两个对象相等)

1.3.2 hashCode()与equals()的相关规定

如果两个对象相等,则hashcode一定也是相同的,对两个对象分别调用equals方法都返回true;
两个对象有相同的hashcode值,它们也不一定是相等的。
因此,equals 方法被重写过,则 hashCode 方法也必须被重写,hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象 指向相同的数据)

1.4 toString()

返回一个字符串来标识当前对象,就是 类名+符号@+对象的哈希码值

class Test{
    public static void main(String[] args) {
		Object1 obj1 = new HashTest();//使用多态
        Object1 obj2 = new Object1();
		/**4.toString():但是这个返回值视乎没什么意义,
         * 所以为了返回值有更多的意义,我们可以重写这个方法*/
        System.out.println(obj1);
        System.out.println(obj1.toString());
        System.out.println(obj2.toString());
	}
}

其他方法:
clone()
notify()
wait()

1.5 Object转换为int类型

class Test{
    public static void main(String[] args) {
        /**5.将Object类型转换为int类型*/
        Object obj = "-416464";
        try{
            Integer.parseInt(obj.toString());
        } catch (NumberFormatException e) {
            System.out.println("输入不是 int类型");
        }finally {
            System.out.println("obj="+obj);
        }
    }
}

1.6 String转换为int类型

class Test{
    public static void main(String[] args) {
		/**6.将String类型转换为int类型
		两个结果不同:false;true;
		底层是:-128 ~ 127时,两者相同,超出范围后就不同*/
        String str= "129";
        System.out.println(Integer.parseInt(str) == Integer.parseInt("129"));// String -> int,再比较
        System.out.println(Integer.valueOf(str) == Integer.valueOf("129"));// String -> Integer,再比较
        //当数值超出范围后,用`equals()方法`
        if (Integer.valueOf(str).equals(Integer.valueOf("129"))){
            System.out.println("true");
        }else{
            System.out.println("false");
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值