zoukankan      html  css  js  c++  java
  • java中Object相关的几个方法

    protected Object   clone()创建并返回此对象的一个副本。  
    String     toString()返回该对象的字符串表示。
    boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。 (不是值相等,而是是不是指向同一块内存空间
    int        hashCode()返回该对象的哈希码值。

    与垃圾回收相关
    protected void finalize()当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

    与反射相关
    Class<?> getClass()返回此 Object 的运行时类。

    与线程相关
    void notify()唤醒在此对象监视器上等待的单个线程。
    void notifyAll()唤醒在此对象监视器上等待的所有线程。
    void wait()在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
    void wait(long timeout)在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。
    void wait(long timeout, int nanos)在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。

    Object类这些方法的重写方式:
      右键->Source->override/implement Methods

    equal方法
      先看看Object中equal方法的定义
    public class Object {
    
        private static native void registerNatives();
        static {
            registerNatives();
        }
    
        public boolean equals(Object obj) {
            return (this == obj);
        }
    
        //.....
    }
      从这里可以看出,只有当两个对象是同一个对象时(同一块内存空间),equals方法才会返回true
    比如我们定义一个类(包含两个构造器)
    public class Person {
        private String name;
        private int age;
        
        public Person(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
        public Person() {
            super();
        }
    }
       然后我们定义一个Set:
    public static void main(String[] args) {
            Set set = new HashSet();
            
            Person p1 = new Person();
            set.add(p1);
            set.add(p1);
            
            System.out.println(set.size());
        }
      我们知道Set集合中不能存放相同的元素,所以输出结果是1
    比较两个元素是否一样,主要是用到equals方法,所以Set集合的add方法之前其实首先是调用了p1对象的equals方法,查看集合中是否有相同对象。
    而Person集合中没有重写equal方法,所以调用的父类的equals()方法。
    public static void main(String[] args) {
            Set set = new HashSet();
            
            set.add(new Person("AA",12));
            set.add(new Person("AA",12));
            
            System.out.println(set.size());
        }
      而这时候的输出结果是2,很明显这是两个对象Person p1=new Person("AA",12)); Person p2=new Person("AA",12)); p1和p2不是同一个对象
    其实我们的目的是当两个Person对象的属性值一样时,就当成是相同对象,不再加入
    问题在于new出来的两个对象的equals方法比较的返回值是false。而Set的add方法的判断标准是equals方法的返回值
      如果想让equals返回true,就不能在使用Object定义的equals方法,要重写
    (java的IDE提供了关于Set的equals方法自动重写功能,右键->Source->Generate hashCode() and equals())
    package com.atguigu.java;
    
    public class Person {
        private String name;
        private int age;
        
        public Person(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
        public Person() {
            super();
        }
        
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Person other = (Person) obj;
            if (age != other.age)
                return false;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            return true;
        }
        
        
        
    }
      这下在运行,输出的结果就是1

    toString方法

      Object中的定义

    public String toString() {
            return getClass().getName() + "@" + Integer.toHexString(hashCode());
        }


      所以我们直接输出一个对象名或者对象名.toString(),都是调用的这个方法(在未重写的情况下)

  • 相关阅读:
    ASP.NET 高级编程基础第十一篇—WebForm和Page类成员
    ASP.NET 高级编程基础第十三篇—验证控件
    C#委托和事件详解第二篇
    C#委托事件详解第三篇
    点击一个Button,来看Duwamish7的总体层次
    ELMAHError Logging Modules And Handlers
    [实例研究Duwamish]SystemFramework和Common命名空间
    关于Blog的一些周边资源
    .NET框架程序设计Globally Deployment Assembly全局部署程序集
    合并2个DataSet
  • 原文地址:https://www.cnblogs.com/tech-bird/p/3515165.html
Copyright © 2011-2022 走看看