Object类
- 超类、基类,所有类的直接或间接父类,位于继承树的最顶层。
- 任何类,如果没有书写extends显示继承某个类,都默认直接继承Object类。
- Object类中所定义的方法,都是所有对象都具备的方法。
- Object类型可以存储任何对象。
- 作为参数,可以接受任何对象。
- 作为返回值,可以返回任何对象。
1. clone()
Object clone() 方法用于创建并返回一个对象的拷贝。
clone 方法是浅拷贝,对象内属性引用的对象只会拷贝引用地址,而不会将引用的对象重新分配内存,相对应的深拷贝则会连引用的对象也重新创建。
返回一个对象的拷贝。
由于 Object 本身没有实现 Cloneable 接口,所以不重写 clone 方法并且进行调用的话会发生 CloneNotSupportedException 异常。
class RunoobTest implements Cloneable {
// 声明变量
String name;
int likes;
public static void main(String[] args) {
// 创建对象
RunoobTest obj1 = new RunoobTest();
// 初始化变量
obj1.name = "test";
obj1.likes = 111;
// 打印输出
System.out.println(obj1.name); // test
System.out.println(obj1.likes); // 111
try {
// 创建 obj1 的拷贝
RunoobTest obj2 = (RunoobTest) obj1.clone();
// 使用 obj2 输出变量
System.out.println(obj2.name); // test
System.out.println(obj2.likes); // 111
} catch (Exception e) {
System.out.println(e);
}
}
}
2. finalize()
- 当对象被判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列。
- 垃圾对象:没有有效引用指此对象时,为垃圾对象。
- 垃圾回收:由GC(Garbage Collection )销毁垃圾对象,释放数据存储空间。
- 自动回收机制:JVM的内存耗尽。一次性回收所有垃圾对象。
- 手动回收机制:使用
System.gc();
通知JVM进行垃圾回收。
3. getClass()
public final Class<?> getClass(){}
- 返回引用中存储的实际对象类型。
- 应用:通常用于判断两个引用中实际存储对象类型是否一致。
Student s1 = new Student("zs", 12);
Student s2 = new Student("ls", 22);
// s1.getClass() == s2.getClass() // true
// 上面的代码相当于 s1 instanceof s2
4. hashCode()
public int hashCode(){}
- 返回该对象的哈希码值。
- 哈希值根据对象的地址或字符串或数字使用hash算法计算出来的int类型的数值。
- 一般情况下相同对象返回相同的哈希码。
Student s1 = new Student("zs", 12);
Student s2 = new Student("ls", 22);
// s1.hashCode() == s2.hashCode() // false
Student s3 = s1;
// s1.hashCode() == s3.hashCode() // true
5. toString()
public String toString(){}
- 返回该对象的字符串表示(表现形式)。
可以根据程序需要重写该方法,如:展示对象各个属性值。
从Object类继承过来的
toString()
如无进行修改,则默认为打印当前类的全类名@对象地址
return getClass().getName() + "@" + Integer.toHexString(hashCode());
6. equals()
public boolean equals(Object obj)
- 默认实现为(this == obj),比较两个对象地址是否相同。
- 可进行覆盖,如比较两个对象的内容是否相同。比如:
String.equals()
。
6.1. equals()方法覆盖步骤
- 比较两个引用是否指向同一个对象。
- 判断obj是否为null。
- 判断两个引用指向的实际对象类型是否一致。
- 强制类型转换。
- 依次比较各个属性值是否相同。
覆盖实例如:
class Student{
int sno;
String sname;
/*
中间方法省略
*/
@Override
public boolean equals(Object obj){
if(this == obj){
return true;
}
if(null == obj){
return false;
}
if(obj instanceof Student){
Studnet s = (Student)obj;
if(this.name.equals(s.getName()) && this.sno == s.getSno()){
return true;
}
}
return false;
}
}