• Java—Object类及自定义克隆详解


    Object类介绍

      Object类是所有类、数组、枚举的父类,当我们定义一个类未使用extends关键字去显示指定父类时,则表示该类默认继承了Object父类。

    Object类常用方法

    1. boolean equals(Object obj):判断两个对象是否为同一个对象;
    2. protected void finalize():JVM的垃圾回收GC器可以使用来清理对象(无引用变量应用该对象,具体可查看JVM中可达性分析等算法)
    3. Class<?> getClass():返回该对象的运行时类;
    4. String toString():返回对象的字符串表示输出;Object类的toString()方法返回的值为“运行时类名@十六进制的hashCode值”;
    5. int hashCode():返回对象的hashCode值;
    6. wait():导致当前线程处于等待状态,直至其他线程调用该同步监听器的notify()或者notifyAll()方法唤醒它。调用wait()方法的当前线程会释放对该同步监视器的锁定。wait()方法有三种形式:无时间参数、带毫秒参数的和带毫秒、毫微秒参数的。第一种是一直等待,直到其他线程通知;第二、三种是等待指定时间后自动醒来。
    7. notify():唤醒在该同步监视器上等待的单个线程,若所有线程都在这个同步监视器上等待,就会任意选择其中一个线程进行唤醒。只有当前线程释放该同步监视器的锁定后,才能执行被唤醒的线程。
    8. notifyAll():唤醒在该同步监视器上等待的所有线程;只有当前线程释放该同步监视器的锁定后,才能执行被唤醒的线程。
    9. protected clone():拷贝、克隆对象,得到一个当前对象的副本,属于浅复制,只会拷贝对象的成员变量,如果拷贝的对象内部还有对象,则不会进行拷贝。如果想实现对象中的引用变量(对象中的对象)则需要实现“递归”拷贝/克隆(深拷贝),继续对下一级对象进行拷贝。

    :上述提到的同步监视器是指synchronized等关键字修饰的同步方法,则同步监视器即为该类的默认实例(this);或者是synchronized修饰的同步代码块,此时同步监视器即为synchronized后面括号中的对象。

    自定义拷贝/克隆

      既然提到clone()方法,有必要提一下如何实现自定义类的拷贝/克隆。

    自定义clone实现步骤

    1. 自定义类实现Cloneable接口;
    2. 自定义类实现自己的clone()方法;
    3. clone()方法中需要有super.clone()来调用Object类实现的clone()方法去获取该对象的副本,并返回该副本。

    自定义clone()的示例

    二级对象:

    public class PersonInformation {
    	String address;
    	int telephoneNumber;
    	public PersonInformation(String address, int telephoneNumber) {
    		this.address = address;
    		this.telephoneNumber = telephoneNumber;
    	}
    }
    

    一级对象:

    public class Person implements Cloneable {
    	String name;
    	int age;
    	PersonInformation personInfo;
    	public Person(String name, int age) {
    		this.name = name;
    		this.age = age;
    		personInfo = new PersonInformation("江苏-南京", 188xx11xx22)
    	}
    	// 实现clone()方法
    	public Person clone() throws CloneNotSupportedException{
    		return (Person)super.clone();
    	}
    }
    

    测试:

    public class CloneTest {
    	public static void main(String[] args) throws CloneNotSupportedException {
    		Person person1 = new Person("小红", 20);
    		// clone拷贝得到person1的对象副本
    		Person person2 = person1.clone();
    		//判断两个对象是否相等;
    		System.out.println(person1 == person2);
    		// 判断两个对象中的引用变量是否相等;
    		System.out.prinln(person1.personInfo == person2.personInfo);
    	}
    }
    

    结果:

    true
    false
    
  • 相关阅读:
    消息中间件(MQ)
    java Lambda表达式
    【测试】性能测试及性能测试工具JMeter
    【Mysql】mysql集群方案之读写分离
    linux下mysql开启远程访问权限及防火墙开放3306端口
    MySQL事务提交与回滚
    MySQL索引
    MySQL视图
    MySQL事务
    MySQL参数化有效防止SQL注入
  • 原文地址:https://www.cnblogs.com/Andya/p/12494839.html
Copyright © 2020-2023  润新知