欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA中的Object类

程序员文章站 2024-03-14 09:39:34
...

object类

  • int hashCode () 返回该对象的哈希码值。不同对象的哈希码值,是不一样的。

  • public int hashCode() 返回该对象的哈希码值。不同对象的哈希码值不同。

  • public final Class<?> getClass() 返回此对象的运行时类。(实际上返回该类的字节码文件对象,Object.class 字节码文件加载进内存-----JVM就会为Object.class文件创建一个对象)

    package org.westos.demo5;
    
    public class Demo {
        public static void main(String[] args) {
            Object n1 = new Object();
            Class<?> n1Class = n1.getClass();
    
            Object n2 = new Object();
            Class<?> n2Class = n2.getClass();
            
            Test test = new Test();
            Class<? extends Test> testClass = test.getClass();
    
            System.out.println(n1Class);//输出:class java.lang.Object
            System.out.println(n2Class);//输出:class java.lang.Object
            System.out.println(testClass);//输出:class org.westos.demo5.Test
            System.out.println(n1==n2);//输出:false
            System.out.println(n1Class==n2Class);//输出:true
            System.out.println(n1Class==testClass);//输出:false
        }
    }
    
    class Test{
    
    }
    
    
  • public boolean equals(Object obj) Object 类中的equals方法默认比较两个对象的地址值是否相同,因为这个对我们用处不大,因而我们可以在自定义类中重写该方法。

    //在自定义Student类中重写equals方法,使其比较对象的成员变量的值是否相等
    class Student {
        private String name;
        private int age;
    
        public Student() {
        }
    
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        @Override
        public boolean equals(Object o) {
            //比较是否是同一个对象
            if (this == o) {
                return true;
            }
            //比较两个对象的运行时类是否相同
            if (o == null || this.getClass() != o.getClass()) {
                return false;
            }
            //进行强转之后比较值是否相同(String类重写了equals方法,可以比较字符串的值是否相同)
            Student student = (Student) o;
            return age == student.age && Objects.equals(name, student.name);
        }
        
    }
    
    

    对于基本数据类型,比较它们时应该用比较运算符(==),比较它们的值是否相等。

    对于对象,当用(==)比较时,比较的是它们的地址值是否相等。初始的equals()方法,也是比较对象的地址值是否相等,但是该方法可以被重写用于比较值相等或者其他。

  • protected Object clone() 该方法创建并返回此对象的一个副本。

    //如果我们要在自定义类里实现克隆(这里实现的是浅克隆):
    package org.westos.demo5;
    
    public class Demo {
        public static void main(String[] args) throws CloneNotSupportedException {
            Something s = new Something(7);
            Test test = new Test(s, 3);
            Test ctest = (Test)test.clone();
            System.out.println(test.getNum());
            System.out.println(ctest.getNum());
            System.out.println(test.getSomething());
            System.out.println(test.getSomething());
        }
    }
    
    
    /*
    * 若要在自定义类中实现clone(),必须实现Cloneable接口,这只是一个标志性接口该接口,
    * 用以指示 Object.clone()方法可以合法地对该类实例进行按字段复制, 如果在没有实现 Cloneable 接口的
    * 实例上调用 Object 的 clone 方法,则会导致抛出 CloneNotSupportedException 异常
    */
    
    class Test implements Cloneable{
        private Something something;
        private int num;
    
        public Test(Something something, int num) {
            this.something = something;
            this.num = num;
        }
    
        public Something getSomething() {
            return something;
        }
    
        public int getNum() {
            return num;
        }
    //通过调用super.clone()来实现clone()方法
        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    }
    
    class Something{
        int i;
    
        public Something(int i) {
            this.i = i;
        }
    }
    
    //结果:
    3
    3
    org.westos.demo5.Something@4554617c
    org.westos.demo5.Something@4554617c
    

    内存图如下:

    JAVA中的Object类

Object类提供的clone()方法是一种浅克隆——它只克隆该对象的所有成员变量值,但不会对引用类型的成员变量值所引用的对象进行克隆。

深克隆则会将引用类型的成员变量值所引用的对象进行克隆。

  • public String toString() 返回该对象的字符串表示。它的值等于:
    getClass().getName() + ‘@’ + Integer.toHexString(hashCode())

    建议在自定义类中重写返回一些有用的信息。

    public class Test {
        public static void main(String[] args) {
            Teacher teacher = new Teacher("张三", 23);
            System.out.println(teacher);
    
        }
    }
    
    class Teacher{
        private String name;
        private int age;
    
        public Teacher(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        //重写toString()方法
        @Override
        public String toString() {
            return "Teacher{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
    //结果:
    Teacher{name='张三', age=23}