3.char类型
char类型用于表示单个字符。通常用来表示字符常量。例如:’A‘是编码为65所对应的字符常量。与“A”不同,“A”是一个包含字符A的字符串。
char类型用Unicode编码,Unicode编码单元可以表示为十六进制,其范围从\u0000到\Uffff。除了可以采用\u表示Unicode代码单元的编码之外,还有一些用于表示特殊字符的转移序列符,如下表。
转义序列 | 名称 | Unicode值 |
---|---|---|
\b | 退格 | \u0008 |
\t | 制表 | \u0009 |
\n | 换行 | \u000a |
\r | 回车 | \u000d |
\" | 双引号 | \u0022 |
\' | 单引号 | \u0027 |
\\ | 反斜杠 | \u005c |
转义序列符\u可以出现在字符常量或字符串常量的引号之外(前提是符合语法规则),例如:
public static void main(String\u005B\u005D args) //\u005B和\u005D是[和]的编码
现在,16位的char类型已经不能满足所有Unicode字符的需要。Java语言解决这个问题的基本方法:
从JDK 5.0 开始。代码点(code point)是指与一个编码表中的某个字符对应的代码值。在Unicode标准中,代码点采用十六进制书写,并加上前缀U+,例如U+0041就是字母A的代码点。Unicode的代码点可以分成17个代码级别(code plane)。第一个代码级别称为基本的多语言级别(basic multilingual plane),代码点从U+0000到U+FFFF,其中包括了经典的Unicode代码;其余的16个附加级别,代码带点从U+10000到U+10FFFF,其中包括了一些辅助字符(supplementary character)。UTF-16编码用不同长度的编码表示所有Unicode代码点。在基本的多语言级别中,每个字符应16位表示,通常成为代码单元(code unit);而辅助字符采用一对连续的代码单元进行编码。在Java中char类型用UTF-16编码描述一个代码单元。
建议不要在程序中使用char类型,除非确实选哟对UTF-16代码单元进行操作。最好将需要处理的字符串用抽像数据类型表示。
4.boolean类型
boolean(布尔)类型有两个值:false和true,用来判定逻辑条件。整型值和布尔值之间不能进行相互转换。
变量
在Java中每一个变量属于一种类型(type)。在声明变量时,变量所属类型位于变量名前。例如:
double salary; int vacationDays; long earthPopulation; boolean done;
可以看到每个声明以分号结束。
-
变量名必须是以字母开头的由字母或数字构成的序列。
-
与大多程序设计语言相比,Java中“字母”和“数字”的范围要大。字母包括'A'~ 'Z'、'a' ~ 'z'、'_'、'$'或在某种语言中代替字母的任何Unicode字符。同样,数字包括'0'~'9'和在某种语言中代表数字的任何Unicode字符。如果想要知道哪些Unicode字符属于Java中的"字母",可以使用Character类的isJavaIdentifierStart和isJavaIdentifierPart方法检测。
-
符号不能出现在变量名中,空格也不行。
-
变量名中所有字符都是有意义的,并且大小写敏感。
-
变量名的长度无限制。
-
尽管$是一个合法的Java字符,但不要在自己的代码使用这个字符。它只用在Java编译器或其他工具生成的名字中。
-
不能将变量命名为Java保留字。如下图:
-
可以在一行生成多个边量,但不提倡。
int i,j;//both are integers
变量初始化
声明一个变量后,必须用赋值语句对变量进行显式初始化,千万不要使用未被初始化的变量。例如
int vacationDays; System.out.println(vacationDays);//报错: 可能尚未初始化变量vacationDays
要想对已经声明的变量进行赋值,就需要将变量名放在等号(=)左侧,相应取值的Java表达式放在等号的右侧。
int vacationDays; vacationDays = 12;
也可以将变量声明和初始化放在同一行。
int vacationDays = 12;
最后,在Java中可以将声明放在代码的任何地方。但建议变量的声明尽可能地靠近变量第一次使用的地方。
double salary = 65000.0; System.out.println(salary); int vacationDays = 12;//OK to declare a variable here
常量
在Java中,利用关键字final指示常量。例如:
public class Constants { public static void main(String[] args) { final double CM_PER_INCN = 2.54; double paperWidth = 8.5; double paperHeight = 11; System.out.println("Paper size in centimeters:" + paperWidth * CM_PER_INCN + " by " + paperHeight * CM_PER_INCN); } }
关键字final表示这个变量只能被赋值一次。一旦被赋值之后,就不能再更改了。习惯上。常量名使用全大写。
在Java中,经常希望某个常量可以在一个类中的多个方法中使用,通常将这些常量称为类常量。可以使用关键字static final设置一个类常量。下面是使用类常量的示例:
public class Constants2 { public static final double CM_PER_INCN = 2.54; public static void main(String[] args) { double paperWidth = 8.5; double paperHeight = 11; System.out.println("Paper size in centimeters:" + paperWidth * CM_PER_INCN + " by " + paperHeight * CM_PER_INCN); } }
需要注意,类常量的定义位于main方法的外部。因此在同一个类的其他方法也可以使用这个常量。而且,如果一个常量被声明为public,那么其他类的方法也可以使用这个常量。Constant2.CM_PRE_INCH就是这样的常量。
运算符
在Java中,使用算数运算符+、-、*、/表示加、减、乘、除运算。当参与/运算的两个操作数都是整数时,表示整数除法;否则,表示浮点除法。整数的求余操作(有时称为取模)用%表示。例如,15/2等于7,15%2等于1,15.0/2等于7.5 。
注:
-
整数除法:整数除法就是将实际运算的结果舍去小数位,只取整数位。例如3/4,数学上得到结果应为0.75,但若采用整数除法则舍去小数部分得到结果为0。
-
整数被0除将会产生一个异常(java.lang.ArithmeticException),而浮点数被0除将会得到无穷大(Infinity)或NaN结果。
-
可以在赋值操作采用一种简化的格式书写二元运算符。
//例如 x += 4; //等价于 x + x + 4;
通常,将运算符放在赋值号的左侧,如*=或%=。
关于浮点运算的一些扩展:
计算机在进行浮点运算的时候,会因为浮点寄存器大小的而得出不同的结果。这些寄存器增加了中间过程的精度。Java语言为了实现可移植型(无论在哪个虚拟机上运行,都得到相同的结果),在最初的时候规定所有的中间计算都必须进行截断。但是截断计算不仅可能导致溢出,而且截断操作需要消耗时间。在后面的改进在默认情况虚拟机设计者允许中间操作采用扩展的精度,并且引入了关键词strictfp。使用关键词strictfp标记的类或方法内的所有指令的将使用严格的浮点运算。
public static strictfp void main(String[] args)//在方法上使用strictfp关键词 public strictfp class Constants2//在类上使用strictfp关键词
实际的计算方式将取决于处理器。在默认情况下,中间结果允许使用扩展的指数,但不允许使用扩展的尾数。因此这两种方式的区别仅仅在于采用默认的方式不会产生移除,而采用严格的计算有可能产生溢出。
自增运算符与自减运算符
n++将变量n当前值加1;n--将n的值减一。例如:
int n = 12; n++;
n的值变为了13。因为这些运算符改变了变量的值,所以它的操作数不能是数值。例如:
4++;//非法
除了上面的n++和n--,还有另一种方式++n和--n;对于这两种方式的的区别则是:n++和n--是先使用变量原先的值再对变量n进行自增或自减操作;++n和--n则是先对变量n进行自增或自减操作,再使用变量现在的值。例如:
int m = 7; int n = 7; int a = 2 * ++m;//now a is 16,m is 8 int b = 2 * n++;//now b is 14,n is 8
注意:建议不要在其他表达式内部使用++,这样编写的代码很容易令人困惑,并会产生烦人的bug。
关系运算符 与boolean运算符
使用两个等号==检测是否相等,例如 3 == 7 的值为 false。
使用!=检测是否不相等,例如3!=7的值为true。
另外,还有<(小于)、>(大于) 、<=(小于等于)和>=(大于等于)。
用&&表示逻辑“与”、用||表示逻辑“或”还有!表示逻辑“非”。“”&&和||是按照“短路”方式求值。如果第一个操作数已经能够确定表达式的值,第二个操作数就不必计算量。例如:
expression1 && expression2,若第一个表达式值为false,结果不可能为真。因此,第二个表达式的值就没必要进算了。
最后,Java支持三元运算符?:。表达式:condition ? expression1 : expression2
当condition为真时计算第1个表达式,否则计算第2个表达式。例 返回x和y中较小的那个值: x < y ? x : y
位运算符
在处理整型数值时,可以直接对组成整型数值的各个位进行操作。
位运算符包括:
&(“与”)、|(“或”)、^(“异或”)、~ (“非”)
在这些运算符在位模式下工作。例如,如果n是一个整型变量,并且用二进制表示的n从右数第四位为1,那么
int fourthBigFromRight = (n & 0b1000) / 0b1000;返回1;否则返回0。通过运用2的幂次方的&运算可以将其他位屏蔽掉,只保留其中的某一位。
另外">>"和"<<"运算符将二进制位进行右移或左移操作。当需要建立位模式屏蔽某些位时,使用这两个操作符十分方便。:int fourthBigFromRight = (n & (1 << 3)) >> 3;
最后,>>>运算符将用0填充高位;>>运算符用符号位填充高位。没有<<<运算符
注意:
-
&和|运算符应用于布尔值,得到的结果也是布尔值。这两个运算与&&和||的算算类似,只是不按”短路“方式计算。也就是说,在得到计算结果前会计算两个操作数的值。
-
对位移运算右侧的参数需要进行模32的运算(除非左边操作数是long类型,这种情况下需对右侧操作数模64)。例如,1<< 35 与 1<< 3 或 8 是相同的。
数学函数与常量
在Math类中,包含了各种各样的数学函数。
要想计算一个数值的平方根,可以使用sqrt方法:
double x =4; double y =Math.sqrt(x); System.out.println(y);//prints 2.0
println方法和sqrt方法存在细微差异。println方法操作一个定义在System类中的System.out对象。但是,Math类中的sqrt方法处理的不是对象,这样的方法被称为静态方法。
在Java中幂运算需要借助Math类的pow方法。语句:
double y = Math.pow(x,a);
将y的值设置为x的a次幂。pow方法有两个double类型的参数,其返回结果也为double类型。
-
Math提供的一些常用发三角函数:
Math.sin Math.cos Math.tan Math.atan Math.atan2//返回从原点 (0,0) 到 (x,y) 点的线段与 x 轴正方向之间的平面角度 (弧度值),也就是Math.atan2(y,x)
-
指数函数以及它的反函数-自然对数以及以10为底的对数:
Math.exp Math.log Math.log10
-
表示 \pi 和自然对数的底数e:
Math.PI Math.E