自学Java之三(Java API documentation的结构)

2014年10月18日

我们学习一门语言,要从基础的结构开始。这样有利于快速掌握基础的编程,包括数据结构与算法、整数浮点数计算和字符串处理等等。

Java和C语言的思想类似之处是,利用库来扩展功能特性,而不是使用语言本身。这一点是和某些其他语言,包括BASIC和ABAP很不一样的地方。BASIC和ABAP内置了很多功能,比如BASIC有许多语句纯粹是为了在DOS里面画图形、Visual Basic里面有许多语句是为了访问数据库而设计的。ABAP里面有许多对于internal table的操作语句和访问数据库用的OpenSQL。而这些都不是通过库的形式来实现的。

Java、C、C++、C#则不通过语言内置的语句或命令来实现这些功能。它们通过库来实现这些功能。以C#为例,它的SQL数据库访问是封装在System.Data.SqlClient这个名字空间里面的。C# 3.0里面新增了Linq的语言语法特性,但它的实现则是在库里,因此不仅仅可以在SQL数据库上用Linq,在其他种类的数据库上,甚至用户自定义的容器类上都可以用Linq。

因此,许多不在语言里实现的东西,就需要通过库来实现。java.lang这个包正是包含了许多补充性的基础对象或数据结构。

那么在java.lang里面包含了哪些东西呢?我们细细来看。

里面有许多基础类型。还有一些异常和错误类。

整数类型:BigInteger(任意长度整型)、Long(64位整型)、Integer(32位整型)、Short(16位整型)、Byte(8位整型)。在C#中对应:System.Numerics.BigInteger(C# 4.0或更高)、Int64、Int32、Int16、SByte。注意,Java中的Byte是有符号8位整型。也就是说,Java中的所有这些整数类型都是有符号的。C#中则有相对应的无符号类型:UInt64、UInt32、UInt16、Byte。

还有一点需要注意:new Byte(-1)将会导致语法错误。原因是-1是一个int,它无法被隐式转换为byte。所以必须写成new Byte((byte)-1)。甚至两个byte值相加都会是一个int,比如:

byte b1 = 127;
byte b2 = 1;
return new Byte(b1 + b2);

这段代码的第三句同样会有语法错误。注意,以上例子故意让这个byte值溢出了。这里要说一下,Java对于整型溢出是不处理的。就算是int也是如此。比如下面的代码运行时不会抛出异常,而是让整型值回绕:

int i1 = 2147483647; // 2 ^ 31 - 1
int i2 = 1;
return i1 + i2; // -2147483648 = -(2 ^ 31)

而在C#里面,则有一个编译开关,默认是关闭的,但打开以后就会检查所有整数溢出情况:/checked。一旦发生整数溢出,System.OverflowException将会被抛出。这是相对Java来说C#独特的一个功能。

字符及字符串类型:Char(16位;因为Java采用UTF-16来表达字符串的缘故)、String。

浮点类型:Double和Float。

十进制类型:BigDecimal(任意长度十进制)。在C#中没有准确对应,但有Decimal结构体,可以精确表达29位长的十进制小数。也许用于处理财务数据比较方便。

Java中的Integer类,主要的用途是把整数这样的基本类型包装成一个对象。比如说,new Integer(1)这样,就把一个值为1的整数包装成了对象。反过来,对于一个Integer对象,调用它的intValue()方法就得到了它的整数值。这在C#里面则全部是隐式完成的。在C#里这叫做装箱与拆箱(boxing和unboxing)。当你需要把一个整数包装成一个Object时,直接对它做类型转换(或隐式类型转换)就行:object o = 1。反方向做一下显式类型转换就行,如(int)o。

Integer类也有toString()方法,用来把整数转换成它对应的字符串表示。在C#中对应的方法叫ToString()。反过来从字符串转换到整数的方法叫decode()。C#中叫Parse()。

Integer类有标准的compareTo()、equals()和hashCode()方法。C#中也有对应的叫CompareTo()、Equals()和GetHashCode()方法。C#中的GetHashCode命名更加规范一些,用动词Get开头。

留下您的评论