JDK8-Object源码,java编程思想pdf百度云

*/

package java.lang;

/**

  • Class {@code Object} is the root of the class hierarchy【类层次结构,等级】.

  • Every class has {@code Object} as a superclass. All objects,

  • including arrays, implement the methods of this class.

  • @author unascribed

  • @see java.lang.Class

  • @since JDK1.0

*/

public class Object {

private static native void registerNatives();

static {

registerNatives();

}

/**

  • Returns the runtime class of this {@code Object}. The returned

  • {@code Class} object is the object that is locked by {@code

  • static synchronized} methods of the represented class.

  • The actual result type is {@code Class<? extends |X|>}

  • where {@code |X|} is the erasure of the static type of the

  • expression on which {@code getClass} is called. For

  • example, no cast is required in this code fragment:

  • {@code Number n = 0; }

  • {@code Class<? extends Number> c = n.getClass(); }

  • @return The {@code Class} object that represents the runtime

  •     class of this object.
    
  • @jls 15.8.2 Class Literals

*/

public final native Class<?> getClass(); //返回一个对象的运行时类,通过返回的类对象可以获取运行时类的相关属性和方法,就是java的反射机制

/**

  • Returns a hash code value for the object. This method is

  • supported for the benefit of hash tables such as those provided by

  • {@link java.util.HashMap}.

  • The general contract of {@code hashCode} is:

    • Whenever it is invoked on the same object more than once during
    • an execution of a Java application, the {@code hashCode} method
      
    • must consistently return the same integer, provided no information
      
    • used in {@code equals} comparisons on the object is modified.
      
    • This integer need not remain consistent from one execution of an
      
    • application to another execution of the same application.
      
    • If two objects are equal according to the {@code equals(Object)}
    • method, then calling the {@code hashCode} method on each of
      
    • the two objects must produce the same integer result.
      
    • It is not required that if two objects are unequal
    • according to the {@link java.lang.Object#equals(java.lang.Object)}
      
    • method, then calling the {@code hashCode} method on each of the
      
    • two objects must produce distinct integer results.  However, the
      
    • programmer should be aware that producing distinct integer results
      
    • for unequal objects may improve the performance of hash tables.
      
    • As much as is reasonably practical, the hashCode method defined by

    • class {@code Object} does return distinct integers for distinct

    • objects. (This is typically implemented by converting the internal

    • address of the object into an integer, but this implementation

    • technique is not required by the

    • Java™ programming language.)

    • @return a hash code value for this object.

    • @see java.lang.Object#equals(java.lang.Object)

    • @see java.lang.System#identityHashCode

    • */

      public native int hashCode(); //返回对象的散列码

      /**

      • Indicates【表明】 whether some other object is “equal to” this one.

      • The {@code equals} method implements an equivalence relation

      • on non-null object references:

        • It is reflexive: 【自反性】for any non-null reference value
        • {@code x}, {@code x.equals(x)} should return
          
        • {@code true}.
          
        • It is symmetric: 【对称性】for any non-null reference values
        • {@code x} and {@code y}, {@code x.equals(y)}
          
        • should return {@code true} if and only if
          
        • {@code y.equals(x)} returns {@code true}.
          
        • It is transitive:【传递性】 for any non-null reference values
        • {@code x}, {@code y}, and {@code z}, if
          
        • {@code x.equals(y)} returns {@code true} and
          
        • {@code y.equals(z)} returns {@code true}, then
          
        • {@code x.equals(z)} should return {@code true}.
          
        • It is consistent:【一致性】 for any non-null reference values
        • {@code x} and {@code y}, multiple invocations of
          
        • {@code x.equals(y)} consistently return {@code true}
          
        • or consistently return {@code false}, provided no
          
        • information used in {@code equals} comparisons on the
          
        • objects is modified.在对象equals方法中所用信息没有被修改时,对于非空引用的多次比较返回始终或true或false
          
        • For any non-null reference value {@code x},
        • {@code x.equals(null)} should return {@code false}.非空引用x的x.equals(null)均返回false
          
      • The {@code equals} method for class {@code Object} implements

      • the most discriminating【差别】 possible equivalence relation on objects;

      • that is, for any non-null reference values {@code x} and

      • {@code y}, this method returns {@code true} if and only

      • if {@code x} and {@code y} refer to the same object

      • ({@code x == y} has the value {@code true}).

      • Note that it is generally necessary to override the {@code hashCode}

      • method whenever this method is overridden, so as to maintain the

      • general contract for the {@code hashCode} method, which states

      • that equal objects must have equal hash codes.

      • @param obj the reference object with which to compare.

      • @return {@code true} if this object is the same as the obj

      •      argument; {@code false} otherwise.
        
      • @see #hashCode()

      • @see java.util.HashMap

      • */

        public boolean equals(Object obj) {

        return (this == obj); //判断两个对象是否相等,而==是判断两个两个对象的引用是否相等(或者在一些其他如基本类型中被用来比较两个值是否相等)

        }

        /**

        • Creates and returns a copy of this object. The precise meaning

        • of “copy” may depend on the class of the object. The general

        • intent【目的】 is that, for any object {@code x}, the expression:

        • x.clone() != x

        • will be true, and that the expression:

        • x.clone().getClass() == x.getClass()

        • will be {@code true}, but these are not absolute requirements.

        • While it is typically the case that:

        • x.clone().equals(x)

        • will be {@code true}, this is not an absolute requirement.

        • By convention【约定】, the returned object should be obtained by calling

        • {@code super.clone}. If a class and all of its superclasses (except

        • {@code Object}) obey【服从】 this convention, it will be the case that

        • {@code x.clone().getClass() == x.getClass()}.

        • By convention, the object returned by this method should be independent

        • of this object (which is being cloned). To achieve this independence,

        • it may be necessary to modify one or more fields of the object returned

        • by {@code super.clone} before returning it. Typically, this means

        • copying any mutable【易变的】 objects that comprise【由…组成】 the internal “deep structure”

        • of the object being cloned and replacing the references to these

        • objects with references to the copies. If a class contains only

        • primitive fields or references to immutable objects, then it is usually

        • the case that no fields in the object returned by {@code super.clone}

        • need to be modified.

        • The method {@code clone} for class {@code Object} performs a

        • specific

        《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

        【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

        cloning operation. First, if the class of this object does

        • not implement the interface {@code Cloneable}, then a

        • {@code CloneNotSupportedException} is thrown. Note that all arrays

        • are considered to implement the interface {@code Cloneable} and that

        • the return type of the {@code clone} method of an array type {@code T[]}

        • is {@code T[]} where T is any reference or primitive type.

        • Otherwise, this method creates a new instance of the class of this

        • object and initializes all its fields with exactly the contents of

        • the corresponding fields of this object, as if by assignment; the

        • contents of the fields are not themselves cloned. Thus, this method

        • performs a “shallow copy” of this object, not a “deep copy” operation.

        • The class {@code Object} does not itself implement the interface

        • {@code Cloneable}, so calling the {@code clone} method on an object

        • whose class is {@code Object} will result in throwing an

        • exception at run time.

        • @return a clone of this instance.

        • @throws CloneNotSupportedException if the object’s class does not

        •           support the {@code Cloneable} interface. Subclasses
          
        •           that override the {@code clone} method can also
          
        •           throw this exception to indicate that an instance cannot
          
        •           be cloned.
          
        • @see java.lang.Cloneable

        */

        protected native Object clone() throws CloneNotSupportedException;

        /**

        • Returns a string representation of the object. In general, the

        • {@code toString} method returns a string that

        • “textually represents” this object. The result should

        • be a concise but informative representation that is easy for a

        • person to read.

        • It is recommended that all subclasses override this method.

        • The {@code toString} method for class {@code Object}

        • returns a string consisting of the name of the class of which the

        • object is an instance, the at-sign character `{@code @}’, and

        • the unsigned hexadecimal representation of the hash code of the

        • object. In other words, this method returns a string equal to the

        • value of:

        • getClass().getName() + ‘@’ + Integer.toHexString(hashCode())

        • @return a string representation of the object.

        */

        public String toString() {

        return getClass().getName() + “@” + Integer.toHexString(hashCode());

        }

        /**

        • Wakes up a single thread that is waiting on this object’s

        • monitor. If any threads are waiting on this object, one of them

        • is chosen to be awakened. The choice is arbitrary and occurs at

        • the discretion of the implementation. A thread waits on an object’s

        • monitor by calling one of the {@code wait} methods.

        • The awakened thread will not be able to proceed until the current

        • thread relinquishes the lock on this object. The awakened thread will

        • compete in the usual manner with any other threads that might be

        • actively competing to synchronize on this object; for example, the

        • awakened thread enjoys no reliable privilege or disadvantage in being

        • the next thread to lock this object.

        • This method should only be called by a thread that is the owner

        • of this object’s monitor. A thread becomes the owner of the

        • object’s monitor in one of three ways:

          • By executing a synchronized instance method of that object.
          • By executing the body of a {@code synchronized} statement
          • that synchronizes on the object.
            
          • For objects of type {@code Class,} by executing a
          • synchronized static method of that class.
            
        • Only one thread at a time can own an object’s monitor.

        • @throws IllegalMonitorStateException if the current thread is not

        •           the owner of this object's monitor.
          
        • @see java.lang.Object#notifyAll()

        • @see java.lang.Object#wait()

        • */

          public final native void notify();

          /**

          • Wakes up all threads that are waiting on this object’s monitor. A

          • thread waits on an object’s monitor by calling one of the

          • {@code wait} methods.

          • The awakened threads will not be able to proceed until the current

          • thread relinquishes the lock on this object. The awakened threads

          • will compete in the usual manner with any other threads that might

          • be actively competing to synchronize on this object; for example,

          • the awakened threads enjoy no reliable privilege or disadvantage in

          • being the next thread to lock this object.

          • This method should only be called by a thread that is the owner

          • of this object’s monitor. See the {@code notify} method for a

          • description of the ways in which a thread can become the owner of

          • a monitor.

          • @throws IllegalMonitorStateException if the current thread is not

          •           the owner of this object's monitor.
            
          • @see java.lang.Object#notify()

          • @see java.lang.Object#wait()

          */

          public final native void notifyAll();

          /**

          • Causes the current thread to wait until either another thread invokes the

          • {@link java.lang.Object#notify()} method or the

          • {@link java.lang.Object#notifyAll()} method for this object, or a

          • specified amount of time has elapsed.

          • The current thread must own this object’s monitor.

          • This method causes the current thread (call it T) to

          • place itself in the wait set for this object and then to relinquish

          • any and all synchronization claims on this object. Thread T

          • becomes disabled for thread scheduling purposes and lies dormant

          • until one of four things happens:

            • Some other thread invokes the {@code notify} method for this
            • object and thread T happens to be arbitrarily chosen as

            • the thread to be awakened.

            • Some other thread invokes the {@code notifyAll} method for this
            • object.

            • Some other thread {@linkplain Thread#interrupt() interrupts}
            • thread T.

            • The specified amount of real time has elapsed, more or less. If
            • {@code timeout} is zero, however, then real time is not taken into

            • consideration and the thread simply waits until notified.

          • The thread T is then removed from the wait set for this

          • object and re-enabled for thread scheduling. It then competes in the

          • usual manner with other threads for the right to synchronize on the

          • object; once it has gained control of the object, all its

          • synchronization claims on the object are restored to the status quo

          • ante - that is, to the situation as of the time that the {@code wait}

          • method was invoked. Thread T then returns from the

          • invocation of the {@code wait} method. Thus, on return from the

          • {@code wait} method, the synchronization state of the object and of

          • thread {@code T} is exactly as it was when the {@code wait} method

          • was invoked.

          • A thread can also wake up without being notified, interrupted, or

          • timing out, a so-called spurious wakeup. While this will rarely

          • occur in practice, applications must guard against it by testing for

          • the condition that should have caused the thread to be awakened, and

          • continuing to wait if the condition is not satisfied. In other words,

          • waits should always occur in loops, like this one:

          • synchronized (obj) {
            
          •     while (<condition does not hold>)
            
          •         obj.wait(timeout);
            
          •     ... // Perform action appropriate to condition
            
          • }
            
          • (For more information on this topic, see Section 3.2.3 in Doug Lea’s

          • “Concurrent Programming in Java (Second Edition)” (Addison-Wesley,

          • 2000), or Item 50 in Joshua Bloch’s "Effective Java Programming

          • Language Guide" (Addison-Wesley, 2001).

          • If the current thread is {@linkplain java.lang.Thread#interrupt()

          • interrupted} by any thread before or while it is waiting, then an

          • {@code InterruptedException} is thrown. This exception is not

          • thrown until the lock status of this object has been restored as

          • described above.

          • Note that the {@code wait} method, as it places the current thread

          • into the wait set for this object, unlocks only this object; any

          • other objects on which the current thread may be synchronized remain

          • locked while the thread waits.

          • This method should only be called by a thread that is the owner

          • of this object’s monitor. See the {@code notify} method for a

          • description of the ways in which a thread can become the owner of

          • a monitor.

          • @param timeout the maximum time to wait in milliseconds.

          • @throws IllegalArgumentException if the value of timeout is

          •           negative.
            
          • @throws IllegalMonitorStateException if the current thread is not

          •           the owner of the object's monitor.
            
          • @throws InterruptedException if any thread interrupted the

          •         current thread before or while the current thread
            
          •         was waiting for a notification.  The <i>interrupted
            
          •         status</i> of the current thread is cleared when
            
          •         this exception is thrown.
            
          • @see java.lang.Object#notify()

          • @see java.lang.Object#notifyAll()

          • */

            public final native void wait(long timeout) throws InterruptedException;

            /**

            • Causes the current thread to wait until another thread invokes the

            • {@link java.lang.Object#notify()} method or the

            • {@link java.lang.Object#notifyAll()} method for this object, or

            • some other thread interrupts the current thread, or a certain

            • amount of real time has elapsed.

            • This method is similar to the {@code wait} method of one

            • argument, but it allows finer control over the amount of time to

            • wait for a notification before giving up. The amount of real time,

            • measured in nanoseconds, is given by:

            • 1000000*timeout+nanos

            • In all other respects, this method does the same thing as the

            • method {@link #wait(long)} of one argument. In particular,

            • {@code wait(0, 0)} means the same thing as {@code wait(0)}.

            • The current thread must own this object’s monitor. The thread

            • releases ownership of this monitor and waits until either of the

            • following two conditions has occurred:

              • Another thread notifies threads waiting on this object's monitor
              • to wake up either through a call to the {@code notify} method
                
            • 0
              点赞
            • 0
              收藏
              觉得还不错? 一键收藏
            • 0
              评论
            评论
            添加红包

            请填写红包祝福语或标题

            红包个数最小为10个

            红包金额最低5元

            当前余额3.43前往充值 >
            需支付:10.00
            成就一亿技术人!
            领取后你会自动成为博主和红包主的粉丝 规则
            hope_wisdom
            发出的红包
            实付
            使用余额支付
            点击重新获取
            扫码支付
            钱包余额 0

            抵扣说明:

            1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
            2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

            余额充值