• 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()或者已经超时才会唤醒,当前线程必须是在当前的对象的监视管理中;

  notify()/notifyAll()/wait():示例代码

  

/**
* @title: ThreadDemo
* @projectName umBasic
* @description: TODO
* @author wh
* @date 2019/7/617:58
*/
package com.um.test; public class ThreadDemo { public static void main(String[]args){
Goods goods = new Goods();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try{
goods.product();
}catch (Exception e){
e.printStackTrace();
}
}
}); Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try{
goods.customer();
}catch (Exception e){
e.printStackTrace();
}
}
}); Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
try{
goods.customer();
}catch (Exception e){
e.printStackTrace();
}
}
});
t1.start();
t2.start();
t3.start();
} } class Goods{
private static Integer Max_COUNT=10; Integer goodsNum = 0;
public synchronized void product() throws InterruptedException{
while (true){
System.out.println(Thread.currentThread().getName()+"product"+goodsNum);
Thread.sleep(10);
if(goodsNum>Max_COUNT){
System.out.println("数量超出无需生产");
wait();
}else{
goodsNum++;
}
notifyAll();
}
} public synchronized void customer() throws InterruptedException{
while (true){
System.out.println(Thread.currentThread().getName()+"product"+goodsNum);
Thread.sleep(10);
if(goodsNum<=0){
System.out.println("数量不够");
wait();
}else{
goodsNum--;
}
notifyAll();
}
} }

java中Object源码理解的更多相关文章

  1. jdk之object源码理解

    Java所有类都继承与Object,本文谈谈我对object源码的理解,如果有错的,请看官多多批评指正. 1.registerNatives() private static native void ...

  2. jdk之java.lang.Integer源码理解

    基本数据类型的包装类java.lang.Integer是我们频繁使用的一个系统类,那么通过一个示例反应出的几个问题来深入理解一下此类的源码. 需求:实现Integer类型的两个数值交换. packag ...

  3. Java中ArrayList源码分析

    一.简介 ArrayList是一个数组队列,相当于动态数组.每个ArrayList实例都有自己的容量,该容量至少和所存储数据的个数一样大小,在每次添加数据时,它会使用ensureCapacity()保 ...

  4. Java中HashMap源码分析

    一.HashMap概述 HashMap基于哈希表的Map接口的实现.此实现提供所有可选的映射操作,并允许使用null值和null键.(除了不同步和允许使用null之外,HashMap类与Hashtab ...

  5. Java中Thread源码剖析

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 关于线程,用很长时间了,主线程下的子线程去做一些事情,就是一个代理模式,主线程分代理权给子线程,子线 ...

  6. 结合java.util.TreeMap源码理解红黑树

    前言 本篇将结合JDK1.6的TreeMap源码,来一起探索红-黑树的奥秘.红黑树是解决二叉搜索树的非平衡问题. 当插入(或者删除)一个新节点时,为了使树保持平衡,必须遵循一定的规则,这个规则就是红- ...

  7. java中jdbc源码解读

    在jdbc中一个重要的接口类就是java.sql.Driver,其中有一个重要的方法:Connection connect(String url, java.util.Propeties info); ...

  8. java中LinkedList源码分析

    ArrayList是动态数组,其实本质就是对数组的操作.那么LinkedList实现原理和ArrayList是完全不一样的.现在就来分析一下ArrayList和LinkeList的优劣吧LinkedL ...

  9. java中AQS源码分析

    AQS内部采用CLH队列.CLH队列是由节点组成.内部的Node节点包含的状态有 static final int CANCELLED =  1; static final int SIGNAL    ...

随机推荐

  1. JS 实现Map

    function Map() { this.arr = new Array(); var struct = function(key, value) { this.key = key; this.va ...

  2. 图像金字塔(pyramid)与 SIFT 图像特征提取(feature extractor)

    David Lowe(SIFT 的提出者) 0. 图像金字塔变换(matlab) matlab 对图像金字塔变换接口的支持(impyramid),十分简单好用. 其支持在reduce和expand两种 ...

  3. 简化网站开发:SiteMesh小工具

    在一个站点的制备,几乎所有的页面将具有相同的部分.导航栏例如,顶,每一页都是一样的,在底部的版权声明,每一页还都是一样的. 因此,在顶部导航栏的准备.第一种方法是直接复制的所有导航栏的代码,这种方法是 ...

  4. HQL链接查询

    和SQL查询一样,HQL也支持各种各样的连接查询,如内连接.外连接.我们知道在SQL中可通过join字句实现多表之间的连接查询.HQL同样提供了连接查询机制,还允许显示指定迫切内连接和迫切左外连接.H ...

  5. ajax默认form表单提交,导致实体不识别

    出现位置:实体比较复杂,包含List之类的时候 public class AdvertisementType { /// <summary> /// 广告位名称 /// </summ ...

  6. WPF编游戏系列 之七 动画效果(2)

    原文:WPF编游戏系列 之七 动画效果(2)        上一篇已经对关闭窗口图标进行了动画效果处理,本篇将对窗口界面的显示和关闭效果进行处理.由于所有的动画效果都是针对窗口界面的Canvas,所以 ...

  7. css3 位置选择器 类似jq的:eq(0)

    JQ使用 :eq(位置),可以选择第几个元素 CSS3里面新增了一个用法,:nth-child(位置) 可实现和JQ同样的功能 需要注意的是jq第一个是从0开始,CSS的第一个是从1开始

  8. C++和QML混合的QT程序调试方法

    以前调试只是QML或者只是C++的QT程序很简单,断点打上,直接debug按钮一点,喝一口水,自然就停在断点了. 这次遇到C++和QML混合的程序,把CONFIG+=declarative_debug ...

  9. FreeNAS 11.0 正式发布,提供 S3 兼容的对象存储服务

    FreeNAS 11.0 正式版已发布,该版本带来了新的虚拟化和对象存储功能.FreeNAS 11.0 将 bhyve 虚拟机添加到其受欢迎的 SAN / NAS.Jail 和插件中,让用户可以在 F ...

  10. Cindy components(配色很不错)

    https://sourceforge.net/projects/tcycomponents/