C/C++教程

常用类之Object类

本文主要是介绍常用类之Object类,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Object类

  • 超类、基类,是所有类的直接或者间接父类,位于继承树的最顶层
  • 任何类,如果没有书写extends显示地继承某个类,都默认直接继承了Object类,否则为间接继承
  • Object类中所定义的方法,是所有对象都具备的方法
  • Object类型可以存储任何对象
    • 作为参数,可以接受任何对象
    • 作为返回值,可以返回任何对象

继承树Object

1、getClass()方法

public final Class<?> getClass(){}

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

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

案例:

//Person类
public class Person {
    private String name;
    //构造方法
    public Person(String name) {
        this.name = name;
    }
}
//Card类
public class Card {
    private int count;
    //构造方法
    public Card(int count) {
        this.count = count;
    }
}
public class Demo {
    public static void main(String[] args) {
        //先创建两个同类对象
        Person test1 = new Person("张三");
        Person test2 = new Person("李四");
        //用getClass()方法返回对象的类
        Class class1 = test1.getClass();
        Class class2 = test2.getClass();
        //判断两个对象是不是同一个类
        if (class1==class2) {
            System.out.println("同类!");
        }else {
            System.out.println("不同类!");
        }
        //创建另外一个类的对象测试
        Card test3 = new Card(1);
        Class class3 = test3.getClass();
        //结果证明test1与test3并不属于同一个类 - 测试结果正确
        if (class1==class3) {
            System.out.println("同类!");
        }else {
            System.out.println("不同类!");
        }
    }
}

结果为:

同类!

不同类!

2、hashCode()方法

public int hashCode(){}

返回该对象的哈希码值。

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

一般情况下同一个对象返回相同哈希码。

案例:

public class HashCode {
    public static void main(String[] args) {
        String str1 = "1";
        String str2 = "2";
        String str3 = str2;
        //利用hashCode方法打印这三个对象的哈希值
        System.out.println(str1.hashCode());
        System.out.println(str2.hashCode());
        System.out.println(str3.hashCode());
    }
}

结果中,str2与str3的结果相同。

3、toString()方法

public String toString(){}

返回该对象的字符串表示(表现形式)。

可以根据程序需求覆盖该放阿飞,如:展示对象各个属性值。

案例:

public class ToString {
    public static void main(String[] args) {
        ToString test = new ToString();
        System.out.println(test.toString());
    }
}

一般会根据自己的情况重写toString()方法,以满足当下的需求

4、equals()方法

public boolean equals(Object obj){}

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

可以进行覆盖,比较两个对象的内容是否相同

案例:

//用Person和Card两个类进行分析
class Person{
    private String name;
    private int age;
    //构造函数
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
class Card{
    private int count;

    public Card(int count) {
        this.count = count;
    }
}
public class Equals {
    public static void main(String[] args) {
        //这里分别有test1/2/3/4四个对象,分别进行比较
        Person test1 = new Person("张三", 24);
        Card test2 = new Card(10);
        Person test3 = test1;
        Person test4 = new Person("张三", 24);
        
        //test1与test2 - 很明显属于两个不同的类
        System.out.println(test1.equals(test2));
        
        //test1与test3 - 看起来是两个不同的对象,实际上由于直接将test1赋值给了test3,所以他们的地址是相同的
        System.out.println(test1.equals(test3));
        
        //test1与test4 - 对象的属性都相同,但由于是分别new出来的,所以只是属性相同,地址不同
        System.out.println(test1.equals(test4));
    }
}

结果为:

false

true

false

如果希望test1与test4这种情况为true应该怎么做?

需要将方法重写,进行覆盖,从而比较两个对象的内容是否相同,步骤如下:

  • 比较两个引用是否指向同一个对象
  • 判断obj是否为null
  • 判断两个引用指向的实际对象类型是否一致
  • 强制类型转换
  • 依次比较各个属性值是否相同

在Person类中添加一部分代码:

class Person{
    private String name;
    private int age;
    //构造函数
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    //重写equals方法 - 实现需求
    @Override
    public boolean equals(Object obj) {
        //1.比较两个引用是否指向同一个对象
        if(this == obj){
            return true;
        }
        //2.判断obj是否为null
        if(obj == null){
            return false;
        }
        //3.判断两个引用指向的实际对象类型是否一致
        if(obj instanceof Person){
            //4.强制类型转换
            Person  p = (Person) obj;
            //5.依次比较各个属性值是否相同
            if(this.name.equals(p.getName()) && this.age == p.getAge()){
                return true;
            }
        }
        return false;
    }
}

Person类修改后,结果为:

false

true

true


知识点总结自bilibili(Java学习营)视频地址

这篇关于常用类之Object类的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!