Object类和包装类的使用

java.lang.Object类的说明

  • Object类是所Java类的根父类
  • 如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类
  • Object类中的功能(属性、方法)就具通用性。

其中方法有:equals() 、 toString() 、getClass() 、hashCode() 、clone() 、finalize()wait() 、 notify()、notifyAll()

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

equals()方法

  1. 是一个方法、而非运算符
  2. 只能适用于引用数据类型
  3. Object类中equals()的定义:
public boolean equals(Object obj) {
            return (this == obj);
      }

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

  1. 像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的"实体内容"是否相同。
  2. 通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的"实体内容"是否相同。那么,我们就需要对Object类中的equals()进行重写。重写的原则:比较两个对象的实体内容是否相同.
class User{
    String name;
    int age;
    //重写其equals()方法
    public boolean equals(Object obj){
        if(obj == this){
            return true;
        }
        if(obj instanceof User){
            User u = (User)obj;
            return this.age == u.age && this.name.equals(u.name);
        }
        return false;
    }
}

在实际开发中,equals方法可以自动生成

== 运算符的使用

  1. 可以使用在基本数据类型变量和引用数据类型变量中
  2. 如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同)
  3. 如果比较的是引用数据类型变量:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体
  4. == 符号使用时,必须保证符号左右两边的变量类型一致。

toString()方法

  1. 当我们输出一个对象的引用时,实际上就是调用当前对象的toString()
  2. Object类中toString()的定义:
public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
  1. 像String、Date、File、包装类等都重写了Object类中的toString()方法。使得在调用对象的toString()时,返回"实体内容"信息
  2. 自定义类也可以重写toString()方法,当调用此方法时,返回对象的"实体内容"
@Override
public String toString() {
    return "Customer [name=" + name + ", age=" + age + "]";
}
【面试题】
public void test() {
    char[] arr = new char[] { 'a', 'b', 'c' };
    System.out.println(arr);//abc
    int[] arr1 = new int[] { 1, 2, 3 };
    System.out.println(arr1);//地址值
    double[] arr2 = new double[] { 1.1, 2.2, 3.3 };
    System.out.println(arr2);//地址值
}

包装类(Wrapper)的使用

为了使基本数据类型的变量具有类的特征,引入包装类。

java-wrapper

类型间的转换

java-wrapper2

  • 基本数据类型<--->包装类:JDK 5.0 新特性:动自装箱 与自动拆箱
  • 基本数据类型、包装类--->String:调用String重载的valueOf(Xxx xxx)
  • String--->基本数据类型、包装类:调用包装类的parseXxx(String s)

注意:转换时,可能会报NumberFormatException

//基本数据类型 --->包装类
@test
public void test1(){
    int num1 = 10;
    
}
【面试题】
  1. 如下两个题目输出结果相同吗?各是什么:
Object o1 = true ? new Integer(1) : new Double(2.0);
System.out.println(o1);//1.0


Object o2;
if (true)
    o2 = new Integer(1);
else
    o2 = new Double(2.0);
System.out.println(o2);//1
public void method1() {
    Integer i = new Integer(1);
    Integer j = new Integer(1);
    System.out.println(i == j);
    
    Integer m = 1;
    Integer n = 1;
    System.out.println(m == n);//true
    
    Integer x = 128;
    Integer y = 128;
    System.out.println(x == y);//false(缓存原因)
}

扩展:==和equals的区别

  1. == 既可以比较基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型
    就是比较内存地址
  2. equals的话,它是属于java.lang.Object类里面的方法,如果该方法没有被重写过默认也
    是==;我们可以看到String等类的equals方法是被重写过的,而且String类在日常开发中

用的比较多,久而久之,形成了equals是比较值的错误观点。

  1. 具体要看自定义类里有没有重写Object的equals方法来判断。
  2. 通常情况下,重写equals方法,会比较类中的相应属性是否都相等。
最后修改:2021 年 08 月 15 日 08 : 31 PM
如果觉得我的文章对你有用,请随意赞赏