每个Java程序都要包含一个main方法,其形式如下:
public class ClassName {
public static void main(String[] args) {
program statements
}
}
Java的类和C++很类似,但还是有所不同。Java中所有函数都是属于某个类的方法,因此,main方法必须有一个外壳类。
main方法的String[] args
参数表明main方法接收一个字符串数组,也即命令行参数。例如运行程序时:
java Message -g cruel world
则args数组将包含:
args[0]:"-g"
args[1]:"cruel"
args[2]:"world"
注意到和C++不同,此处的程序名没有存储在args数组中。
数据类型
在Java中,一共有8种基本类型,包括4种整型、2种浮点类型、1种用于表示Unicode字符单元的字符类型char和1种boolean类型。
整型
类型 | 字节数 | 取值范围 |
---|---|---|
int | 4字节 | -2147483648~2147483647(20亿) |
short | 2字节 | -32768~32767 |
long | 8字节 | -9 223 372 036 854 775 808~9 223 372 036 854 775 807 |
byte | 1字节 | -128~127 |
在Java中,整型的范围与运行Java代码的机器无关,这就解决了跨平台时整数溢出等问题。
Java没有无符号类型(unsigned)。
浮点类型
类型 | 字节数 |
---|---|
float | 4字节 |
double | 8字节 |
还有3个表示 溢出和出错情况的特殊浮点数值:
- 正无穷大 Double.POSITIVE_INFINITY
- 负无穷大 Double.NEGATIVE_INFINITY
- NaN(不是一个数字) Double.NaN
然而,浮点数不适用于禁止出现舍入误差的金融计算。
char类型
Unicode编码单元可以表示为十六进制值,其范围从\u0000到\uffff。
设计Unicode的目的,是要统一原先不同的编码方案。
代码点是指与编码表中某个字符相对应的代码值。例如,U+0041就是字母A的代码点。Unicode的代码点可以分成17个代码级别。
char类型用UTF-16编码描述一个代码单元。
boolean类型
和C++不同,整型值和布尔值不能相互替换。Java中的布尔值只有false和true两个值。
大数值
如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中的BigInteger和BigDecimal类。
BigInteger类实现了任意精度的整数运算,而BigDecimal类实现了任意精度的浮点数运算。
使用valueOf方法可以将普通的数转换成大数值:
BigInteger a = BigInteger.valueOf(100);
但遗憾的是,和C++不同,Java没有提供运算符重载功能,因此不能使用普通的算术运算符(+、-、*、\),而要使用大数值类中的add和multiply方法。
BigInteger c = a.add(b); //c=a+b
BigInteger d = c.multiply(b.add(BigInteger.valueOf(2))); //d=c*(b+2)
BigInteger类的其他常用函数有:
BigInteger subtract(BigInteger other); //减
BigInteger divide(BigInteger other); //除
BigInteger mod(BigInteger other); //取余
int compareTo(BigInteger other); //如果相等,返回0;如果小于other,返回负数;如果大于other,返回正数
变量
常量
和C++中使用const定义常量不同,Java中使用关键字final定义常量,它表示这个变量只能被赋值一次。习惯上,常量名一般使用全大写。
运算符
位运算符
“>>”和“<<”运算符将二进制位进行右移或左移操作。
注意,“>>”是用符号位填充高位,而“>>>”是用0填充高位。
数学函数与常量
在Math类中,包含了各种数学函数,例如使用sqrt方法求取平方根:
double x=4;
double y=Math.sqrt(x);
其他常用的方法还有:
Math.pow(x,a)
Math.sin
Math.cos
Math.tan
Math.atan
Math.atan2
Math.exp
Math.log
Math.log10
另外,Java还提供了两个用于表示π和e常量的近似值:
Math.PI
Math.E
其实不必在调用方法时添加前缀“Math.”,只要在源文件的顶部加上:
import static java.lang.Math.*;
这叫做静态导入。
强制类型转换
double x=9.997;
int nx=(int) x;
强制类型转换通过截断小数部分将浮点值转换为整型。
如果想进行四舍五入,那就需要使用Math.round
方法:
double x=9.997;
int nx=(int)Math.round(x);
调用round时仍然需要使用强制类型转换,这是因为round方法返回的结果为long类型。
控制流程
块
和C++不同,Java中不能在嵌套的两个块中声明同名的变量,例如下面的代码就是错误的:
public static void main(String[] args)
{
int n;
{
int n;
}
}
终止语句
和C++不同,Java中增加了一条**带标签的**break,用于跳出多重嵌套的循环语句。标签必须放在希望跳出的最外层循环之前,并且紧跟一个冒号。
int n=0;
...
read_data:
while(...)
{
...
for(...)
{
...
if(n<0) break read_data;
}
}
//检查是break跳出还是正常结束循环
if(n<0)
{
...
}
else
{
...
}