与Java数据类型、变量、常量、运算符有关的探讨:
1、Java数据类型
在Java中,一共有8种基本类型(primitive type),其中有4种整形、2种浮点类型、字符类型char和boolean类型。
4种整型分别为int、short、long、byte。
通常情况下,int类型最常用。在int类型不够的情况下用long类型。short和byte类型主要用于特定的应用场合,例如底层
文件处理或者需要控制占用存储空间量的大数组。
长整型数值有一个后缀L(例如 5000000000000L)。十六进制数值有一个前缀0X或者0x(例如0xCCAB)。二进制数值
有一个前缀0b或0B(例如0b1001)。
2种浮点类型float、double。
double类型所能表示的数值精度是float类型的两倍,这也就是为什么有人称double类型为双精度浮点类型的原因。绝大
多数情况下都采用double类型,因为float类型很难满足需求。
float类型的数值有一个后缀F或f(例如,3.14F)。没有后缀或者后缀为D或d的浮点数默认为double类型。
警告:浮点数值不适用于无法接受舍入误差的金融计算中。
例如,命令System.out.println(2.0 - 1.1) 将打印出0.8999999999999999,而不是人们想像出来的0.9。
这种舍入误差的主要原因是浮点数值采用二进制系统表示,而二进制系统无法精确的表示1/10。这就好像十进制无法
精确的表示1/3一样。如果在数值计算中不允许任何舍入误差,应该使用BigDecimal类。
char类型。
强烈建议不要在程序中使用char类型,除非确实需要处理UTF-16代码单元。最好将字符串作为抽象数据类型处理。
boolean类型。
boolean(布尔)类型有两个值:false和true,用来判定逻辑条件。注意,整型值和布尔型值之间不能进行相互转换。
注释:在C++中,数值可以代替boolean值。值0相当于布尔值false,非0值相当于布尔值true。在Java中则不可以这样。
2、Java的变量
与Java变量有关的讨论并不多,主要在以下两点:
第1点,虽然可以在一行中声明多个变量,例如:
int i,j;
但是,不提倡这种风格。逐一声明每个变量可以提高程序的可读性。
第2点,尽量把变量的声明尽可能靠近该变量第一次使用的地方,这依旧是个编程风格问题。
3、Java的常量
在Java中,用关键字final指示常量。例如:
final double PI = 3.14;
关键字final表示这个变量只能被赋值一次。一旦被赋值之后,就不能再更改了。习惯上,常量名使用全大写。
在Java中,经常希望某个常量可以在一个类的多个方法中使用,通常将这种常量称为类常量。例如:
public class HelloWorld {
public static final double PI = 3.14;
public static void main(String[] args) {
System.out.println("PI = " + PI);
}
}
需要注意,类常量的定义位于main方法的外部。因此,在同一个类的其他方法中也可以使用这个常量。
而且,如果一个变量被声明为public,那么其他类的方法也可以使用这个常量。
4、Java运算符
我们不讨论过于细微末节的东西,例如:+、-、*、/、% ······。哦,对了,有一点还比较重要:两个全都是整数类型的数
相除,结果一定是整数。咦?还有一点:整数被0除将产生异常;浮点数被0除将会得到无穷大或NaN结果。
在Java中,没有幂运算,因此需要借助于Math类的pow方法。语句:
double y = Math.pow(x,a);
将y的值设置为x的a次幂。pow方法有两个double类型的参数,其返回结果也为double类型。
要计算数值的平方根,可以使用sqrt方法。
Java还提供了两个用于表示π和e常量的近似值:
Math.PI;
Math.E;
当然,如果每次都要写Math就太麻烦了。我们可以这样做:在源文件的顶部加上下面这行代码就可以:
import static java.lang.Math.*;
Java类型转换算是比较重要的东西,那么接下来一起讨论它。
so,类型转换是什么鬼?
当两个数值进行二元操作时,要先将两个操作数转换为同一种类型,然后再进行计算。
记住顺序就好了,虽然不精准,但够用。
double > float > long > int
类型转换OK掉了,再来探讨强制类型转换:
强制类型转换的语法格式:
double x = 9.889;
int y = (int)x;
这样,变量y的值即为9。
如果想对浮点数进行舍入运算,以便得到最接近的整数(很多情况下,这种操作更有用),需要使用Math.round方法:
double x = 9.889;
int y = (int)Math.round(x);
现在,变量y的值为10。那么问题来了,为什么调用round的时候,还要使用强制类型转换(int)?
round方法的返回类型为long类型,由于存在信息丢失的可能性,所以转换成int类型。
思考:
int x = 5;
x += 3.5;
请问:“x的值是多少?” (答案为8)
关系和boolean运算符。
&&表示逻辑与,||表示逻辑或,!表示逻辑非,还有三元操作符 condition ? expression1 : expression2 。
枚举类型初涉。
使用枚举类型的情况: 变量的取值只在一个有限的集合内。例如:
销售的服装或者披萨只有小、中、大和超大这四种尺寸。可以将这些尺寸分别编码为1、2、3、4或S、M、L、X。
但这样存在一定的隐患。在变量中可能保存的是一个错误的值(如0或m)。
准对这种情况,可以自定义枚举类型。枚举类型包括有限个命名的值。例如:
enum Size { SMALL,MEDIUM,LARGE,EXTRA_LARGE };
现在,可以声明这种类型的变量:
Size s = Size.MEDIUM;
注意:Size类型的变量只能存储这个类型声明中给定的枚举值,或者null值,null值表示这个变量没有设置任何值。