API--01--Object类 源码解析

API--01--Object类 源码解析 一Object类简述Object类是所有对象的顶级父类,存在于java.lang包中这个包不需要我们手动导包Object类没有定义属性一共有13个方法Object中具有的属性和行为是Java语言设计背后的思维体现。这里写的代码是JDK8中的其他版本的JDK可能略有不同。Object类方法说明Object类中的大部分方法都是native方法用此关键字修饰的方法是Java中的本地方法一般是用C/C语言来实现。构造方法Object类中没有显示的提供构造方法这是编译器默认提供的。registerNatives()方法Java中 创建对象时先调用静态代码块(即registerNatives()方法)。native关键字表示该方法不是由java语言编写而是通过C/C来完成的并被编译成.dll 之后才由Java调用,方法的具体实现是在dll文件中.用native修饰即表示操作系统需要提供此方法Java本身需要使用。具体到registerNatives()方法本身其主要作用是将C/C中的方法映射到Java中的native方法实现方法命名的解耦。registerNatives()修饰符为private在Java源码中此方法的声明后有紧接着一段静态代码块去执行。getClass()方法常用于java反射机制hashCode()hashCode 方法返回散列值。返回值默认是由对象的地址转换而来的。同一个对象调用 hashCode 的返回值是相等的。两个对象的 equals 相等那 hashCode 一定相等。两个对象的 equals 不相等那 hashCode 也不一定都不相等,可能出现相等的情况equals()toString()默认返回 类名地址 的格式来展示对象的地址值如a00000.Studenta0834e7。如果想看属性值我们可以重写这个方法重写后返回的就是把属性值拼接成一个字符串。package cn.tedu.object; //测试Object用法 public class Test1_Object { public static void main(String[] args) { //创建对象测试 Person p new Person(熊大,20,10,森林); System.out.println(p);//要是不重写toString()就是使用的Object提供的默认方式只能打印对象在内存的地址 System.out.println(p);//由于重写了toString()所以打印的是属性的值 } } //定义类提供属性 class Person{ //构造source-generate constrctor using fileds public Person() {} public Person(String name, int age, double salary, String addr) { this.name name; this.age age; this.salary salary; this.addr addr; } //属性 private String name; private int age; private double salary; private String addr; //set() get() public String getName() { return name; } public void setName(String name) { this.name name; } public int getAge() { return age; } public void setAge(int age) { this.age age; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary salary; } public String getAddr() { return addr; } public void setAddr(String addr) { this.addr addr; } //toString()source - generate toString()-ok Override//重写的是Object提供的toString()是为了查看属性值 public String toString() { return Person [name name , age age , salary salary , addr addr ]; } }finalize()方法垃圾回收器确定不存在对该对象的更多引用时由对象的垃圾回收器调用此方法。子类重写 finalize 方法以配置系统资源或执行其他清除。final,finally,finalize的区别对象的引用1、强引用StrongReference强引用是使用最普遍的引用。如果一个对象具有强引用那垃圾回收器绝不会回收它。如下Object onew Object(); // 强引用当内存空间不足Java虚拟机宁愿抛出OutOfMemoryError错误使程序异常终止也不会靠随意回收具有强引用的对象来解决内存不足的问题。如果不使用时要通过如下方式来弱化引用如下onull; // 帮助垃圾收集器回收此对象2、软引用SoftReference如果一个对象只具有软引用则内存空间足够垃圾回收器就不会回收它如果内存空间不足了就会回收这些对象的内存。只要垃圾回收器没有回收它该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。3、弱引用WeakReference当一个对象仅仅被weak reference弱引用指向, 而没有任何其他strong reference强引用指向的时候, 如果这时GC运行, 那么这个对象就会被回收不论当前的内存空间是否足够这个对象都会被回收。弱引用与软引用的区别在于只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中一旦发现了只具有弱引用的对象不管当前内存空间足够与否都会回收它的内存。不过由于垃圾回收器是一个优先级很低的线程因此不一定会很快发现那些只具有弱引用的对象。4、虚引用PhantomReference“虚引用”顾名思义就是形同虚设与其他几种引用都不同虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用那么它就和没有任何引用一样在任何时候都可能被垃圾回收器回收。虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于虚引用必须和引用队列 ReferenceQueue联合使用。当垃圾回收器准备回收一个对象时如果发现它还有虚引用就会在回收对象的内存之前把这个虚引用加入到与之 关联的引用队列中。垃圾回收器确定不存在对该对象的更多引用时由对象的垃圾回收器调用此方法。子类重写 finalize 方法以配置系统资源或执行其他清除。finalize的执行过程(生命周期)首先大致描述一下finalize流程当对象变成(GC Roots)不可达时GC会判断该对象是否覆盖了finalize方法若未覆盖则直接将其回收。否则若对象未执行过finalize方法将其放入F-Queue队列由一低优先级线程执行该队列中对象的finalize方法。执行finalize方法完毕后GC会再次判断该对象是否可达若不可达则进行回收否则对象“复活”wait()wait方法就是使当前线程等待该对象的锁当前线程必须是该对象的拥有者也就是具有该对象的锁。wait()方法一直等待直到获得锁或者被中断。wait(long timeout)设定一个超时间隔如果在规定时间内没有获得锁就返回。调用该方法后当前线程进入睡眠状态直到以下事件发生。其他线程调用了该对象的notify方法。其他线程调用了该对象的notifyAll方法。其他线程调用了interrupt中断该线程。时间间隔到了。此时该线程就可以被调度了如果是被中断的话就抛出一个InterruptedException异常。notify()该方法唤醒在该对象上等待的某个线程。notifyAll()该方法唤醒在该对象上等待的所有线程。clone()clone()函数的用途是用来另存一个当前存在的对象。