java 那些鲜为人知的保留字

一:Java中的instanceof关键字

(1)定义:instanceof是Java的一个二元操作符,和==,>,<是同一类东东。由于它是由字母组成的,所以也是Java的保留关键字。

它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。

(2)示例: instanceof有一些用处。比如我们写了一个处理账单的系统,其中有这样三个类:

  public class Bill {//省略细节}

  public class PhoneBill extends Bill {//省略细节}

  public class GasBill extends Bill {//省略细节}

  在处理程序里有一个方法,接受一个Bill类型的对象,计算金额。假设两种账单计算方法不同,而传入的Bill对象可能是两种中的任何一种,所以要用instanceof来判断:

public double calculate(Bill bill) {
  if (bill instanceof PhoneBill)
  //计算电话账单
  }
  if (bill instanceof GasBill) {
  //计算燃气账单
  }
  ...
  }
  这样就可以用一个方法处理两种子类。

  然而,这种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现,这是面向对象变成应有的做法,避免回到结构化编程模式。只要提供两个名字和返回值都相同,接受参数类型不同的方法就可以了:

 public double calculate(PhoneBill bill) {
  //计算电话账单
  }

  public double calculate(GasBill bill) {
  //计算燃气账单
  }

(3)所以,使用instanceof在绝大多数情况下并不是推荐的做法,应当好好利用多态;当然为了简单有时也是可以的。

二:java volatile 关键字

(1)就像大家更熟悉的const一样,volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。

如果没有volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。

(2)一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

1). 并行设备的硬件寄存器(如:状态寄存器)

2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)

3). 多线程应用中被几个任务共享的变量

这是区分C程序员和嵌入式系统程序员的最基本的问题:嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所有这些都要求使用volatile变量。不懂得volatile内容将会带来灾难。(非嵌入式的可以不用看了)

(3)与锁相比,Volatile变量是一种非常简单但同时又非常脆弱的同步机制,它在某些情况下将提供优于锁的性能和伸缩性。如果严格遵循 volatile 的使用条件 —— 即变量真正独立于其他变量和自己以前的值
—— 在某些情况下可以使用 volatile 代替 synchronized 来简化代码。然而,使用 volatile 的代码往往比使用锁的代码更加容易出错。本文介绍的模式涵盖了可以使用 volatile 代替 synchronized 的最常见的一些用例。遵循这些模式(注意使用时不要超过各自的限制)可以帮助您安全地实现大多数用例,使用 volatile变量获得更佳性能。

三:java
synchronized 关键字

(1) synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、
D等)正在用这个方法,有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,直接运行。
它包括两种用法:synchronized 方法和 synchronized 块,同一时刻最多只有一个线程执行这个段代码。

(2)synchronized
方法

1.方法声明时使用,放在范围操作符(public等)之后,返回类型声明(void等)之前.这时,线程获得的是成员锁,即一次只能有一个线程进入该方法,其他线程要想在此时调用该方法,只能排队等候,当前线程(就是在synchronized方法内部的线程)执行完该方法后,别的线程才能进入.例如:

public synchronized void synMethod(){
  //方法体
  }
2.对某一代码块使用,synchronized后跟括号,括号里是变量,这样,一次只有一个线程进入该代码块.此时,线程获得的是成员锁.例如:
public int synMethod(int a1){
  synchronized(a1){
  //一次只能有一个线程进入
  }
}

四:java synchronized 关键字

(1)超类
:用java术语来讲,被继承的类称为超类,继承的类称为子类,所以用super。

面向对象编程的最重要的特色之一,就是能够使用以前创建的类的方法和域。通过简单的类来创建功能强大的类,可以大幅地节省编程时间,更重要的是,这样做可以减少代码出错的机会;要在以前的类上构造新类,就必须在类声明中扩展这个类。

通过扩展一个超类,可以得到这个类的一个新副本,并且可以在其上添加其他功能。如果对这个新类并不做任何添加工作,那么,它的工作情况与超类完全相同,新类中会含有超类所声明和继承的、具有访问权限的所有方法和域

(2)对于超类,应该确切地理解this和super关键字的使用,下图演示了这两个关键字的使用。

import java.awt.*;
public class TestThisSuper extends Frame
{
<span style="white-space:pre">	</span>int b;
public TestThisSuper(String a)
{
<span style="white-space:pre">	</span>this (a,0);
}
public TestThisSuper(String a,int b)
{
<span style="white-space:pre">	</span>super(a);
<span style="white-space:pre">	</span>this.b= b;
}
}

五:strictfp, 即 strict float point (精确浮点)

(1)strictfp 关键字可应用于类、接口或方法。使用 strictfp 关键字声明一个方法时,该方法中所有的float和double表达式都严格遵守FP-strict的限制,符合

IEEE-754规范。当对一个类或接口使用 strictfp 关键字时,该类中的所有代码,包括嵌套类型中的初始设定值和代码,都将严格地进行计算。严格约束意味着

所有表达式的结果都必须是 IEEE 754 算法对操作数预期的结果,以单精度和双精度格式表示。如果你想让你的浮点运算更加精确,而且不会因为不同的硬件平台所执行的结果不一致的话,可以用关键字strictfp.

(2)示例

下面的示例演示了一个使用 strictfp 修饰符声明的方法。
// Example of precision control with strictfp:
public class MyClass2
{
public float aFloat;
public double aDouble;
public MyClass2(){}
public strictfp double add(float a, double b)
{
return (a + b);
}
public static void main(String[] args)
{
MyClass2 myClass2 = new MyClass2();
myClass2.aFloat = 0.6710339f;
myClass2.aDouble = 0.04150553411984792d;
double sum = myClass2.add(myClass2.aFloat, myClass2.aDouble);
System.out.println("float: " + myClass2.aFloat);
System.out.println("double: " + myClass2.aDouble);
System.out.println("sum: " + sum);
}
}
示例输出
float: 0.6710339
double: 0.04150553411984792
sum: 0.71253945297742238   // 而非 

六:Java提供一种机制叫做序列化

(1)通过有序的格式或者字节序列持久化java对象,其中包含对象的数据,还有对象的类型,和保存在对象中的数据类型。所以,如果我们已经序列化了一个对象,那么它可以被读取并通过对象的类型和其他信息进行反序列化,并最终获取对象的原型。

(2)ObjectInputStream 和 ObjectOutputStream对象是高级别的流对象,包含序列化和反序列化的方法。

ObjectOutputStream 拥有很多序列化对象的方法,最常用的是:

(3)那么哪里会需要序列化呢?序列化通常在需要通过网络传输数据,或者保存对象到文件的场合使用。这里说的数据是对象而不是文本。

现在的问题是,我们的网络架构和硬盘都只能识别二进制和字节,而不能识别Java对象。

序列化就是把Java对象中的value/states翻译为字节,以便通过网络传输或者保存。另外,反序列化就是通过读取字节码,并把它翻译回java对象

时间: 2024-08-04 16:41:32

java 那些鲜为人知的保留字的相关文章

1.Java标示符、保留字和数制

一.Java标识符 程序员对程序中的各个元素加以命名时使用的命名记号称为标识符(identifier).Java语言中,标识符是以字母,下划线(_),美元符($)开 始的一个字符序列,后面可以跟字母,下划线,美元符,数字.例如,identifier,userName,User_Name,_sys_val, $change为合法的标识符,而2mail room#,class 为非法的标识符. 二.Java保留字 具有专门的意义和用途,不能当作一般的标识符使用,这些标识符称为保留字(reserved

Java中的关键字/保留字

Java关键字是Java语言保留供内部使用的,如class用于定义类. 关键字也可以称为保留字,它们的意思是一样的,我们不能使用关键字作为变量名或方法名. 表2-1 Java中的关键字/保留字 abstract assert boolean break byte case catch char class const continue default do double else extends final finally float for goto if implements import

java的关键字与保留字

1,Java 关键字列表 (依字母排序 共50组): abstract, assert, boolean, break, byte, case, catch, char, class, const(保留关键字), continue, default, do, double, else, enum, extends, final, finally, float, for, goto(保留关键字), if, implements, import, instanceof, int, interface

Java的关键字和保留字

JAVA的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等.保留字是为java预留的关键字,他们虽然现在没有作为关键字,但在以后的升级版本中有可能作为关键字. Java 关键字列表 (依字母排序 共50组): abstract, assert,boolean, break, byte, case, catch, char, class, continue, default, do, double, else, enum,extends, final, fina

java 那些鲜为人知的序列化(debug)

一:起因 Java提供一种机制叫做序列化,其实就是把实体类的对象(Bean对象)以二进制的形式就行存储和传输(读取),多有需要序列化的对象对应的类需要继承 接口 Serializable. (1)通过有序的格式或者字节序列持久化java对象,其中包含对象的数据,还有对象的类型,和保存在对象中的数据类型.所以,如果我们已经序列化了一个对象,那么它可以被读取并通过对象的类型和其他信息进行反序列化,并最终获取对象的原型. (2)ObjectInputStream 和 ObjectOutputStrea

java中“53”个关键字(含2个保留字)

1.java的关键字(keyword)有多少个? 51+2个保留字=53个关键字(java的关键字都是小写的!!) 2.java的保留字(reserve word)有多少个?问题:分别是什么? 2个保留字 Java语言的的保留字是指预留的关键字 1).const  有道释义:n. 常量,常数 用于修改字段或局部变量的声明.它指定字段或局部变量的值是常数,不能被修改 2).goto   有道释义:vi. 转到 指定跳转到标签,找到标签后,程序将处理从下一行开始的命令. 3.java的关键字分别是什

java语言基础001

1.java程序的基本结构大体上可以分为包.类.main()主方法.标识符.关键字.语句和注释等. 2.标识符和关键字区分大小写. 3.主方法是应用程序的入口点,java程序是从该方法开始执行的,main是主方法的名称,程序员不可以更改. 4.标识符 是一个名字,用来标识类名.变量名.方法名.数组名.文件名的有效字符序列. 5.标识符的命名规则: (1)java语言的标识符由字母.数字.下划线和美元符组成,第一个字符不能为数字. 非法:7word.5fox (2)java 语言使用Unicode

java注释 命名 数据类型 基本类型转换 位运算符 逻辑运算符 三目运算符

一.java注释 1.单行注释  //注释内容 2.多行注释 /*注释内容*/ 3.文档注释(可用javadoc工具生成api文档,不过我还没试过)/**文档注释*/,文档注释可以在使用的时候看见注释. 文档注释常用的标记 @auther作者 @version版本 @deprecated 不推荐使用 @param 本放的参数 @return 返回值 @throws异常,同@exception 二.java的命名 1.项目名 字母全部小写 2.包名 全部小写 3.类名 首字母大写加驼峰 4.方法名

初学Java对某些问题的理解

1下面的代码中每个词表示什么意思? publicy①   class②   Hello③ { public④  static⑤  void⑥  main⑦ (String[] args)⑧{ } } ①和④表示公开给其他类存取 ②是类的声明 ③是类的名称 ⑤表示静态 ⑥代表没有返回值 ⑦方法的名称一个程序有且只有一个主方法即main方法 ⑧必须要传String的数组给此方法当参数命名为args. 2Java的运行方式? 源代码→编译器→输出→在Java虚拟机上运行 3什么是标识符? 标识符就是用