在Java中,每个变量都有一个类型(type)。在声明变量时,变量的类型位于变量名之前。Java中不能使用Java保留字作为变量名。
可以在一行中声明多个变量:
int i,j;
不过不提倡使用这种风格,逐一声明每个变量名可以提高程序的可读性。
1.1 变量的初始化
声明一个变量后必须用赋值语句对变量进行显式初始化,千万不要使用未初始化的变量。也可以将变量的声明和初始化放在同一行。例如:
int vacationDays = 12;
在Java中,变量的声明尽可能地靠近变量第一次使用的地方,这是一种良好的程序编写风格。
C++注释:C和C++区分变量的声明和定义。例如:
int i = 10;
是一个定义,而
externa int i;
是一个声明。在Java中,不区分变量的声明与定义。
在Java中,利用关键字final指示常量。
关键字final表示这个变量只能被赋值一次。一旦被赋值之后,就不能够再更改了。习惯上,常量名使用全大写。
在Java中,经常希望某个常量可以在一个类中的多个方法中使用,称为类常量。可以使用关键字static final设置一个类常量。
public class Constants2{
public static final double CM_PRE_INCH = 2.54;
public static void main(tring[] args){
double paperWIdth = 8.5;
double paperHeight = 11;
System.out.println("Paper size in centimeters:" + paperWidth * CM_PRE_INCH + "by" + paperHeight * CM_PRE_INCH);
}
}
需要注意,类常量的定义位于main方法的外部。因此,在同一个类的其他方法中也可以使用这个常量。而且,如果一个常量被声明为public,那么其他类的方法也可以使用这个常量。这里我理解为类似C中的全局变量。
C++注释:const是Java保留的关键字,但目前并没有使用。在Java中,必须使用final定义常量。
在Java中,使用算数运算符+、-、*、/表示加减乘除运算。当参与/运算的两个操作数都是整数时,表示整数除法;否则为浮点除法。整数的求余(也叫取模)用%表示。
需要注意,整数被0除将会产生一个异常,而浮点数被0除将会得到无穷大或NaN结果。
为了保证Java的可移植性,对浮点数的处理上Java采取在默认情况下,虚拟机设计者允许对中间计算结果采用扩展的精度。但对于使用strictfp关键字标记的方法必须使用严格的浮点计算来生成可再生的结果。例如,main方法可标记为
public static strictfp void main(String[] args)
如果一个类被标记为strictfp,这个类中的所用方法都要使用严格的浮点计算。
println方法和sqrt方法存在微小差异。println方法处理System.out对象。但在Math类中,sqrt方法处理的不是对象,这样的方法称为静态方法。在Java中没有幂运算,因此需要借助Math类的pow方法。
Math类提供了一些常用的三角函数:
Math.sin
Math.cos
Math.tan
Maht.atan
Math.atan2
还有指数函数以及它的反函数——自然对数以及以10为底的对数:
Math.exp
Math.log
Math.log10
最后,Java还提供里两个用于表示π和e常量的近似值。
Math.PI
Math.E
提示:不必在数学方法名和常量名前添加前缀“Math”,只要在源文件的顶部加上下面这行代码就可以了。
import static java.lang.Math.*;
图中有6个实心箭头,表示无信息丢失的转换;有3个虚箭头,表示可能有精度缺失的转换。
例如:
int n = 123456789;
float f = n;//此时f=1.234567892E8
当使用上面两个数值进行二元操作时,要先将两个操作数转换为同一种类型,然后再进行计算。
在必要的时候需要将double转换成int,需要通过强制类型转换(cast)实现这个操作。强制类型转换的语法格式是在圆括号中给出想要转换的目标类型。后面紧跟待转换的变量名。例如:
double x = 9.997;
int nx = (int) x;
这样,变量nx的值为9。强制类型转换通过截断小数部分将浮点值转换为整型。
如果想对浮点数进行舍入运算,以便得到最接近的整数,那就需要使用Math.round方法:
double x = 9.997;
int nx = (int) Math.round(x);
现在,变量nx的值为10,。当调用round的时候,仍然需要使用强制转换类型(int)。其原因是round方法返回的结果为long类型,由于存在信息丢失的可能性,所以只有使用显式的强制类型转换才能将long类型转换成int类型。
自动类型转换指的是容量小的数据类型可以自动转换为容量大的数据类型。可以将整型常量直接赋值给byte、 short、 char等类型变量,而不需要进行强制类型转换,只要不超出其表数范围即可。
当将一种类型强制转换成另一种类型,而又超出了目标类型的表数范围,就会被截断成为一个完全不同的值。 操作比较大的数时,要留意是否溢出,尤其是整数操作时。 不要命名名字为l的变量,l容易和1混淆。long类型使用大写L不要用小写。
二元运算符的运算规则:
整数运算:
1. 如果两个操作数有一个为Long, 则结果也为long。
2. 没有long时,结果为int。即使操作数全为short,byte,结果也是int。
浮点运算:
3. 如果两个操作数有一个为double,则结果为double。
4. 只有两个操作数都是float,则结果才为float。
取模运算:
Java包含丰富的关系运算符。要检测相等性,可以使用两个等号== 。例如:3==7的值为false。
Java沿用C++的做法来表示一些运算符。
逻辑运算符 | 表示 | 解释 |
---|---|---|
逻辑与 | && | &&与||是按照短路的方式来求值。 |
逻辑或 | || | 即如果第一个操作数能确定表示式的值,第二个操作数就不必计算了。 |
逻辑非 | ! |
位运算符 | 表示 | 解释 |
---|---|---|
“and” | & | 如果相对应位都是1,则结果为1,否则为0 |
“or” | | | 如果相对应位都是0,则结果为0,否则为1 |
“xor” | ^ | 如果相对应位值相同,则结果为0,否则为1 |
“not” | ~ | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 |
&&的优先级比||的优先级高所以a&&b||c等价于(a&&b)||c
+=是右结合运算符所以a+=b+=c等价于a+=(b+=c)
枚举类型包括有限个命名的值。例如
enum Size {small,middle large,extra_large};
现在可以声明这种类型的变量:
Size s = Size.middle;
Size类型的变量只存储这个类型声明中给定的某个枚举值,或者null值,null表示这个变量没有设置任何值。
每个用双引号括起来的字符串都是String类的一个实例:
String e = "";
String greeting = "hello";
1.子串
String类的substring方法可以从一个较大的字符串中提取出一个子串。
String greeting = "hello";
String s = greeting.substring(0,3);
创建了一个由字符“Hel”组成的字符串。
subtring方法的第二个参数是不想复制的第一个位置。这里要复制位置为0、1、2的字符。在substring中从0开始计数,直到3为止,但不包含3.
subtring的工作方式有一个优点:容易计算子串的长度。字符串substring(a,b)的长度为b-a。
2.拼接
Java语言允许使用+号连接两个字符串。当将一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串(任何一个Java对象都可以转换成字符串)如果需要把多个字符串放在一起,用一个定界符分隔,可以使用静态join方法:
String all = String.join("/","S","M","L","XL");
//all is the string "S/M/L/XL"
3.不可变字符串
String类没有提供用于修改字符串的方法。如果希望将greeting的内容修改为"help!",不能直接地将greeting的最后两个位置修改为‘p’和‘ ! ’。在Java中如果要修改首先需要提取需要的字符,然后再拼接上替换的字符串:
greenting = greenting.substring(0,3) + "p!";
由于不能修改Java字符串中的字符,所以在Java文档中将String类对象称为不可变字符串,当然,可以修改字符串变量greenting,让它引用另一个字符串,这就如同可以将存放3的数值变量改为存放4一样。通过拼接“hel”和“p!”来创建一个新字符串的效率确实不高。但是,不可变字符串却有一个优点:编译器可以让字符串共享。