02_Object类及常用方法

一、Object类

超类、基类,所有类的直接或间接父类,位于继承树的最顶层。

任何类,如没有书写extends显示继承某个类,都默认直接继承Object类,否则为间接继承。

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

二、getClass()方法

public final Class<?> getClass(){}

返回引用中存储的实际对象类型。

应用:通常用于判断两个引用中实际存储对象类型是否一致。

实例:

Student.java:

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

//    无参构造
    public Student() {
    }

//    有参构造
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

//    get,set方法,可以获取和设置name和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;
    }
}

Test.java

public class Test {
    public static void main(String[] args) {
//		getclass()方法
        Student s1 = new Student("aaa", 20);
        Student s2 = new Student("bbb", 10);

        Class<? extends Student> class1 = s1.getClass();
        Class<? extends Student> class2 = s2.getClass();

        if(class1 == class2){
            System.out.println("s1和s2属于同一个类型");
        }else {
            System.out.println("s1和s2属于同一个类型");
        }

    }
}

三、hashCode()方法

public int hasnCode(){}

返回该对象的哈希码值

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

一般相同对象返回相同的哈希码。

使用上述getClass()方法中的代码,在test.java中加入如下代码:

//        hashCode()方法
        System.out.println("s1的哈希码值:"+s1.hashCode());
        System.out.println("s2的哈希码值:"+s2.hashCode());

        Student s3 = s1;
        System.out.println("s3的哈希码值:"+s3.hashCode());

输出结果中s1和s3的哈希码值相同。

四、toString()方法

public String toString(){}

返回该对象的字符串表示,默认情况下返回该对象的类型名+该对象的十六进制哈希值;通常可以根据程序需求覆盖该方法,如:展示对象各个属性。

实例:

在Test.java的main中添加:

//        toString()方法
        System.out.println(s1.toString());
        System.out.println(s2.toString());

结果如下:

toString()方法的源码如下:

在Student.java中重写toString()方法:

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

Test.java中输出结果为:

五、equals()方法

public boolean equals(Object obj) {}

默认实现为(this == obj),比较两个对象的地址是否相同

也可以对equals()方法进行重写,比较两个对象的内容是否相等。

重写前:

在Test.java中加入如下代码:

//        equals()方法
        System.out.println(s1.equals(s2));

        Student s4 = new Student("aaaaa",15);
        Student s5 = new Student("aaaaa",15);
        System.out.println(s4.equals(s5));

输出结果为:

,因为s1、s2是两个不同的对象,地址一定不相等,所以调用equals()方法后就为false;s4和s5虽说传入的值相等,但是对象认识两个不同的,所以结果仍为false。

对equals()方法重写:

在Student.java中加入如下代码:

//	重写equals()方法
    @Override
    public boolean equals(Object obj) {
        if (obj == null)
            return false;
        if (this == obj)
            return true;
        if (obj instanceof Student){
            Student s = (Student) obj;
            if (s.name.equals(this.name) && s.age == this.age)
                return true;
        }

        return false;
    }

重写之后的s4和s5调用equals()方法之后结果就为true。

六、代码

Student.java

import java.util.Objects;

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

//    无参构造
    public Student() {
    }

//    有参构造
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

//    get,set方法,可以获取和设置name和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()方法
        @Override
        public boolean equals(Object obj) {
            if (obj == null)
                return false;
            if (this == obj)
                return true;
            if (obj instanceof Student){
                Student s = (Student) obj;
                if (s.name.equals(this.name) && s.age == this.age)
                    return true;
            }

            return false;
        }

}

Test.java

public class Test {
    public static void main(String[] args) {
        Student s1 = new Student("aaa", 20);
        Student s2 = new Student("bbb", 10);

        Class<? extends Student> class1 = s1.getClass();
        Class<? extends Student> class2 = s2.getClass();

        if(class1 == class2){
            System.out.println("s1和s2属于同一个类型");
        }else {
            System.out.println("s1和s2属于同一个类型");
        }
        System.out.println(s1.getClass());
        System.out.println("==============================");

//        hashCode()方法
        System.out.println("s1的哈希码值:"+s1.hashCode());
        System.out.println("s2的哈希码值:"+s2.hashCode());

        Student s3 = s1;
        System.out.println("s3的哈希码值:"+s3.hashCode());

        System.out.println("==============================");

//        toString()方法
        System.out.println(s1.toString());
        System.out.println(s2.toString());

        System.out.println("==============================");

//        equals()方法
        System.out.println(s1.equals(s2));

        Student s4 = new Student("aaaaa",15);
        Student s5 = new Student("aaaaa",15);
        System.out.println(s4.equals(s5));
    }
}
posted @ 2024-07-25 17:03  美的梦里国  阅读(52)  评论(0)    收藏  举报