Object类详解、断点测试

  • 一、Object类详解
  • Object的方法摘要
  • equals方法
  • 如何重写equals方法
  • hashCode方法
  • toString方法
  • finalize方法
  • clone方法
  • 浅拷贝
  • 深拷贝
  • 代码演示
  • Date和String类型转换
  • 二、断点调试


一、Object类详解

Object类是所有java类的根基类,也就意味着所有的java对象都拥有Object类的属性和方法。如果在类的声明中未使用extends关键子指明其父类,则默认继承Object类

Object的方法摘要

java监测有没有断开连接_ide

equals方法

==

java监测有没有断开连接_ide_02


注意:基本数据类型==引用数据类型时,比较的也是值是否相等equals

java监测有没有断开连接_java_03

补充:

  • java中的基本数据类型的包装类、String中的equals方法进行了重写,比较的是值/属性是否相同
  • 不重写的话,会继承Object类,然后比较地址
  • 看到==优先考虑是基本数据类型还是引用数据类型

如何重写equals方法

  1. 判断是否同一对象
  2. 判断是否不为空
  3. 判断运行类型是否相同(或者说对象o是否为Person类或其子类所创建)
  4. 向下转型去判断属性是否相同
@Override
    public boolean equals(Object o) {
        if (this == o) return true;//判断当前对象和o是否同一个对象
        if (o == null || getClass() != o.getClass()) return false;//判断对象o是否为空,还有当前对象的运行时类型是否和o的相同
        Person person = (Person) o;//向下转型后才能比较各个属性
        return age == person.age && gender == person.gender && Objects.equals(name, person.name);
    }

hashCode方法

java监测有没有断开连接_浅拷贝_04

toString方法

介绍:

java监测有没有断开连接_ide_05


java监测有没有断开连接_java监测有没有断开连接_06

重写:一般是输出对象的属性

public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender=" + gender +
                '}';
    }

注意:直接输出对象等价于直接调用toString()方法

finalize方法

java监测有没有断开连接_深拷贝_07

java监测有没有断开连接_java监测有没有断开连接_08


重写

java监测有没有断开连接_深拷贝_09

clone方法

clone()方法是用于浅克隆或者深克隆一个java对象的,但是要注意一个误区:clone方法是Object类的,并不是Cloneable接口的,Cloneable只是一个标记接口,标记接口是用于标记实现该接口的类具有某种该接口标记的功能,常见的标记接口有三个:Serializable、Cloneable、RandomAccess,没有实现Cloneable接口,那么调用clone方法就会爆出CloneNotSupportedException异常。

浅拷贝

被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象

也就是说,一个默认的clone()方法实现机制,仍然是赋值。

java监测有没有断开连接_ide_10

深拷贝

深拷贝在浅拷贝的基础上,会将引用类型的引用对象再次复制一遍

java监测有没有断开连接_java_11

代码演示

package review;

/**
 * @author 毕晶
 * @date 2022/8/6 5:36 PM
 */
public class ShowCopy {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person = new Person("张三", 19, new Hobby());
        Person copyPerson = (Person) person.clone();
        System.out.println(copyPerson == person);//false
        System.out.println(copyPerson.hobby == person.hobby);//浅拷贝时为true,因为拷贝了引用;深拷贝时false
    }
}

class Person implements Cloneable {
    String name;
    int age;
    Hobby hobby;

    public Person(String name, int age, Hobby hobby) {
        this.name = name;
        this.age = age;
        this.hobby = hobby;
    }

    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;
    }

    public Hobby getHobby() {
        return hobby;
    }

    public void setHobby(Hobby hobby) {
        this.hobby = hobby;
    }
//浅拷贝
//    @Override
//    protected Object clone() throws CloneNotSupportedException {
//        return super.clone();
//    }

    //深拷贝
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person person = (Person) super.clone();
        person.setHobby((Hobby) person.hobby.clone());
        return person;
    }

}

class Hobby implements Cloneable {

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

Date和String类型转换

Date转String

java监测有没有断开连接_ide_12


String转Date

java监测有没有断开连接_java监测有没有断开连接_13

二、断点调试

java监测有没有断开连接_深拷贝_14

java监测有没有断开连接_深拷贝_15

  • 步过:单行执行
  • 步入:进入方法体内(自己写的方法)
  • 强制步入:强制进入方法体内(包括jdk的方法)
  • 步出:跳出方法体,就是返回上一层方法体内
  • resume:跳到下一个断点
  • 可以边调试边打断点
  • 也可以在jdk的源码上打断点