package java.lang; public class Object { /* 一个本地方法,具体是用C(C++)在DLL中实现的,然后通过JNI调用。*/ private static native void registerNatives(); /* 对象初始化时自动调用此方法*/ static { registerNatives(); } /* 返回此 Object 的运行时类。*/ public final native Class<?> getClass(); /* hashCode 的常规协定是: 1.在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。 2.如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。 3.如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。 */ public native int hashCode(); public boolean equals(Object obj) { return (this == obj); } /*本地CLONE方法,用于对象的复制。*/ protected native Object clone() throws CloneNotSupportedException; /*返回该对象的字符串表示。非常重要的方法*/ public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } /*唤醒在此对象监视器上等待的单个线程。*/ public final native void notify(); /*唤醒在此对象监视器上等待的所有线程。*/ public final native void notifyAll(); /*在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。换句话说,此方法的行为就好像它仅执行 wait(0) 调用一样。 当前线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等待,直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来。然后该线程将等到重新获得对监视器的所有权后才能继续执行。*/ public final void wait() throws InterruptedException { wait(0); } /*在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。*/ public final native void wait(long timeout) throws InterruptedException; /* 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。*/ 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 >= 500000 || (nanos != 0 && timeout == 0)) { timeout++; } wait(timeout); } /*当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。*/ protected void finalize() throws Throwable { } }
1.volatile:为了获得最佳速度,java允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的
原始值对比,volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值
回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值,volatile关键字就是提示VM:对于这个成员变量不能保存它的私
有拷贝,而应直接与共享成员变量交互。
使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。
2.transient:transient声明一个实例变量,当对象存储时,它的值不需要维持
3.native:native是方法修饰符,native是由另外一种语言实现的本地方法,
一. 什么是Native Method(转载自javaeye某位大侠的文章)
简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native
Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如
在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数。
"A native method is a Java method whose implementation is provided by non-java code."
在定义一个native method时,并不提供实现体(有些像定义一个java interface),因为其实现体是由非java语言在外面实现的。,下面给了一个示例:
public class IHaveNatives
{
native public void Native1( int x ) ;
native static public long Native2() ;
native synchronized private float Native3( Object o ) ;
native void Native4( int[] ary ) throws Exception ;
}
这些方法的声明描述了一些非java代码在这些java代码里看起来像什么样子(view).
标识符native可以与所有其它的java标识符连用,但是abstract除外。这是合理的,因为native暗示这些方法是有实现体的,只不过这些
实现体是非java的,但是abstract却显然的指明这些方法无实现体。native与其它java标识符连用时,其意义同非Native
Method并无差别,比如native static表明这个方法可以在不产生类的实例时直接调用,这非常方便,比如当你想用一个native
method去调用一个C的类库时。上面的第三个方法用到了native
synchronized,JVM在进入这个方法的实现体之前会执行同步锁机制(就像java的多线程。)
一个native
method方法可以返回任何java类型,包括非基本类型,而且同样可以进行异常控制。这些方法的实现体可以制一个异常并且将其抛出,这一点与java
的方法非常相似。当一个native
method接收到一些非基本类型时如Object或一个整型数组时,这个方法可以访问这非些基本型的内部,但是这将使这个native方法依赖于你所访
问的java类的实现。有一点要牢牢记住:我们可以在一个native
method的本地实现中访问所有的java特性,但是这要依赖于你所访问的java特性的实现,而且这样做远远不如在java语言中使用那些特性方便和
容易。
native
method的存在并不会对其他类调用这些本地方法产生任何影响,实际上调用这些方法的其他类甚至不知道它所调用的是一个本地方法。JVM将控制调用本地
方法的所有细节。需要注意当我们将一个本地方法声明为final的情况。用java实现的方法体在被编译时可能会因为内联而产生效率上的提升。但是一个
native final方法是否也能获得这样的好处却是值得怀疑的,但是这只是一个代码优化方面的问题,对功能实现没有影响。
如果一个含有本地方法的类被继承,子类会继承这个本地方法并且可以用java语言重写这个方法(这个似乎看起来有些奇怪),同样的如果一个本地方法被fianl标识,它被继承后不能被重写。
本地方法非常有用,因为它有效地扩充了jvm.事实上,我们所写的java代码已经用到了本地方法,在sun的java的并发(多线程)的机制实现中,许
多与操作系统的接触点都用到了本地方法,这使得java程序能够超越java运行时的界限。有了本地方法,java程序可以做任何应用层次的任务。
二.为什么要使用Native Method
java使用起来非常方便,然而有些层次的任务用java实现起来不容易,或者我们对程序的效率很在意时,问题就来了。
与java环境外交互:
有时java应用需要与java外面的环境交互。这是本地方法存在的主要原因,你可以想想java需要与一些底层系统如操作系统或某些硬件交换信息时的情
况。本地方法正是这样一种交流机制:它为我们提供了一个非常简洁的接口,而且我们无需去了解java应用之外的繁琐的细节。
与操作系统交互:
JVM支持着java语言本身和运行时库,它是java程序赖以生存的平台,它由一个解释器(解释字节码)和一些连接到本地代码的库组成。然而不管怎
样,它毕竟不是一个完整的系统,它经常依赖于一些底层(underneath在下面的)系统的支持。这些底层系统常常是强大的操作系统。通过使用本地方
法,我们得以用java实现了jre的与底层系统的交互,甚至JVM的一些部分就是用C写的,还有,如果我们要使用一些java语言本身没有提供封装的操
作系统的特性时,我们也需要使用本地方法。
Sun's Java
Sun的解释器是用C实现的,这使得它能像一些普通的C一样与外部交互。jre大部分是用java实现的,它也通过一些本地方法与外界交互。例如:类
java.lang.Thread 的
setPriority()方法是用java实现的,但是它实现调用的是该类里的本地方法setPriority0()。这个本地方法是用C实现的,并被
植入JVM内部,在Windows 95的平台上,这个本地方法最终将调用Win32 SetPriority()
API。这是一个本地方法的具体实现由JVM直接提供,更多的情况是本地方法由外部的动态链接库(external
dynamic link library)提供,然后被JVM调用。
三.JVM怎样使Native Method跑起来:
我们知道,当一个类第一次被使用到时,这个类的字节码会被加载到内存,并且只会回载一次。在这个被加载的字节码的入口维持着一个该类所有方法描述符的
list,这些方法描述符包含这样一些信息:方法代码存于何处,它有哪些参数,方法的描述符(public之类)等等。
如果一个方法描述符内有native,这个描述符块将有一个指向该方法的实现的指针。这些实现在一些DLL文件内,但是它们会被操作系统加载到java程
序的地址空间。当一个带有本地方法的类被加载时,其相关的DLL并未被加载,因此指向方法实现的指针并不会被设置。当本地方法被调用之前,这些DLL才会
被加载,这是通过调用java.system.loadLibrary()实现的。
最后需要提示的是,使用本地方法是有开销的,它丧失了java的很多好处。如果别无选择,我们可以选择使用本地方法。
发表评论
-
abbot_llib
2013-06-28 08:30 0abbot_llibabbot_llibabbot_lliba ... -
abbot_release
2013-06-28 08:12 314abbot_releaseabbot_releaseabb ... -
xmlAnalyzer
2013-06-17 02:41 557java xmlAnalyzer java xmlAna ... -
String StringBuffer StringBuilder区别
2013-02-23 09:57 7411. String 类 String 类是属于不可变 ... -
StringBuilder 详解
2013-02-23 09:50 1034Java中java.lang.StringBuilde ... -
System.nano()详解
2013-02-19 09:34 1435System.nanoTime只能用于计算时间差,不能用于 ... -
import satatic 详解
2013-01-24 10:46 673静态导入是JDK1.5中的新特性。 一般我们导入 ... -
Class000-Java体系
2012-11-22 01:02 441JAVA知识体系 j2se 1.Java ... -
Object类详解三
2012-11-22 00:50 491Object类解析 好久没来写。最近看到同学也在写,也跟 ... -
Object类详解二
2012-11-22 00:49 531构造方法摘要 Object() ... -
访问控制符
2012-11-19 22:10 0访问控制符的作用 ... -
静态方法[继承-重写-隐藏]
2012-11-18 02:21 708静态方法可以通过二种形式来调用,一种是类名加方法名,另一种是类 ...
相关推荐
1. **对象的创建与类型转换**:Java中的每一个对象都是Object类的实例,因此,当我们创建任何类的实例时,实际上也是在创建一个Object类型的实例。同时,由于所有类都继承自Object,因此在必要的时候,我们可以进行...
#### 一、Object类详解 **1.1 概述** 在Java语言中,`Object` 类是所有类的基础。它位于类层次结构的顶端,这意味着所有的类,无论显式还是隐式地,都直接或间接地继承自 `Object` 类。这种设计确保了所有类都共享...
Object-C语言详解(文档) 仅供学习交流! 后续会持续分享相关资源,记得关注哦! Object-C语言详解(文档) 仅供学习交流! 后续会持续分享相关资源,记得关注哦! Object-C语言详解(文档) 仅供学习交流! ...
# Java核心知识点详解:Object类与常用API ## Object类概览 ### 1.1 概述 在Java编程语言中,`java.lang.Object`类具有非常特殊的地位,它是所有Java类的基类,即使程序员没有明确地指定某个类继承自`Object`类,...
1. **Object类介绍** Object类提供了创建自定义对象的便利,避免了手动定义构造函数的复杂性。所有JavaScript对象都是Object的实例,或者是直接或间接继承自Object的实例。 2. **Object类主要属性** - `...
所以,要想在ObjectTest类中调用clone()方法,你需要创建一个继承自Object的类,并在子类中调用clone()。这是Java中关于权限修饰符的一个重要概念。 Java Object类是所有Java类的根,它定义了一些基本的方法,这些...
### Flash Object标签及其属性详解 在HTML中嵌入Flash内容是一项常见的需求,尤其是在早期Web开发中。`<object>`标签是实现这一目标的关键工具之一。本文将深入探讨使用`<object>`标签及其相关属性来嵌入Flash内容...
### Java Object 类详解 #### 一、概述 `Object` 类是 Java 语言中最基础的类,位于 `java.lang` 包中。它是所有 Java 类的超类,即使程序员在定义一个新类时未明确指定该类继承自任何类,默认情况下,这个类也将...
`Object`类有一个默认的无参构造器,它不做任何特别的操作。当你创建一个类的对象时,这个构造器会被调用,除非你在自定义类中定义了自己的构造器。 2. **equals() 方法**: `equals()`方法用于比较两个对象是否...
### Unity3D Webplayer UnityObject 详解 #### UnityObject简介 UnityObject 是一款JavaScript脚本,主要用于简化Unity的内容嵌入到HTML中。该脚本具备检测Unity网络播放器插件的功能,并能初始化网络播放器的安装...
### Java包装类与集合类详解 #### 包装类概述 在Java中,为了更好地处理基本数据类型(如`int`、`double`等),Java提供了八种包装类,每种包装类都将基本数据类型“封装”起来,使得基本类型也能拥有对象特性,并...
Object类的方法是Java编程的基础,它们为所有对象提供了基本的行为。掌握这些方法的用法和最佳实践,可以帮助我们编写出更加健壮、高效和可维护的Java代码。通过重写equals、hashCode和toString方法,我们可以确保...
Object-C语言详解《word文档》 Object-C语言详解《word文档》 仅供学习交流! 后续会持续分享相关资源,记得关注哦!
这意味着每一个自定义的类(除非明确指定继承其他类)都将隐式地继承自`Object`类。`Object`类提供了一些核心方法,这些方法对于Java应用程序来说至关重要。 ### 重要方法详解 #### 1. `toString()` 方法 `...
《Object ARX 类天正墙体的自定义实体详解》 Object ARX,全称为AutoCAD Object Application Programming Interface,是Autodesk公司为开发基于AutoCAD的应用程序提供的一种编程接口。通过Object ARX,开发者可以...
### Object-C 基础详解 #### 方法传参机制 在Object-C中,方法的参数传递遵循特定的规则。理解这些规则对于编写高效且安全的代码至关重要。 - **基本类型(值传递)**:例如`int`等基本数据类型,在传递时会创建...
### SQLHelper 类详解 #### 一、概述 在.NET框架中,经常需要与数据库进行交互以实现数据存储、检索等功能。对于频繁的操作,手动编写连接、执行语句、关闭连接等代码不仅繁琐而且容易出错。为了提高开发效率并...
本文将深入探讨ActiveObject中的一个关键对象——Msxml2.DOMDocument,以及它在ASP.NET AJAX WebService中的应用。 Msxml2.DOMDocument是Microsoft XML库(MSXML)中的核心组件,它实现了W3C的Document Object ...
Java 常用类及方法详解 在Java编程语言中,有一些基础且常用的类和方法,对于初学者和长期未接触Java的开发者来说,熟悉这些基本元素是至关重要的。本篇文档将对其中的一些关键类,如Object、String、StringBuffer...