clone,finalize,getclass,hashCode,toString,equals

1. clone():

深克隆,浅克隆 参考 :https://blog.csdn.net/lovezhaohaimig/article/details/80372233

  • 概念: 创建并返回此对象的副本

  • 返回的是拷贝了原空间所有信息的堆内存的新空间,再进行克隆对象之前,需要让对象对应的类实现cloneable接口,这个接口仅仅只是用于可以做克隆操作的标记

  • 注意:

    1. 对象对应的类需要实现接口Cloneable 才能支持克隆: implements Cloneable

    2. .clone()`: add throws declaration

    3. Cloneable仅仅是提供一个标记

    //1. clone()
    public class ObjectDemo1 implements Cloneable {
    ​
        private int i=1;
    ​
        public static void main(String[] args) throws CloneNotSupportedException  {
            
            //创建对象
            ObjectDemo1 od = new ObjectDemo1();
            //返回Object类型
            //选declaration
            //CloneNotSupportedException:克隆不支持异常
            //对象对应的类需要实现:implements Cloneable接口才能支持克隆
            //Cloneable接口仅仅是提供了一个标记,实现了这个接口就能支持克隆
            ObjectDemo1 od1 = (ObjectDemo1)od.clone();
            //克隆对象调用属性
            System.out.println(od1.i);
            //克隆对象是开辟一块新空间,这个空间复制了原空间的所有信息
            System.out.println(od==od1);//输出为:false
            
            //被protected修饰的信息,子类对象要在子类的本类中使用
            ObDemo od2 = new ObDemo();
            od2.clone();
    ​
        }
    ​
    }
    ​
    class ObDemo extends ObjectDemo1 implements Cloneable{
        
    }

     

2.finalize() ——通知GC进行垃圾回收 (对象调用)–———System.gc()

3.getclass() ———返回的是方法的实际创造类

public class ObjectDemo1{
    public static void main(String[] args) {
        ObjectDemo1 od = new ObjectDemo1();
        //test.ObjectDemo1------全路径名
        System.out.println(od.getClass());
    }
}

 

4.hashCode() -------返回的是对象的哈希码值(十进制)

  由于哈希码值范围广,散列,基本不会出现数据的重复情况,就是唯一的 就把当作成了地址值

public class ObjectDemo1{
    public static void main(String[] args) {
        ObjectDemo1 od = new ObjectDemo1();
        
        //十进制转十六进制
        System.out.println(Integer.toHexString(od.hashCode()));
        //返回的是十进制的值
        //hashCode()返回的就是对象的哈希码值
        //哈希码没有负数,哈希码值最大的取值范围是40亿左右
        //哈希码值是散列分布的
        //由于哈希码值范围广,散列,所有数据重复的概率基本为0,就是唯一的 被当作成了地址值
        System.out.println(od.hashCode());
    }    
}

 

5.toString()---------默认进行拼接对象地址值, 开发中常用的是类中重写Object中的toString方法进行数据拼接。

public class ObjectDemo1{
    public static void main(String[] args) {
        ObjectDemo1 od = new ObjectDemo1();
        
        //返回的是地址值
        //println方法会让od对象调用Object里的toString方法
        System.out.println(od);
        //返的是地址值 Object 方法里的toString()用于拼接地址值
        System.out.println(od.toString());
    }
    
}

 

  对toString进行重写

public class ObjectDemo1{
    public static void main(String[] args) {
        Person1 p = new Person1();
        p.age=22;
        p.gender='女';
        p.name = "lili";
        
        System.out.println(p.toString());
    }
    
}
​
class Person1{
    String name;
    int age;
    char gender;
    
    //java提供的重写方法
    @Override
    public String toString() {
        return "Person1 [name=" + name + ", age=" + age + ", gender=" + gender
                + "]";
    }
    
//  自己重写
//  @Override
//  public String toString() {
//      
//      return this.name+","+this.gender+","+this.age;
//  }
    
    
}
 

 

6.equals()————-Object类里的方法,用于判断两个对象是否相等

  判断地址值是否相等

public class ObjectDemo1{
    public static void main(String[] args) {
        
        person1 p1 = new person1();
        p1.name= null;
        p1.gender='女';
        p1.age=10;
​
        person1 p2 = new person1();
        p2.name=null;
        p2.gender='女';
        p2.age=10;
        
        System.out.println(p1.equals(p2));
    }
}
class person1{
    //属性
    String name;
    int age;
    char gender;
    
    @Override
    public boolean equals(Object obj) {
        //1.比较两个对象的地址值是否相等
        //this表示本类对象
        if(this==obj){
            return true;
        }
        
        //2.判断参数是否为Null
        if(obj==null){
            return false;
        }
        
        
        //3.保证两个对象的类型一致
        if(this.getClass()!=obj.getClass()){
            return false;
        }
        
        //4.把参数类型强制转换为Person1类型,才能调用到Person的属性
        person1 p = (person1)obj;
        
        //5.比较属性值是否相等
        //判断两个对象的年龄是否相等
        if(this.age!=p.age){
            return false;
        }
        
        //判断性别是否相等
        if(this.gender!=p.gender){
            return false;
        }
        
        //判断姓名是否相等
        //判断name两个对象的地址值
        //this.name是String类型,调用的equals是String类中的
        //String中的equals方法,先比较地址值是否相等,若不等,再比较内容是否一致
        //this.name为null调用了equals方法就会出现空指针异常
        //前面必须加比较地址值的判断是为了避免少算都为null的形式
        if(this.name==p.name||this.name!=null&&this.name.equals(p.name)){
            return true;
        }
        
        return false ;
    }
}

 

重写equals方法:之判断地址值不是很严谨,比较对象中的属性(地址值不相等)

  自己写:

public class ObjectDemo1{
    public static void main(String[] args) {
        
        person1 p1 = new person1();
        p1.name="lili";
        p1.gender='女';
        p1.age=10;
​
        person1 p2 = new person1();
        p2.name="lili";
        p2.gender='女';
        p2.age=10;
        
        System.out.println(p1.equals(p2));
    }
}
class person1{
    //属性
    String name;
    int age;
    char gender;
    
    @Override
    public boolean equals(Object obj) {
        //1.比较两个对象的地址值是否相等
        //this表示本类对象
        if(this==obj){
            return true;
        }
        
        //2.判断参数是否为Null
        if(obj==null){
            return false;
        }
        
        
        //3.保证两个对象的类型一致
        if(this.getClass()!=obj.getClass()){
            return false;
        }
        
        //4.把参数类型强制转换为Person1类型,才能调用到Person的属性
        person1 p = (person1)obj;
        
        //5.比较属性值是否相等
        //判断两个对象的年龄是否相等
        if(this.age!=p.age){
            return false;
        }
        
        //判断性别是否相等
        if(this.gender!=p.gender){
            return false;
        }
        
        //判断姓名是否相等
        //判断name两个对象的地址值
        if(this.name==p.name){
            return true;
        }
        
        return false ;
    }
}

 

  java提供的重写-->Generate HashCode() and equals()
public class Person{
    public static void main(String[] args) {
        Student st = new Student();
        st.age=10;
        st.gender='女';
        st.name=null;
        
        Student st1 = new Student();
        st1.age=10;
        st1.gender='女';
        st1.name="lili";
        
        st1.equals(st);
    }
}
​
class Student{
    String name;
    int age;
    char gender;
    String nu;
    
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + gender;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + ((nu == null) ? 0 : nu.hashCode());
        return result;
    }
​
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (age != other.age)
            return false;
        if (gender != other.gender)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (nu == null) {
            if (other.nu != null)
                return false;
        } else if (!nu.equals(other.nu))
            return false;
        return true;
    }
}

 

 

posted @ 2020-08-18 21:13  minnersun  阅读(182)  评论(0编辑  收藏  举报