Object
- Object是所有类的顶级父类,所有类都默认继承Object类
- 重要方法
-
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 } }
-
protected void finalize()
— 通知系统对没有引用的对象进行回收 -
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()); } }
-
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())); } }
-
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 + '}'; } }
-
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); // } }