Object类

Object类

1.概述

  • Object 意思为:对象
  • 在Java中 Object 被定义为一个顶级父类,是任何类的父类;我们可以显示继承它,也可以隐式继承
  • Object类 是类层次结构的
  • Object类 是Java中唯一没有父类的类
  • 所用的类,包括标准容器类、数组,都继承了Object类中 的方法
  • 共有13个方法
//显示继承
public class Test1 extends Object {
    
}
//隐式继承
public class Test2 {
    
}

根据继承的特点

  • 父类中非私有属性和方法会继承到子类中
  • 所有的子类都会调用它的构造器,super()

根据多态的特点

  • Object类型 的引用变量可以接受任何类型的对象
  • Object的形参 可以接收任何类型的实参
  • 数组元素类型是Object时,表示这个数组可以存放任意类型的对象

定义Object类的目的

​ 13个方法会被高频率的使用,为了实现代码复用,设计者就把13个方法集中放到了一个类中,就是Object类,它定义了所有Java类的公共方法。

2.对象的字符串表示

1.toString()
  • 表示:用于返回对象的字符串表示
  • 使用:当直接造作对象的引用变量时,JVM 默认会调用toString 方法(没有重写的情况下,默认调用父类的toString方法;因为所有类的都有一个父类Object,由于继承的特点,在没有重写的情况下,默认先调用父类的方法)
public class Test {
    public static void main(String[] args) {
        System.out.println(new Object());
    }
}
//这里的输出是 直接输出Object对象,代码中没有调用属性或方法,但是程序运行或会输出一个字符串。
//实际上,JVM 自动调用了对象的toString()方法,因此输出的字符串就是这个方法的返回值
2.对象的默认表示
  • 没有重写父类Object 的toString 方法

​ 在Object中,为Java 对象提供了一种默认的表示方法,即toString()的默认返回值,格式“l类的全路径名+@+引用地址”。

public class Test {
    public static void main(String[] args) {
        System.out.println(new Person());
    }
}
结果:
com.etime2.Person@1540e19d
3.重写toString
  • 通过toString 方法可以输出制定的数据表示
  • 当使用直接输出对象名的时候,是打印:对象名.toString()
public class Person {
    private String name;
    private String id;

    public Person(){

    }

    public Person(String name, String id) {
        this.name = name;
        this.id = id;
    }
	//重写的同toString方法
    @Override
    public String toString() {
        return "{" +
                "name=" + name +
                ", id=" + id +
                '}';
    }
}
//测试
public class Test {
    public static void main(String[] args) {
        //重写了toString方法 使用对象时 默认调用该方法,并输出定制的格式
        System.out.println(new Person("里","22334"));
        System.out.println("____________");
        //默认调用对象的引用地址
        System.out.println(new Object());
    }
}
结果:
    {name=, id=22334}
	____________
	java.lang.Object@1540e19d

3.对象相等

1.相等的两个含义

  • 表示两个对象是同一个对象否
    • 物理上相等 ,即同一个对象 (引用地址)
  • 表示两个对象的属性值是相等的,但两个对象并不是同一个对象(逻辑上相等,即不是相同对象,但是内容相等)

2.两个关键字符

  • == 比较对象引用地址,判断是否为同一对象
  • equals 比较两个对象的内容,判断两个对象的内容是否相等
1.比较引用地址 (==)
  • 可用于判断基本数据类型的相等性
  • 直接判断两个对象的引用地址是否相等,从而判断是否为同一对象
public class Test2 {
    public static void main(String[] args) {
        Person p1 = new Person();
        Person p2 = new Person();
        Person p3 = p1;
        //p1 p2时两个对象
        System.out.println(p1==p2);
        //p1 p3都指向同一个对象
        System.out.println(p1==p3);
        System.out.println(2==3);
        System.out.println('a'=='a');
        System.out.println("bc"=="c");
    }
}
//结果
false
false
true
false
2.比较对象内容 equals()

1.Object 的默认实现 (equals)

  • Object中的equals 方法的默认实现就是比较对象的引用地址,即它的作用和 == 相同
public boolean equals(Object obj) {
    return this == obj;// 与 == 操作相同
}

2.重写equals()方法

  • 实际应用中,比较引用地址作用不大,更多的是使用对象的属性值(业务意义上的值)进行比较,故 需要重写equals() 方法
@Override
public boolean equals(Object obj) {
    Person p = (Person) obj;
    return this.id == p.id;//按 id 比较
}
//测试
public class Test3 {
    public static void main(String[] args) {
        Person p1 = new Person("x11");
        Person p2 = new Person("x");
        Person p3 = new Person("x11");
        System.out.println(p1.getId()+","+p2.getId());
        System.out.println(p1.equals(p2));
        System.out.println(p1.getId()+","+p3.getId());
        System.out.println(p1.equals(p3));
        System.out.println("x12"=="x11");
    }
}
//结果
null,null
true
null,null
true
false

4.hashCode()

  • 用途:作为对象的标识
  • hashCode 为对象使用HASH算法计算对象的哈希值,同一个对象的哈希值时唯一的
  • 规定:如果两个对象使用equals()方法比较后返回true,那么这两个对象的hashCode() 返回值必须一致。所以,我们重写类的equals()方法后,都需要重写hashCode()方法来满足这个规定
//重写hashCode() 方法
@Override
public int hashCode() {
    return this.id;
}

5.clone()

  • 克隆
  • 复制

1.理解:根据已存在对象复制出一个新的对象,该对象具有和被复制对象一样的状态

2.过程:

  1. 被克隆对象 对应的类应该实现Cloneable接口
  2. 在类中实现clone 方法;
public class Person implements Cloneable{
    private String name;
    private int id;

    public Person(){

    }
    public Person(String name, int id) {
        this.name = name;
        this.id = id;
    }
    //默认这样就行 ,使用父类的clone方法 即Object.clone()
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    @Override
    public String toString() {
        return "{" +
                "name=" + name +
                ", id=" + id +
                '}';
    }
}
//测试
public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person = new Person("李四",112);
        System.out.println(person);
        Person person1 =(Person) person.clone();
        System.out.println(person1);
        System.out.println("地址比较"+(person==person1));
        System.out.println("属性比较"+person.equals(person1));
    }
}
//结果
{name=李四, id=112}
{name=李四, id=112}
地址比较false
属性比较true

5.finalize()

​ 这个方法在 对象被垃圾回收时,由垃圾回收线程调用。因此,一般情况下开发人员不会调用该方法;也不会去重写该方法。每一个对象的finalize方法只能被调用一次

总结

  1. public final Class getClass():返回此时 Object的运行时类。可以通过Class类中的getName()方法,获取对象的真实类的全名称、
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

咸鱼不咸鱼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值