欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java中Object源码理解

程序员文章站 2023-12-02 12:13:28
java阅读笔记 1.object getClass() 返回是的此object运行时的类,返回的对象是被object锁定的对象,调用这个方法不需要进行强转 public static void main(String[]args){ @Data class Demo{ private Intege ......

java阅读笔记

1.object

  • getclass()

    返回是的此object运行时的类,返回的对象是被object锁定的对象,调用这个方法不需要进行强转

    public static void main(string[]args){
    
            @data
            class demo{
                private integer age;
                private string name;
            }
            demo demo = new demo();
            class c = demo.getclass();
            //获取类的名称
            system.out.println("类的名称----"+c.getname());
            //方法的对象  类中的一个方法就是一个对象(可以获取方法的名称,获取方法的参数类型,获取方法的        返回类型)
            method[]methods = c.getmethods();
            for (int i = 0; i < methods.length; i++) {
                system.out.println("方法的名称------" + methods[i].getname());
                system.out.println("方法的返回类型------" + methods[i].getreturntype());
                class[] params = methods[i].getparametertypes();
                for (int j = 0; j < params.length; j++) {
                    system.out.println("方法的参数类型------" + params[j]);
                }
            }
        }

     

     

 

  • hashcode()

    这个方法返回该对象的哈希码值,支持这个方法主要是为了提升哈希表的性能如(java.util.hashmap),这个方法返回类型为一个integer类型;同一个对象调用多次这个方法返回的hashcode值一定会相同;如果两个对象调用equals方法比较返回true,那么这个对象的hashcode值一定相等;如果两个对象调用equals方法返回为false那么这个对象的hashcode值一定不相同.

      
       public static void main(string[] args) {
    
            @data
            class demo {
                private integer age;
                private string name;
            }
            //hashcode()方法
            demo d = new demo();
            d.setname("张三");
            d.setage(12);
            demo d1 = new demo();
            d1.setname("李四");
            d1.setage(12);
            
            //获取对象的hashcode值
            integer hashcode = d.hashcode();
            system.out.println("张三的hashcode值为---------" + hashcode);
            
            //两个对象的hashcode值(两个对象不相等)
            system.out.println(d.equals(d1));
            system.out.println(d.hashcode() + "-------------" + d1.hashcode());
            
            //两个对象的hashcode值(两个对象相等)
            d1.setname("张三");
            system.out.println(d.equals(d1));
            system.out.println(d.hashcode() + "-------------" + d1.hashcode());
    
        }

     

 

  • equals

    这个方法主要比较其他对象和此对象是否相等,返回类型为布尔型对于非空对象主要有:

    (1)如果同一个对象调用equals方法,返回true

    (2)如果obj.equals(obj2)返回的是true,那么obj2.equals(obj)也返回true,也称为equals方法的对称性

    (3)equals方法的传递性,如果x.equals(y)和y.equals(z)都返回true,那么x.equals(z)也一定返回true

    (4)equals方法的一致性,如果x.equals(y)返回true或者false,那么不管多少次调用都应该返回相同的结果

    (5)对于任何非空的对象,x.equals(null),都返回false

    (6)如果x.equals(y)返回true,只有x和y引用同一个对象,那么x==y返回true

    (7)如果两个对象调用equals方法返回true,那么这两个对象的hashcode值一定相同

     

  • tostring

    一般我们构建实体的时候重写此方法,如果不进行重写,那么默认返回"getclass().getname() + '@' + integer.tohexstring(hashcode())"

     

  • notify()

    主要唤醒在这个对象上等待的单个线程,选择哪个线程是随机的,线程等待的对象是通过调用wait方法监控的对象,被唤醒的对象会释放当前对象上的锁;

    被唤醒的线程只能是当前对象监视管理的线程,那么对线程的监视管理有三种方式:

    (1)通过执行该对象的同步实例方法

    (2)加synchronized

    (3)执行该类的同步静态方法

    每个线程只能有一个对象监视管理

     

  • notifyall()

    唤醒正在此对象监视器上等待的所有线程,详见notify方法

 

  • wait(long)/wait(long,int)/wait()

    使当前线程等待,知道其他线程调用notify()或者notifyall()或者已经超时才会唤醒,当前线程必须是在当前的对象的监视管理中;