java基础(五):Object类

Object

  • Object是所有类的顶级父类,所有类都默认继承Object类
  • 重要方法
  1. protected Object clone() — 把原对象的所有属性值复制到新对象中,返回新对象

    类实现Cloneable接口创建的对象才能支持克隆

    public class ObjectDemo1 implements Cloneable {
        int i = 1;
        public static void main(String[] args) throws CloneNotSupportedException {
            // 创建对象
            ObjectDemo1 od = new ObjectDemo1();
            od.i = 2;
            // 调用clone 方法 --- 返回克隆对象
            // CloneNotSupportedException --- 克隆不支持异常
            ObjectDemo1 od1 = (ObjectDemo1) od.clone();  //向下造型
            // 前后两个对象的属性值一致
            System.out.println(od1.i);  //2
            // 前后两个对象的地址值不一致 --- 把原对象的所有属性值复制到新对象中
            System.out.println(od1 == od);  // false
            od1.i = 3;
            System.out.println(od.i);  // 2
        }
    }
    
    class ODemo implements Cloneable{
        public void fun() throws CloneNotSupportedException {
            ODemo od = new ODemo();
            od.clone();
            ObjectDemo1 od1 = new ObjectDemo1();
            // 如果protected修饰的信息和要获取的位置关系是其他类位置,保证子类对象只能在本类中使用才能调用protected修饰的信息
            // od1.clone();  // error
        }
    }
    
  2. protected void finalize() — 通知系统对没有引用的对象进行回收

  3. public Class<?> getClass() — 返回Object的实际创建类类型(包名+类名 — 全路径名)

    public class ObjectDemo2 {
        public static void main(String[] args) {
            // 创建对象
            ObjectDemo2 od = new ObjectDemo2();
            Object od1 = new ObjectDemo2();  // 向上造型
            // 全路径名 --- 包名 + 类名
            System.out.println(od.getClass());
            // Object的实际创建类
            System.out.println(od1.getClass());
        }
    }
    
  4. public int hashcode() —返回对象的哈希码值

    哈希码值 (取值范围广、散列分布) — 表示地址值

    public class ObjectDemo3 {
        public static void main(String[] args) {
            // 哈希码值的特点
            // 1. 取值范围 2^-31 - 2^31 ~ 1 (int 的范围)
            // 2. 散列分布
            // 两个哈希码值重复的概率是1/2^32 * 1/2^32 --- 值唯一
            // 内存地址值不会重复需要是唯一的,用哈希码值表示
            System.out.println(new Object().hashCode());
            // 十进制转十六进制 toHexString()
            System.out.println(Integer.toHexString(new Object().hashCode()));
        }
    }
    
  5. public String toString()—默认返回对象的拼接地址值

    如果不想返回地址值想返回对象的属性值需要对这个方法进行重写

    public class ObjectDemo4 {
        public static void main(String[] args) {
            // 创建对象
            ObjectDemo4 od = new ObjectDemo4();
            // 底层会让od对象调用Object类中的toString()方法拼接地址值
            System.out.println(od);
            // 调用的是Object类的toString()方法拼接地址值
            System.out.println(od.toString());
    
            Person p  = new Person("lili",18,'女');
            System.out.println(p);
    
        }
    }
    
    class Person{
        String name;
        int age;
        char gender;
    
        public Person(String name, int age, char gender) {
            this.name = name;
            this.age = age;
            this.gender = gender;
        }
    
        // java自动提供的toString()方法
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", gender=" + gender +
                    '}';
        }
    }
    
  6. public boolean equals(Object obj) — 默认是比较两个对象的地址值

    public class ObjectDemo5 {
        public static void main(String[] args) {
            Teacher t1 = new Teacher(new String("Potter"),18,'男');
            Teacher t2 = new Teacher(new String("Potter"),18,'男');
            System.out.println(t1.equals(t2));
        }
    }
    
    class Teacher {
        //属性
        String name;
        int age;
        char gender;
    
        public Teacher(String name, int age, char gender) {
            this.name = name;
            this.age = age;
            this.gender = gender;
        }
    
        @Override
        public boolean equals(Object obj) {
            // 1. 比较地址值
            if (this == obj){
                return true;
            }
            // 2. 判断参数是否为null
            if (obj == null){
                return false;
            }
            // 3. 判断两个对象的类型是否一致
            if (this.getClass() != obj.getClass()){
                return false;
            }
            // 4. 保证从语法上参数对象可以拿到Person类的属性
            Teacher p = (Teacher) obj;  // 向下造型
            // 5.比较属性值
            // 5.1 比较性别
            if (this.gender != p.gender){
                return false;
            }
            // 5.2 比较年龄
            if (this.age != p.age){
                return false;
            }
            // 5.3 比较姓名(引用类型)
            // this.name == p.name 比较地址值
            // 字符串的equals方法会比较地址值也会比较内容
            // this.name == p.name 是考虑都为null的情况
            if (this.name == p.name || this.name != null && this.name.equals(p.name)){
                return true;
            }
            return false;  // name 不相等的情况
        }
    //    java 提供的equal()重写方法
    //    @Override
    //    public boolean equals(Object o) {
    //        if (this == o) return true;
    //        if (o == null || getClass() != o.getClass()) return false;
    //        Teacher teacher = (Teacher) o;
    //        return age == teacher.age &&
    //                gender == teacher.gender &&
    //                Objects.equals(name, teacher.name);
    //    }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值