文章目录
1.Object根父类代码结构
方法一:void registerNatives()
1、 registerNatives函数前面有native关键字修饰,Java中,用native关键字修饰的函数表明该方法的实现并不是在Java中去完成, 而是由C/C++去完成,并被编译成了.dll,由Java去调用。方法的具体实现体在dll文件中,对于不同平台,其具体实现应该有所不同。
2、 用native修饰,即表示操作系统需要提供此方法,Java本身需要使用。具体到registerNatives()方法本身, 其主要作用是将C/C++中的方法映射到Java中的native方法,实现方法命名的解耦。
**3、**从方法的代码中看到Object类定义了一个静态初始化块,我们知道当创建Java对象时,系统总是先调用静态初始化块
4、 在静态初始化块中调用了registerNatives()方法,并且使用了private来修饰,表面这个方法是私有的并不被外部调用。
*/
方法二:Class<?> getClass()
1、作用:返回Object对象的运行时对象的类
2、返回值为对象的类
例如:
package cn.Ivan.test;
import java.util.ArrayList;
/**
* @author 阿飞
* @date 2021/10/5
*/
public class ObjectTest {
public static void main(String[] args) {
Object obj1 = new Object();
System.out.println("obj1 的类: " + obj1.getClass());
String obj2 = new String();
System.out.println("obj2 的类: " + obj2.getClass());
ArrayList<Integer> obj3 = new ArrayList<>();
System.out.println("obj3 的类: " + obj3.getClass());
}
}
运行结果为:
结果分析:obj1,obj2,obj3分别属于Object、String、ArrayList类的对象,所以getClass会返回各自的运行时对象的类名
方法三:int hashCode()
1、作用:返回对象的哈希码值
2、返回值:对象的哈希值,int类型
例如:
package cn.Ivan.test;
/**
* @author 阿飞
* @date 2021/10/5
*/
public class ObjectTest {
public static void main(String[] args) {
Integer a = new Integer(10);
System.out.println("The hashCode of Integer class object a is :" + a .hashCode());
String str = new String("Hello, Welcome in java world");
System.out.println("The hashCode of String class object str is :" + str.hashCode());
}
}
运行结果:
方法四:boolean equals(Object obj)
public boolean equals(Object obj) {
return (this == obj);
}
1、作用:判断某个对象是否“等于”这个对象
2、返回值:布尔值true or false
3、性质:
a.自反性,对于非空引用值x,注意是非空,后面会说到null的情况
x.equals(x)会返回true
即:自身总是与自身“等于”。注意理解等于的实际意义,区别于现实中的等于
b.对称性:
x.equals(y)为true,那么y.equals(x)也是true
c.可传递的
x.equals(y)为true
y.equals(z)为true
那么x.equals(z)也为true
d.前后一致性:指的是在equals比较方法中使用的信息未被修改时,始终会返回相同的true or false结果
e.对于任何非空数值x,x.equals(null)应返回false
f.非空数值x和y在引用同一个对象时,equals方法返回true
g.当equals方法被覆写时,hashCode方法也会被覆盖,为了保证相等的对象具有相同的哈希值
例如:
public static void main(String[] args) {
// get an integer, which is an object
Integer x = new Integer(50);
// get a float, which is an object as well
Float y = new Float(50f);
// check if these are equal,which is
// false since they are different class
System.out.println("" + x.equals(y));
// check if x is equal with another int 50
System.out.println("" + x.equals(50));
}
运行结果:
2.全部源码注释解析
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.
*Object类是类层次结构的根。
*每个类都有 Object类作为超类。 所有对象,包括数组,都实现了这个类的方法。
*
* @author unascribed
* @see java.lang.Class
* @since JDK1.0
*/
public class Object {
private static native void registerNatives();
static {
registerNatives();
}
/**
* registerNatives函数前面有native关键字修饰,Java中,用native关键字修饰的函数表明该方法的实现并不是在Java中去完成,
* 而是由C/C++去完成,并被编译成了.dll,由Java去调用。方法的具体实现体在dll文件中,对于不同平台,其具体实现应该有所不同。
* 用native修饰,即表示操作系统,需要提供此方法,Java本身需要使用。具体到registerNatives()方法本身,
* 其主要作用是将C/C++中的方法映射到Java中的native方法,实现方法命名的解耦。
* 从上面的代码中看到Object类定义了一个静态初始化块,我们知道当创建Java对象时,系统总是先调用静态初始化块
* 在上面的静态初始化块中调用了registerNatives()方法,并且使用了private来修饰,表面这个方法是私有的并不被外部调用。
*/
/**
* 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.
*返回此 Object的运行时类。
*返回的Class对象是被表示的类的"静态同步"方法锁定的对象。
*
*
* The actual result type is {@code Class<? extends |X|>}
* where |X|is the erasure of the static type of the
* expression on which {@code getClass} is called.</b> For
* example, no cast is required in this code fragment:</p>
*实际的结果类型是 Class<? extends |X|>}
*其中 |X|是对调用 getClass的表达式的静态类型的擦除。
*例如,此代码片段中不需要强制转换:
*
* <p>
* {@code Number n = 0; }<br>
* {@code Class<? extends Number> c = n.getClass(); }
* </p>
*
* @return The {@code Class} object that represents the runtime
* class of this object.
*方法返回值:表示此对象的运行时类的Class对象。
* @jls 15.8.2 Class Literals
*/
public final native Class<?> getClass();
/**
* 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}.
* 返回对象的哈希码值。 此方法是为了支持散列表的优点
* 例如 HashMap 提供的散列表。
*
* <p>
* The general contract of {@code hashCode} is:
* <ul>
* <li>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.
* <li>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.
* <li>It is <em>not</em> 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.
* </ul>
* <p>
* hashCode}的一般约定是:
* 每当在 Java 应用程序执行期间在同一对象上多次调用它时,hashCode 方法必须始终返回相同的整数,
* 前提是在对象的 equals比较中使用的信息没有被修改。
* 这个整数不需要从应用程序的一次执行到同一应用程序的另一次执行保持一致。//就是说每一次执行都会有一个特定的Integer值,但每一次都不一样,不一样在哪儿?在下面!因此不可视为常量值
* 如果根据 equals(Object)方法,两个对象相等,则对每个对象调用 hashCode 方法 这两个对象必须产生相同的整数结果。
* 如果根据equals(java.lang.Object)方法,如果两个对象不相等,则不需要调用hashCode两个对象中的每一个上的方法必须产生不同的整数结果。
* 但是,程序员应该意识到为不相等的对象生成不同的整数结果可能会影响哈希表的性能。
*
* 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.)
* 尽可能的合理实用,类Object 定义的 hashCode 方法确实为不同的对象返回不同的整数。
* (这通常通过将对象的内部地址转换为整数来实现,但 Java&trade 编程语言不需要这种实现技术。)
*
* @return a hash code value for this object.
* 方法返回值:此对象的hash值
* @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.
* <p>
* The equals method implements an equivalence relation
* on non-null object references:
* 判断其他某个对象是否“等于”这个对象。
* equals方法在非空对象引用上实现等价关系:
* <ul>
* <li>It is <i>reflexive</i>: for any non-null reference value
* {@code x}, {@code x.equals(x)} should return
* {@code true}.
*它是自反的:对于任何非空引用值x,
* x.equals(x)} 应该返回 true。自身与自身总是“等于”的
*
* <li>It is <i>symmetric</i>: 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}.
* 它是对称的:对于任何非空引用值 x和 y,x.equals(y)
* 应该返回 true当且仅当 y.equals (x) 返回 true。X等于Y也返回true,并且X=Y和Y=X是等价对称的
*
* <li>It is <i>transitive</i>: 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}.
* 它是可传递的:对于任何非空引用值 x、 y 和 z,
* 如果 x.equals(y)返回 true 和 y.equals(z) 返回 true,
* 那么 x.equals(z) 应该返回 true。
*
* <li>It is <i>consistent</i>: 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.
* 它是一致的:对于任何非空引用值 x }和 y,
*多次调用x.equals(y) 始终返回 true或始终返回 false,前提是没有在对象上的 equals 比较中使用的信息被修改。
*
* <li>For any non-null reference value {@code x},
* {@code x.equals(null)} should return {@code false}.
* </ul>
* 对于任何非空引用值x,x.equals(null)应返回 false。既然是非空引用值,与null相compare肯定是false,不可能是true,非空!非空!非空!
*
* <p>
* 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}).
* Object类的 equals 方法在对象上实现了最具辨别力的可能等价关系;
* 也就是说,对于任何非空引用值 x 和 y,
* 当且仅当 x和 y引用同一个对象时,此方法才返回 true(x == y的值为 true)。
*
* <p>
* 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.
* 请注意,每当此方法(equals(obj))被覆盖时,通常都需要覆盖 hashCode方法
* 以维护 hashCode方法的一般约定,即相等的对象必须具有相同的哈希码。
*
* @param obj the reference object with which to compare.
* 传递的参数:obj 要比较的参考对象
* @return {@code true} if this object is the same as the obj
* argument; {@code false} otherwise.
*返回值:如果对象与对象相同,返回true,否则返回false。返回值是布尔值
*
* @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表达式:
*
* 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.
*
* x.clone() != x 为真,,并且表达式:
* x.clone().getClass() == x.getClass()为真,但这些不是绝对要求。
* 通常的情况是:
* x.clone().equals(x) 为真,这不是绝对要求。
*
* 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()}.
*
* 按照约定,返回的对象应该通过调用获得super.clone。
* 如果一个类和它的所有超类(Object 除外)都遵守这个约定,
* 那么 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.
*
* 按照惯例,这个方法返回的对象应该独立于这个对象(它被克隆)。
* 为了实现这种独立性,可能需要在返回之前修改 super.clone返回的对象的一个或多个字段。
* 通常,这意味着复制包含被克隆对象的内部“深层结构”的任何可变对象,并将对这些对象的引用替换为对副本的引用。
* 如果一个类只包含原始字段或对不可变对象的引用,那么通常情况下,super.clone返回的对象中没有字段需要修改。
*
* <p>
* The method {@code clone} for class {@code Object} performs a
* specific 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.
* <p>
* Object类的方法 clone执行特定的克隆操作。
* 首先,如果这个对象的类没有实现接口cloneable,则抛出一个异常 CloneNotSupportedException
* 请注意,所有数组都被认为实现了接口 cloneable,并且数组类型 T[] 的 clone方法的返回类型是 T[],其中 T 是 任何引用或原始类型。
* 否则,此方法会创建此对象的类的新实例,并使用此对象的相应字段的内容来初始化其所有字段,就像通过赋值一样; 字段的内容本身不会被克隆。
* 因此,此方法执行此对象的“浅拷贝”,而不是“深拷贝”操作。
* 也就是说:除开数组外,如果对象的类没有实现Cloneable接口,则拷贝后会自动创建一个类的新的实例,并对这个实例的所有字段进行初始化
*
* 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.
*
*Object类本身并没有实现Cloneable接口,
* 因此在类为 Object的对象上调用clone方法会导致在运行时抛出异常。
*
* @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.
* 抛出:CloneNotSupportedException
* 如果对象的类不支持 Cloneable 接口。 覆盖clone方法的子类也可以抛出此异常以指示无法克隆实例。
* @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.
* <p>
* 返回对象的字符串表示形式,通常情况下,toString方法返回一个字符串以文本的形式表示这个对象
* 返回结果应该是一个简洁但信息丰富的表示并且易于阅读
* 建议所有子类都覆盖toString方法
*
*
* 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())
*
* Object类的 toString方法返回一个字符串,该字符串由对象是其实例的类的名称、
* at-sign 字符 `{@code @}' 和对象hash值的无富含十六进制表示组成。
* 换句话说,此方法返回一个等于以下值的字符串:
* 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.
*
* 唤醒在此对象的监视器上等待的单个线程。
* 如果有任何线程正在等待该对象,则选择其中一个线程被唤醒。
* 选择是任意的,并且由实现决定。
* 线程通过调用 wait方法之一在对象的监视器上等待。
*
* <p>
* 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.
* <p>
* 被唤醒的线程将无法继续,直到当前线程放弃对该对象的锁定。
* 被唤醒的线程将以通常的方式与可能正在积极竞争以同步此对象的任何其他线程进行竞争;
* 例如,被唤醒的线程在成为下一个锁定该对象的线程时没有可靠的特权或劣势。
*
* 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:
* 此方法只能由作为此对象监视器的所有者的线程调用。
* 线程通过以下三种方式之一成为对象监视器的所有者:
*
* <ul>
* <li>By executing a synchronized instance method of that object.
* <li>By executing the body of a {@code synchronized} statement
* that synchronizes on the object.
* <li>For objects of type {@code Class,} by executing a
* synchronized static method of that class.。,1
*通过执行该对象的同步实例方法。
*通过执行在对象上同步的synchronized语句的主体。
*对于 Class类型的对象,通过执行该类的同步静态方法。
* </ul>
* <p>
* 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();//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.
* 唤醒在此对象监视器上等待的所有线程。
* 线程通过调用wait方法之一在对象的监视器上等待。
*
* <p>
* 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.
* 被唤醒的线程将无法继续,直到当前线程放弃对该对象的锁定。
* 被唤醒的线程将以通常的方式与可能正在积极竞争以同步此对象的任何其他线程进行竞争;
* 例如,被唤醒的线程在成为下一个锁定该对象的线程时不享有可靠的特权或劣势。
*
* <p>
* 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.
* 此方法只能由作为此对象监视器的所有者的线程调用。
* 有关线程可以成为监视器所有者的方式的描述,请参阅notify方法。
*
* @throws IllegalMonitorStateException if the current thread is not
* the owner of this object's monitor.
* 与notify相同
* @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.
* 使当前线程等待,直到另一个线程为此对象调用notify()方法或notifyAll()}方法,
* 或指定等待时间已经过去了。
*
*
* The current thread must own this object's monitor.
* This method causes the current thread (call it <var>T</var>) to
* place itself in the wait set for this object and then to relinquish
* any and all synchronization claims on this object. Thread <var>T</var>
* becomes disabled for thread scheduling purposes and lies dormant
* until one of four things happens:
* 当前线程必须拥有此对象的监视器。
* 此方法使当前线程(称为 <var>T</var>)将自己置于此对象的等待集中,然后放弃对该对象的任何和所有同步声明。
* 线程 T出于线程调度目的而被禁用并处于休眠状态,直到发生以下四种情况之一:
*
* 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.
*某个其他线程为此对象调用 notify方法,并且线程 T恰好被任意选择为要唤醒的线程。
*其他一些线程为此对象调用notifyAll方法。
*其他一些线程 interrupt()线程T。
*或多或少已经过了指定的实时时间。 但是,如果timeout为零,则不考虑实时性,线程只是等待直到收到通知。
*
*
* The thread <var>T</var> 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 <var>T</var> 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.
*然后,线程 T 从该对象的等待集中移除,并重新启用线程调度。
*然后它以通常的方式与其他线程竞争在对象上同步的权利;
* 一旦它获得了对象的控制权,它对对象的所有同步声明都将恢复到状态 - 即调用 wait 方法时的情况。
* 然后线程 T 从 wait 方法的调用中返回。
* 因此,从 wait 方法返回时,对象和线程 T 的同步状态与调用 wait 方法时完全相同。
*
*
* <p>
* A thread can also wake up without being notified, interrupted, or
* timing out, a so-called <i>spurious wakeup</i>. 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:
* 线程也可以在没有被通知、中断或超时的情况下唤醒,即所谓的虚假唤醒。
* 虽然这在实践中很少发生,但应用程序必须通过测试应该导致线程被唤醒的条件来防止它,如果条件不满足则继续等待。
* 换句话说,等待应该总是在循环中发生,就像这样:
*
* <pre>
* synchronized (obj) {
* while (<condition does not hold>)
* obj.wait(timeout);
* ... // Perform action appropriate to condition
* }
* </pre>
* (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).
* (有关此主题的更多信息,请参阅 Doug Lea 的“Java 中的并发编程(第二版)”(Addison-Wesley,2000)中的第 3.2.3 节,
* 或 Joshua Bloch 的“Effective Java Programming Language Guide”(Addison- 韦斯利,2001 年)。
*
* <p>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.
* 如果当前线程在等待之前或等待时被任何线程中断,则抛出 InterruptedException。
* 直到如上所述恢复此对象的锁定状态后,才会抛出此异常。
*
* <p>
* 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.
* 请注意,wait 方法将当前线程放入此对象的等待集中,因此仅解锁此对象;
* 当前线程可能同步的任何其他对象在线程等待时保持锁定。
* <p>
* 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.
* 此方法只能由作为此对象监视器的所有者的线程调用。
* 有关线程可以成为监视器所有者的方式的描述,请参阅notify方法。
*
* @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.
* 使当前线程等待,直到另一个线程为此对象调用notify()方法或notifyAll()方法,
* 或其他一些线程中断 当前线程;或者已经过去了一定的实时时间。
* <p>
* 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:
* 此方法类似于一个参数的 wait 方法,但它允许更好地控制在放弃之前等待通知的时间量。
* 以纳秒为单位测量的实时量由下式给出:
* 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)}.
* 在所有其他方面,此方法与一个参数的方法 wait(long) 执行相同的操作。
* 特别是,wait(0, 0)}与wait(0)的含义相同。
*
* <p>
* 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
*or the {@code notifyAll} method.
*The timeout period, specified by {@code timeout}
* milliseconds plus {@code nanos} nanoseconds arguments, has elapsed.
* 当前线程必须拥有此对象的监视器。 线程释放此监视器的所有权并等待,直到发生以下两种情况之一:
* 另一个线程通过调用 notify 方法或notifyAll方法通知等待此对象监视器的线程唤醒。
* 由 timeout毫秒加上nanos 纳秒参数指定的超时时间已经过去。
*
*
* The thread then waits until it can re-obtain ownership of the
* monitor and resumes execution.
*然后线程等待直到它可以重新获得监视器的所有权并恢复执行。
*
* As in the one argument version, interrupts and spurious wakeups are
* possible, and this method should always be used in a loop:
* 与单参数版本一样,中断和虚假唤醒是可能的,并且应始终在循环中使用此方法:
* <pre>
* synchronized (obj) {
* while (<condition does not hold>)
* obj.wait(timeout, nanos);
* ... // Perform action appropriate to condition
* }
* </pre>
* 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.
* 此方法只能由作为此对象监视器的所有者的线程调用。
* 有关线程可以成为监视器所有者的方式的描述,请参阅 notify方法。
*
*
* @param timeout the maximum time to wait in milliseconds.
* @param nanos additional time, in nanoseconds range
* 0-999999.
* @throws IllegalArgumentException if the value of timeout is
* negative or the value of nanos is
* not in the range 0-999999.
* @throws IllegalMonitorStateException if the current thread is not
* the owner of this 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.
*/
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos > 0) {
timeout++;
}
wait(timeout);
}
/**
* 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.
* In other words, this method behaves exactly as if it simply
* performs the call {@code wait(0)}.
* 使当前线程等待,直到另一个线程为此对象调用 notify() 方法或 notifyAll()方法。
* 换句话说,这个方法的行为就像它只是执行调用 wait(0) 一样。
*
* <p>
* The current thread must own this object's monitor. The thread
* releases ownership of this monitor and waits until another thread
* notifies threads waiting on this object's monitor to wake up
* either through a call to the {@code notify} method or the
* {@code notifyAll} method. The thread then waits until it can
* re-obtain ownership of the monitor and resumes execution.
* 当前线程必须拥有此对象的监视器。
* 线程释放此监视器的所有权并等待,直到另一个线程通过调用 notify 方法或 notifyAll方法通知在此对象监视器上等待的线程唤醒。
* 然后线程等待直到它可以重新获得监视器的所有权并恢复执行。
*
* <p>
* As in the one argument version, interrupts and spurious wakeups are
* possible, and this method should always be used in a loop:
* 与单参数版本一样,中断和虚假唤醒是可能的,并且应始终在循环中使用此方法:
* <pre>
* synchronized (obj) {
* while (<condition does not hold>)
* obj.wait();
* ... // Perform action appropriate to condition
* }
* </pre>
* 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.
* 此方法只能由作为此对象监视器的所有者的线程调用。
* 有关线程可以成为监视器所有者的方式的描述,请参阅 notify方法。
*
* @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 void wait() throws InterruptedException {
wait(0);
}
/**
* Called by the garbage collector on an object when garbage collection
* determines that there are no more references to the object.
* A subclass overrides the {@code finalize} method to dispose of
* system resources or to perform other cleanup.
* 当垃圾收集器确定不再有对对象的引用时,由垃圾收集器在对象上调用。
* 子类覆盖finalize方法来处理系统资源或执行其他清理。
*
* <p>
* The general contract of {@code finalize} is that it is invoked
* if and when the Java™ virtual
* machine has determined that there is no longer any
* means by which this object can be accessed by any thread that has
* not yet died, except as a result of an action taken by the
* finalization of some other object or class which is ready to be
* finalized. The {@code finalize} method may take any action, including
* making this object available again to other threads; the usual purpose
* of {@code finalize}, however, is to perform cleanup actions before
* the object is irrevocably discarded. For example, the finalize method
* for an object that represents an input/output connection might perform
* explicit I/O transactions to break the connection before the object is
* permanently discarded.
* finalize 的一般约定是它在 Java&trade时被调用。
* 虚拟机已确定不再有任何方法可以让任何尚未终止的线程访问此对象,除非由于某些其他对象或类已准备好终止而采取的行动 .
* finalize方法可以执行任何操作,包括使该对象再次可供其他线程使用;
* 然而,finalize 的通常目的是在对象被不可撤销地丢弃之前执行清理操作。
* 例如,表示输入/输出连接的对象的 finalize 方法可能会执行显式 I/O 事务以在对象被永久丢弃之前中断连接。
*
* <p>
* The {@code finalize} method of class {@code Object} performs no
* special action; it simply returns normally. Subclasses of
* {@code Object} may override this definition.
* Object 类的 finalize 方法不执行任何特殊操作; 它只是正常返回。 Object 的子类可以覆盖这个定义。
*
* <p>
* The Java programming language does not guarantee which thread will
* invoke the {@code finalize} method for any given object. It is
* guaranteed, however, that the thread that invokes finalize will not
* be holding any user-visible synchronization locks when finalize is
* invoked. If an uncaught exception is thrown by the finalize method,
* the exception is ignored and finalization of that object terminates.
* Java 编程语言不保证哪个线程将调用任何给定对象的 finalize 方法。
* 但是,可以保证调用 finalize 的线程在调用 finalize 时不会持有任何用户可见的同步锁。
* 如果 finalize 方法抛出未捕获的异常,则忽略该异常并终止该对象的终结。
*
* <p>
* After the {@code finalize} method has been invoked for an object, no
* further action is taken until the Java virtual machine has again
* determined that there is no longer any means by which this object can
* be accessed by any thread that has not yet died, including possible
* actions by other objects or classes which are ready to be finalized,
* at which point the object may be discarded.
* 在为对象调用 finalize方法后,不会采取进一步的操作,
* 直到 Java 虚拟机再次确定任何尚未终止的线程都无法再访问该对象 ,
* 包括准备好完成的其他对象或类的可能操作,此时该对象可能会被丢弃。
*
* <p>
* The {@code finalize} method is never invoked more than once by a Java
* virtual machine for any given object.
* 对于任何给定对象,Java 虚拟机永远不会多次调用 finalize 方法。
*
* <p>
* Any exception thrown by the {@code finalize} method causes
* the finalization of this object to be halted, but is otherwise
* ignored.
* finalize 方法抛出的任何异常都会导致此对象的终结被暂停,但会被忽略。
*
* @throws Throwable the {@code Exception} raised by this method
*抛出:由此方法引发的Exception
* @see java.lang.ref.WeakReference
* @see java.lang.ref.PhantomReference
* @jls 12.6 Finalization of Class Instances
*/
protected void finalize() throws Throwable { }
}
3.遇到的小问题
问题1:native关键字
private static native void registerNatives();
static {
registerNatives();
}
native即JNI,Java Native Interface(Java本地接口,用户和本地C代码进行互操作的API),也就是说一个native method就是一个java调用非java代码的接口,该方法由非java语言实现,例如C语言。
1、native是用作 java和其他语言进行协作时使用的,也就是native后的函数的实现不是用java编写的
2、既然都不是java,那就不管其源码如何,只需知道此方法已经被实现即可
3、native的意思是告诉操作系统,这个函数我要用,你必须给我实现,所以native关键字的函数时OS实现的,java平台只能调用
4、java是跨平台的语言,跨平台付出的代价就是牺牲一些对底层的控制。而java要实现对底层的控制就需要其他语言的帮助,这里的native就是帮助java实现对底层的控制。
问题2:jls(java language specification java语言规范
* @jls 15.8.2 Class Literals
className.class在jls中定义为Class Literal,15.8.2位规范版本号
问题3:see注解
注解@see可以在注释汇总实现链接跳转,可以指向包,类,方法,属性。
使用方法:@see package.class#member
1、指向的目标在当前类:#+
@see #field
@see #method(type,…)
@see #constructor(type,…)
2、指向的目标在当前包,类名+#+
@seeClass #field
@see Class#method(type,…)
@see Class#constructor(type,…)
@see Class
3、指向的目标在其他包中,需要全路径
@see package.Class#field
@see package.Class#method(Type, Type,…)
@see package.Class#method(Type argname, Type argname,…)
@see package.Class#constructor(Type, Type,…)
@see package.Class#constructor(Type argname, Type argname,…)
@see package.Class.NestedClass
@see package.Class
@see package
问题4:param注解
@param是MyBatis提供的,作为Dao层的注解,用于传递参数,从而与SQL中的字段名相对应
作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中(一般通过#{}的方式,${}会有sql注入的问题)