Object类
1.概述
- Object 意思为:对象
- 在Java中 Object 被定义为一个顶级父类,是任何类的父类;我们可以显示继承它,也可以隐式继承
- Object类 是类层次结构的 根
- Object类 是Java中唯一没有父类的类
- 所用的类,包括标准容器类、数组,都继承了Object类中 的方法
- 共有13个方法
//显示继承
public class Test1 extends Object {
}
//隐式继承
public class Test2 {
}
根据继承的特点
- 父类中非私有属性和方法会继承到子类中
- 所有的子类都会调用它的构造器,super()
根据多态的特点
- Object类型 的引用变量可以接受任何类型的对象
- Object的形参 可以接收任何类型的实参
- 数组元素类型是Object时,表示这个数组可以存放任意类型的对象
定义Object类的目的
13个方法会被高频率的使用,为了实现代码复用,设计者就把13个方法集中放到了一个类中,就是Object类,它定义了所有Java类的公共方法。
2.对象的字符串表示
1.toString()
- 表示:用于返回对象的字符串表示
- 使用:当直接造作对象的引用变量时,JVM 默认会调用toString 方法(没有重写的情况下,默认调用父类的toString方法;因为所有类的都有一个父类Object,由于继承的特点,在没有重写的情况下,默认先调用父类的方法)
public class Test {
public static void main(String[] args) {
System.out.println(new Object());
}
}
//这里的输出是 直接输出Object对象,代码中没有调用属性或方法,但是程序运行或会输出一个字符串。
//实际上,JVM 自动调用了对象的toString()方法,因此输出的字符串就是这个方法的返回值
2.对象的默认表示
- 没有重写父类Object 的toString 方法
在Object中,为Java 对象提供了一种默认的表示方法,即toString()的默认返回值,格式“l类的全路径名+@+引用地址”。
public class Test {
public static void main(String[] args) {
System.out.println(new Person());
}
}
结果:
com.etime2.Person@1540e19d
3.重写toString
- 通过toString 方法可以输出制定的数据表示
- 当使用直接输出对象名的时候,是打印:对象名.toString()
public class Person {
private String name;
private String id;
public Person(){
}
public Person(String name, String id) {
this.name = name;
this.id = id;
}
//重写的同toString方法
@Override
public String toString() {
return "{" +
"name=" + name +
", id=" + id +
'}';
}
}
//测试
public class Test {
public static void main(String[] args) {
//重写了toString方法 使用对象时 默认调用该方法,并输出定制的格式
System.out.println(new Person("里","22334"));
System.out.println("____________");
//默认调用对象的引用地址
System.out.println(new Object());
}
}
结果:
{name=里, id=22334}
____________
java.lang.Object@1540e19d
3.对象相等
1.相等的两个含义
- 表示两个对象是同一个对象否
- 物理上相等 ,即同一个对象 (引用地址)
- 表示两个对象的属性值是相等的,但两个对象并不是同一个对象(逻辑上相等,即不是相同对象,但是内容相等)
2.两个关键字符
- == 比较对象引用地址,判断是否为同一对象
- equals 比较两个对象的内容,判断两个对象的内容是否相等
1.比较引用地址 (==)
- 可用于判断基本数据类型的相等性
- 直接判断两个对象的引用地址是否相等,从而判断是否为同一对象
public class Test2 {
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
Person p3 = p1;
//p1 p2时两个对象
System.out.println(p1==p2);
//p1 p3都指向同一个对象
System.out.println(p1==p3);
System.out.println(2==3);
System.out.println('a'=='a');
System.out.println("bc"=="c");
}
}
//结果
false
false
true
false
2.比较对象内容 equals()
1.Object 的默认实现 (equals)
- Object中的equals 方法的默认实现就是比较对象的引用地址,即它的作用和 == 相同
public boolean equals(Object obj) {
return this == obj;// 与 == 操作相同
}
2.重写equals()方法
- 实际应用中,比较引用地址作用不大,更多的是使用对象的属性值(业务意义上的值)进行比较,故 需要重写equals() 方法
@Override
public boolean equals(Object obj) {
Person p = (Person) obj;
return this.id == p.id;//按 id 比较
}
//测试
public class Test3 {
public static void main(String[] args) {
Person p1 = new Person("x11");
Person p2 = new Person("x");
Person p3 = new Person("x11");
System.out.println(p1.getId()+","+p2.getId());
System.out.println(p1.equals(p2));
System.out.println(p1.getId()+","+p3.getId());
System.out.println(p1.equals(p3));
System.out.println("x12"=="x11");
}
}
//结果
null,null
true
null,null
true
false
4.hashCode()
- 用途:作为对象的标识
- hashCode 为对象使用HASH算法计算对象的哈希值,同一个对象的哈希值时唯一的
- 规定:如果两个对象使用equals()方法比较后返回true,那么这两个对象的hashCode() 返回值必须一致。所以,我们重写类的equals()方法后,都需要重写hashCode()方法来满足这个规定
//重写hashCode() 方法
@Override
public int hashCode() {
return this.id;
}
5.clone()
- 克隆
- 复制
1.理解:根据已存在对象复制出一个新的对象,该对象具有和被复制对象一样的状态
2.过程:
- 被克隆对象 对应的类应该实现Cloneable接口
- 在类中实现clone 方法;
public class Person implements Cloneable{
private String name;
private int id;
public Person(){
}
public Person(String name, int id) {
this.name = name;
this.id = id;
}
//默认这样就行 ,使用父类的clone方法 即Object.clone()
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "{" +
"name=" + name +
", id=" + id +
'}';
}
}
//测试
public class Demo {
public static void main(String[] args) throws CloneNotSupportedException {
Person person = new Person("李四",112);
System.out.println(person);
Person person1 =(Person) person.clone();
System.out.println(person1);
System.out.println("地址比较"+(person==person1));
System.out.println("属性比较"+person.equals(person1));
}
}
//结果
{name=李四, id=112}
{name=李四, id=112}
地址比较false
属性比较true
5.finalize()
这个方法在 对象被垃圾回收时,由垃圾回收线程调用。因此,一般情况下开发人员不会调用该方法;也不会去重写该方法。每一个对象的finalize方法只能被调用一次
总结
- public final Class getClass():返回此时 Object的运行时类。可以通过Class类中的getName()方法,获取对象的真实类的全名称、