Object类

Object类

定义

Object: 是java中所有类共同的父类【内置或者自定义】,任何一个类的对象都可以使用Object类中的功能

object类中的成员方法

Object类中的成员方法:
    public int hashCode() 可以看作是一个对象的地址值的另外一种体现,不同的对象可能是一样
    public final Class getClass() 获取当前对象对应类的Class对象
    public String toString()  将一个对象以指定的字符串格式输出, 默认情况下也可以看作是一个地址值的表现形式
        java中直接输出对象名,默认调用的就是toString()方法
        我们正常情况下,直接输出对象名,是想观察对象中的成员变量值的情况,重写toString()方法
两个对象的比较方式: ==
    如果==两边是一个基本数据类型的变量,比较的是具体的数值大小
    如果==两边是引用数据类型的变量,比较的是对象的地址值

例子

class Student1{
    String name;
    int age;

    @Override
    public String toString() {
        return "Student1{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public class ObjectDemo1 {
    public static void main(String[] args) {
        Student1 s1 = new Student1();
        s1.name = "张三";
        s1.age = 18;
        System.out.println("姓名:" + s1.name + ", 年龄:" + s1.age);

        System.out.println("-----------------------------------");
        Student1 s2 = new Student1();
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());
        System.out.println(s1==s2);
        System.out.println("-----------------------------------");
        System.out.println(s1.getClass().getName());
        System.out.println("-----------------------------------");
        System.out.println(s1.toString()); // shujia.day07.ketang.Student1@4554617c
        System.out.println(s1); // shujia.day07.ketang.Student1@4554617c

    }
}

Object中的方法

一个标准类4.0版本:
        成员变量:使用private关键字修饰
        构造方法:提供一个无参和一个所有参数
        成员方法:getXxx()和setXxx(),以及toString()

例子

class Teacher{
    private String name;
    private int age;

    public Teacher() {
    }

    public Teacher(String name, int age) {
        this.name = name;
        this.age = 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;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public class ObjectDemo2 {
    public static void main(String[] args) {
        Teacher t1 = new Teacher("小虎", 18);
        System.out.println(t1);
    }
}

Object类中的成员方法:

    public boolean equals(Object obj) Object类中的equals方法底层是使用==比较的,比较的是地址值
        如果要比较内容值的话,需要在对象的类中重写该方法
    protected void finalize()  做垃圾回收的
    protected Object clone() 浅拷贝
        Cloneable接口中什么方法都没有,像这样的接口称之为标记接口
mport java.util.Objects;

class Demo {
    int a = 10;
}

class Student2 implements Cloneable {
    String name;
    int age;
    Demo demo;

    public Student2() {
    }

    public Student2(String name, int age, Demo demo) {
        this.name = name;
        this.age = age;
        this.demo = demo;
    }

    public Student2(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student2{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (o == null || getClass() != o.getClass()) return false;
        Student2 student2 = (Student2) o;
        return age == student2.age && Objects.equals(name, student2.name);
    }

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

public class ObjectDemo3 {
    public static void main(String[] args) throws Exception {
        Student2 s1 = new Student2("张成阳", 18, new Demo());
//        Student2 s2 = new Student2("张成阳", 18);
//
//        System.out.println(s1.equals(s2)); // s1和s2都是分别new出来的,地址值肯定不一样

        // 从比较地址值变成比较成员变量值
        System.out.println("-----------------------------------");
        Object o1 = s1.clone();
        System.out.println("o1: " + o1);
        System.out.println("s1: " + s1);
        System.out.println(s1 == o1);

        Student2 s2 = (Student2) o1;
        System.out.println(s1.demo == s2.demo);


    }
}

Object中的clone方法

1.作用:复制一个属性值一样的新对象
2.使用:
  需要被克隆的对象实现Cloneable
  重写clone方法
public class Person implements Cloneable{
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = 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;
    }

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

    /*
       问题1:obj直接调用name和age调用不了,因为Object接收了Person类型的对象
            属于多态,多态前提下不能直接调用子类特有内容
       解决问题1:向下转型

       问题2:如果传递的不是Person类型,就会出现类型转换异常
       解决问题2:先判断类型,如果是Person类型,再强转成Person

       问题3:如果传递null呢?,就不用判断类型了,直接给false

       问题4:如果传递自己呢?就不用判断非空了,也不同判断类型了,直接给true
     */
   /* public boolean equals(Object obj){
        if (this==obj){
            return true;
        }

        if (obj==null){
            return false;
        }

        if (obj instanceof Person){
            Person p = (Person) obj;
            return this.name.equals(p.name)&&this.age==p.age;
        }
        return false;

    }*/

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age && Objects.equals(name, person.name);
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
public class Test03 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person p2 = new Person("涛哥", 16);
        Object o = p2.clone();
        Person p3 = (Person) o;//克隆了一个新对象

        System.out.println(p2==p3);//比较地址值  false
        System.out.println(p2.equals(p3));//true
    }
}

posted @   09250327  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示