- 浏览: 29891 次
- 性别:
- 来自: 广州
最近访客 更多访客>>
最新评论
-
DragCheng:
这标题亮了
深入研究java.long.Class类(转) -
油炸大龙虾:
这个标题害人啊,哎……
深入研究java.long.Class类(转)
Java关键字(keywords)
abstract default if private this
boolean do implements protected throw
break double import public throws
byte else instanceof return transient
case extends int short try
catch final interface static void
char finally long strictfp volatile
class float native super while
const for new switch
continue goto package synchronized
以上是java specifications中定义的keywords,一共48个,其中常见的三个看似是关键字的true, false, null,都不是关键字,而是作为一个单独标识类型。
其中,不常用到的关键字有:const,goto,native,strictfp,transient,volatile。
const和goto为java中的保留字。
1. native
native是方法修饰符。Native方法是由另外一种语言(如c/c++,FORTRAN,汇编)实现的本地方法。因为在外部实现了方法,所以在java代码中,就不需要声明了,有点类似于借口方法。Native可以和其他一些修饰符连用,但是abstract方法和Interface方法不能用native来修饰。
Example:
为什么需要使用native method?请参考:
http://www.iteye.com/topic/72543 java Native Method初涉
2. 用strictfp修饰类或方法,可以确保浮点运算(以及所有切断)正如早期的Java版本那样准确。切断只影响某些操作的指数。当一个类被strictfp修饰,所有的方法自动被strictfp修饰。
strictfp的意思是FP-strict,也就是说精确浮点的意思。在Java虚拟机进行浮点运算时,如果没有指定strictfp关键字时,Java的编译器以及运行环境在对浮点运算的表达式是采取一种近似于我行我素的行为来完成这些操作,以致于得到的结果往往无法令你满意。而一旦使用了strictfp来声明一个类、接口或者方法时,那么所声明的范围内Java的编译器以及运行环境会完全依照浮点规范IEEE-754来执行。因此如果你想让你的浮点运算更加精确,而且不会因为不同的硬件平台所执行的结果不一致的话,那就请用关键字strictfp。
你可以将一个类、接口以及方法声明为strictfp,但是不允许对接口中的方法以及构造函数声明strictfp关键字,例如下面的代码:
合法的使用关键字strictfp
错误的使用方法
一旦使用了关键字strictfp来声明某个类、接口或者方法时,那么在这个关键字所声明的范围内所有浮点运算都是精确的,符合IEEE-754规范的。例如一个类被声明为strictfp,那么该类中所有的方法都是strictfp的。
3.transient
如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。例如:
这里,如果T类的一个对象写入一个持久的存储区域,a的内容不被保存,但b的将被保存。
4. volatile
volatile修饰变量。在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
看看Java Language Specification中的例子。
条件:一个线程不停的调用方法one(),一个线程不停的调用方法two()。我测试过多次,这种情况好像一直没有出现。
结果偶尔会出现j大于i的情况,因为方法没有同步,所以会出现i和j可能不是一次更新。一种防止这种情况发生的办法就是声明两个方法为synchronized 的。
Java代码
这样可以防止两个方法同时被执行,还可以保证j和i被同时更新,这样一来i和j的值一直是一样的。
另外一种途径就是把i和j声明为volatile。
abstract default if private this
boolean do implements protected throw
break double import public throws
byte else instanceof return transient
case extends int short try
catch final interface static void
char finally long strictfp volatile
class float native super while
const for new switch
continue goto package synchronized
以上是java specifications中定义的keywords,一共48个,其中常见的三个看似是关键字的true, false, null,都不是关键字,而是作为一个单独标识类型。
其中,不常用到的关键字有:const,goto,native,strictfp,transient,volatile。
const和goto为java中的保留字。
1. native
native是方法修饰符。Native方法是由另外一种语言(如c/c++,FORTRAN,汇编)实现的本地方法。因为在外部实现了方法,所以在java代码中,就不需要声明了,有点类似于借口方法。Native可以和其他一些修饰符连用,但是abstract方法和Interface方法不能用native来修饰。
Example:
public interface TestInterface { void doMethod(); } public class Test implements TestInterface { public native void doMethod(); private native int doMethodB(); public native synchronized String doMethodC(); static native void doMethodD(); }
为什么需要使用native method?请参考:
http://www.iteye.com/topic/72543 java Native Method初涉
2. 用strictfp修饰类或方法,可以确保浮点运算(以及所有切断)正如早期的Java版本那样准确。切断只影响某些操作的指数。当一个类被strictfp修饰,所有的方法自动被strictfp修饰。
strictfp的意思是FP-strict,也就是说精确浮点的意思。在Java虚拟机进行浮点运算时,如果没有指定strictfp关键字时,Java的编译器以及运行环境在对浮点运算的表达式是采取一种近似于我行我素的行为来完成这些操作,以致于得到的结果往往无法令你满意。而一旦使用了strictfp来声明一个类、接口或者方法时,那么所声明的范围内Java的编译器以及运行环境会完全依照浮点规范IEEE-754来执行。因此如果你想让你的浮点运算更加精确,而且不会因为不同的硬件平台所执行的结果不一致的话,那就请用关键字strictfp。
你可以将一个类、接口以及方法声明为strictfp,但是不允许对接口中的方法以及构造函数声明strictfp关键字,例如下面的代码:
合法的使用关键字strictfp
strictfp interface A {} public strictfp class FpDemo1 { strictfp void f() {} }
错误的使用方法
interface A { strictfp void f(); } public class FpDemo2 { strictfp FpDemo2() {} }
一旦使用了关键字strictfp来声明某个类、接口或者方法时,那么在这个关键字所声明的范围内所有浮点运算都是精确的,符合IEEE-754规范的。例如一个类被声明为strictfp,那么该类中所有的方法都是strictfp的。
3.transient
如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。例如:
class T { transient int a; //不需要维持 int b; //需要维持 }
这里,如果T类的一个对象写入一个持久的存储区域,a的内容不被保存,但b的将被保存。
4. volatile
volatile修饰变量。在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
看看Java Language Specification中的例子。
条件:一个线程不停的调用方法one(),一个线程不停的调用方法two()。我测试过多次,这种情况好像一直没有出现。
class Test { static int i = 0, j = 0; static void one() { i++; j++; } static void two() { System.out.println("i=" + i + " j=" + j); } }
结果偶尔会出现j大于i的情况,因为方法没有同步,所以会出现i和j可能不是一次更新。一种防止这种情况发生的办法就是声明两个方法为synchronized 的。
Java代码
class Test { static int i = 0, j = 0; static synchronized void one() { i++; j++; } static synchronized void two() { System.out.println("i=" + i + " j=" + j); } }
这样可以防止两个方法同时被执行,还可以保证j和i被同时更新,这样一来i和j的值一直是一样的。
另外一种途径就是把i和j声明为volatile。
class Test { static volatile int i = 0, j = 0; static void one() { i++; j++; } static void two() { System.out.println("i=" + i + " j=" + j); } }
发表评论
-
JAVA内存溢出解析(转)
2010-01-13 15:16 737JAVA内存溢出解析 核心 ... -
Java的内存泄漏(转)
2010-01-13 14:36 395问题的提出 Java 的一个重要优点就是通过垃圾收集器(Ga ... -
Java方法继承、方法重载、方法覆盖小总结(转)
2010-01-06 17:21 965Java方法继承、方法重载 ... -
JVM原理学习—— 类的初始化(转)
2010-01-05 16:53 598类的初始化工作,主 ... -
JVM原理学习 —— 虚拟机规范(转)
2010-01-05 16:51 946《Inside the JVM》一开始就指出,所谓“虚拟机”实 ... -
深入探索Java工作原理:JVM,内存回收及其他
2010-01-05 16:43 910深入探索Java工作原理: ... -
java里类的继承机制-成员变量(转)
2009-12-31 14:03 2147在网上看见一个关于java ... -
java里类的继承机制-构造方法(转)
2009-12-31 14:00 910这次我想深入探究以下java里类的继承机制。 我们知道,继承是 ... -
java 继承类 变量、静态变量、构造函数执行顺序(转)
2009-12-31 13:35 1958java 继承类 变量、静态变量、构造函数执行顺序 class ... -
map,set,list,等JAVA中集合解析
2009-12-30 15:51 1312map,set,list,等JAVA中集合 ... -
Class.getResourceAsStream 和 ClassLoader.getResourceAsStream
2009-12-29 11:21 630两个都可以用于从 classpath 里面进行资源读取, c ... -
JTA和JDBC事务
2009-12-28 15:44 864JTA和JDBC事务(转) 一般情况下,J2EE应用服务器 ... -
深入研究java.long.Class类(转)
2009-12-27 23:13 958前言:Java的类库日益庞大,所包含的类和接口也不计其数。但其 ... -
javap的使用
2009-12-16 22:38 672javap简介 原文网址 http://www.javare ... -
JAVA 基本数据类型取值范围
2009-12-16 15:55 1209先看一段代码 public class ... -
Tomcat启动分析
2009-12-14 17:23 1415Tomcat启动分析 核心提示:用 文本编辑工具打开用于启动T ... -
servlet的介绍
2009-12-14 17:14 505servlet的介绍 关键字: servlet的介绍 在 e ...
相关推荐
native:本地方法,用于定义一个使用本地语言实现的方法。 new:新建,用于创建一个新的对象。 null:空,用于表示一个空对象引用。 package:包,用于定义一个包。 private:私有,用于定义一个私有成员或方法。 ...
native,transient,volatile,strictfp,CMM,synchronized,java socket,压缩与解压缩,多线程,垃圾回收算法,JVM ClassLoader,IO流,反射机制,JNDI, GUI布局管理器,JMS, Java Mail, JNDI reference,java事件处理...
99乘法表java源码 ls 查看目录下文件 java规则 代码都定义在类中,用class...char fianlly native strictfp void class float new super volatile continue for null switch while default if package enum synchroniz
关于strictfp关键字的官方语法解释
instanceof, int, interface, long, native, new, package, private, protected, public, return, short, static, strictfp, super, switch, synchronized, this, throw, throws, transient, try, void, volatile, ...
Continuing, you investigate strictfp, class literals, synchronized, volatile, the enhanced for loop statement, autoboxing/unboxing, and transient fields. The book also briefly presents most (if not ...
仿知乎java源码SevenBobcat-Java2CppTranslator 翻译器支持将受限版本的 Java 翻译成 C++。 源语言是 Java 的受限版本,没有高级功能,如嵌套类、匿名类、接口、枚举、注释、泛型、增强的 for 循环、可变参数、装箱/...
Java 关键字(静态、最终、strictfp)。 内部类和嵌套类。 抽象类。 第2课。 继承和封装。 第3课。 多态性。 InstanceOf 关键字。 异常(已检查、未检查、错误)。 编写自己的异常。 第 4 课。 接口(功能接口,...
JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...
Java中没有 3、移位操作符右边的参数要先进行模32运算(当左边的变元是long型,则模64),如1。浮点运算的中间结果程度是不一致的。有些处理器适用80bit浮点存储器,有些则使用64bit、80bit。直到最后才把结果截断为...
抽象const for int公共抛出断言继续最终接口返回抛出布尔值默认值最终长短瞬变中断做浮点数本地静态真字节双转到新strictfp尝试情况否则,如果null超级无效捕获枚举实现包开关volatile char扩展导入私有同步,而类...
--> JAVA IDENTIFIERS:- 用于类、变量和方法的名称称为标识符。 --> JAVA MODIFIERS:- 像其他语言... 有两类修饰符: 访问修饰符:default、public、protected、private 非访问修饰符:final、abstract、strictfp
则与之相反。 •包装类还可以实现基本类型变量和字符串之间的转换,除了Character之外的所有包装类都提供了一个 parseXxx(String s)静态方法。 •如果将基本类型转换为这符串,只需在后面加+ “”进行连接...
一个用于IRC开发的Java API,特别是为IRC bot开发的,但几乎可以用于任何与IRC相关的内容。 可以在irc.strictfp.com的#IRC频道上找到我们的IRC频道,希望在那里见到您!