Java常用类 Object类

Object类,又称超类、基类,位于继承树的最顶层。

任何类,如果没有书写extend显示继承某个类,都默认继承Object类。

Object类中所定义的方法,是所有对象所具备的方法be

Object类可以存储任何对象

  • 作为参数,可接受任何对象。
  • 作为返回值,可以返回任何对象。

Object类的API文档:

  

大致可以包含上述的那些方法。

1.getClass方法

它返回引用存储类型的实际对象类型:

通常用于判断两个引用中的实际存储对象的类型是否一致。(就是判断两个对象的类是否一致)

新建一个Student类,并进行封装和添加有参构造方法:

package com.classes.objec;

public class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

主方法:利用getClass判断是否为同一类型

public class Test {
//    getClass返回实际对象的类型
    public static void main(String[] args) {
        System.out.println("=================1.getClass====================");
        Student s1 = new Student("aaa", 20);
        Student s2 = new Student("bbb", 18);
        Class aClass = s1.getClass();
        Class bClass = s2.getClass();
        System.out.println(aClass);
        System.out.println(bClass);
        if(aClass==bClass){
            System.out.println("s1和s2是同一种类型");
        }else {
            System.out.println("s1和s2不是同一种类型");
        }
    }
}

运行结果:

2.hasCode方法:

顾名思义。它返回的是对象的haCode值。

哈希值是根据对象地址或字符串或数字使用hash算法计算出来的int类型的数值。

看看例子:

还是上面的Student和Test方法:

package com.classes.objec;

public class Test {
//    getClass返回实际对象的类型
    public static void main(String[] args) {
        System.out.println("=================1.getClass====================");
        Student s1 = new Student("aaa", 20);
        Student s2 = new Student("bbb", 18);
        Class aClass = s1.getClass();
        Class bClass = s2.getClass();
        System.out.println(aClass);
        System.out.println(bClass);
        if(aClass==bClass){
            System.out.println("s1和s2是同一种类型");
        }else {
            System.out.println("s1和s2不是同一种类型");
        }
//        2.hashcode 哈希值
        System.out.println("=================2.hashcode====================");
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());
        Student s3 = s1;
        System.out.println(s3.hashCode());
    }
}

输出结果:

3.toString方法:

返回的是对象的字符串表示(十六进制):

还是Test类:

public class Test {
//    getClass返回实际对象的类型
    public static void main(String[] args) {
        System.out.println("=================1.getClass====================");
        Student s1 = new Student("aaa", 20);
        Student s2 = new Student("bbb", 18);
        Class aClass = s1.getClass();
        Class bClass = s2.getClass();
        System.out.println(aClass);
        System.out.println(bClass);
        if(aClass==bClass){
            System.out.println("s1和s2是同一种类型");
        }else {
            System.out.println("s1和s2不是同一种类型");
        }
//        2.hashcode 哈希值
        System.out.println("=================2.hashcode====================");
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());
        Student s3 = s1;
        System.out.println(s3.hashCode());

//        3.toString    返回的是一个十六进制的哈希值
        System.out.println("=================3.toString====================");
        System.out.println(s1.toString());
        System.out.println(s2.toString());
    }
}

输出结果:

两个看不懂得字符串,但是我们可以通过重写toString方法来实现显示对象的各个属性值。

Student类:

package com.classes.objec;

public class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
//  重写toString方法
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

重写后的运行结果:

完美。

4.equlas方法

它用于比较两个对象的地址是否相同:

package com.classes.objec;

public class Test {
//    getClass返回实际对象的类型
    public static void main(String[] args) {
        System.out.println("=================1.getClass====================");
        Student s1 = new Student("aaa", 20);
        Student s2 = new Student("bbb", 18);
        Class aClass = s1.getClass();
        Class bClass = s2.getClass();
        System.out.println(aClass);
        System.out.println(bClass);
        if(aClass==bClass){
            System.out.println("s1和s2是同一种类型");
        }else {
            System.out.println("s1和s2不是同一种类型");
        }
//        2.hashcode 哈希值
        System.out.println("=================2.hashcode====================");
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());
        Student s3 = s1;
        System.out.println(s3.hashCode());

//        3.toString    返回的是一个十六进制的哈希值
        System.out.println("=================3.toString====================");
        System.out.println(s1.toString());
        System.out.println(s2.toString());

//        4.equals  判断两个对象是否相对,返回的是一个布尔值
        System.out.println("=================4.equals====================");
        System.out.println(s1.equals(s2));
        Student s4 = new Student("小明", 17);
        Student s5 = new Student("小明", 17);
        System.out.println(s4.equals(s5));
//        如何用equals来判断两个对象的属性是否相等?重写equals方法
    }
}

运行结果返回一个布尔值 

问:如何用equals来判断两个对象的属性是否相等?

这个需要我们再来重写equals方法。

分为5步走

  1. 比较两个对象是否是同一个引用
  2. 判断obj类是否为null
  3. 判断两个对象的类型是否相同
  4. 强制进行类型转换
  5. 对属性进行逐个比较

看代码

Student类 :

package com.classes.objec;

public class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
//  重写toString方法
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
//  重写equals方法,使得它可以用于比较两个对象的属性是否相等,IDEA可以直接输入equal进行重写
    @Override
    public boolean equals(Object o) {
//      1判断两个对象是否是同一个引用
        if(this==o){
            return true;
        }
//        2判断obj是否为null
        if(o==null){
            return false;
        }
//        3判断对象是否是同一种类型
        if(o instanceof Student){
//            4强制类型转换
            Student student = (Student)o;
//            5进行属性比较
            if(this.name == student.name&& this.age == student.age){
                return true;
            }
        }
        return false;
    }
}

IDEA可以直接输入equals进行重写。

再运行一次主方法,得到输出结果:

5.finalize方法:

回收垃圾对象的方法,由JVM自动调用此方法。

垃圾一般分为 四种:

现在Student类中重写finalize方法:

package com.classes.objec;

public class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
//  重写toString方法
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
//  重写equals方法,使得它可以用于比较两个对象的属性是否相等,IDEA可以直接输入equal进行重写
    @Override
    public boolean equals(Object o) {
//      1判断两个对象是否是同一个引用
        if(this==o){
            return true;
        }
//        2判断obj是否为null
        if(o==null){
            return false;
        }
//        3判断对象是否是同一种类型
        if(o instanceof Student){
//            4强制类型转换
            Student student = (Student)o;
//            5进行属性比较
            if(this.name == student.name&& this.age == student.age){
                return true;
            }
        }
        return false;
    }
//  重写finalize方法,好像是一个抛出异常
    @Override
    protected void finalize() throws Throwable {
        System.out.println(this.name+"被回收了");
    }
}

重新写一个主方法,创建5个对象:


public class Test2 {
//    finalize 垃圾对象回收
    public static void main(String[] args) {
        Student s1 = new Student("aaa", 17);
        Student s2 = new Student("bbb", 18);
        Student s3 = new Student("ccc", 19);
        Student s4 = new Student("ddd", 20);
        Student s5 = new Student("eee", 21);

        System.gc();
        System.out.println("被回收了");
    }
}

运行结果:

没有执行finnalize方法。

当我们把对象名去掉的时候:

package com.classes.objec;

public class Test2 {
//    finalize 垃圾对象回收
    public static void main(String[] args) {
//        Student s1 = new Student("aaa", 17);
//        Student s2 = new Student("bbb", 18);
//        Student s3 = new Student("ccc", 19);
//        Student s4 = new Student("ddd", 20);
//        Student s5 = new Student("eee", 21);
        new Student("aaa", 17);
         new Student("bbb", 18);
         new Student("ccc", 19);
         new Student("ddd", 20);
         new Student("eee", 21);
        System.gc();
        System.out.println("被回收了");
    }
}

执行了finalize方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芝麻干

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值