前言
数据类型与运算符虽然简单,并且在很多地方都和C语言相同。但是我们也要注意这些细节,以及他们的不同之处,防止写代码的时候总会踩入一些不必要的坑!
变量的命名规则
硬性指标:
- 一个变量只能包含数字、字母、下划线
- 不能以数字开头
- 变量名大小写敏感,例如:num和Num是两个不同的变量
注意:虽然语法上也允许使用中文\美元符($)命名变量,但是强烈建议不要这样做!
软性指标:
- 变量命名要具有描述性,见名知意。
- 变量名不建议使用拼音(但是不绝对)。
- 变量名的词性推荐使用名词。
- 变量命名推荐小驼峰命名,当一个变量名是由多个单词构成的时候,除了第一个单词之外,其他单词首字母都大写!
例如:int minValue = 1;
String studentName = “某某”;
数据类型
整型
学习C语言时,我们知道int变量在32位计算机下占4个字节,在64位占8个字节,但是在JAVA中,一个int变量只占4个字节,和操作系统没有直接关系!!!同理可得,其他类型也是如此!这也间接地体现了JAVA的安全性。
类型 | 空间大小 | 数据范围 | 语法格式举例 |
---|---|---|---|
byte | 1 | -2^7 ~ +2^7-1 | byte value = 0; |
short | 2 | -2^15 ~ +2^15-1 | short value = 0; |
int | 4 | -2^31 ~ 2^31-1 | int num = 10; |
long | 8 | -2^63 ~ 2^63-1 | long num = 10L; |
我们还可以通过JAVA中包装类的成员变量来查看数据取值范围。
例如:System.out.println(Integer.MAX_VALUE); // int 的最大值
System.out.println(Integer.MIN_VALUE); // int 的最小值
注意事项:
- long型变量在初始化时,数据后面要加L,当然大小写都可以,但是为了区别数字1,用大写会更好一点。
- byte字节类型表示的也是整数,和字符类型互不相干!
- short一般不推荐使用。
浮点型
JAVA中的浮点数的内存布局和整数差别很大,不能单纯的用 2 ^ n 的形式表示数据范围。内存布局遵守 IEEE 754 标准(和C语言一样),尝试使用有限的内存空间表示可能无限的小数,势必会存在一定的精度误差。float同样遵守 IEEE 754 标准, 由于表示的数据精度范围较小,一般在工程上用到浮点数都 优先考虑 double,不太推荐使用 float。并且若小数形式后面不写f或F来标识,那计算机会自动认为该数字为double型!
类型 | 空间大小 | 语法格式举例 |
---|---|---|
float | 4 | float num = 1.0f; |
double | 8 | double num = 1.0; |
字符型
计算机中的字符本质上是一个整数。 在 C 语言中使用 ASCII 表示字符,而 Java 中使用Unicode 表示字符。因此一 个字符占用两个字节,表示的字符种类更多,包括中文。
语法格式举例:char ch = ‘啊’;
代码中如果使用一个字符表示一个汉字
则执行javac时需要加上 -encoding UTF-8 例如:javac -encoding UTF-8 Test.java
布尔类型
在C语言中0为假,非0为真,而在java中却不是这样的。java中用boolean类型的变量来表示,且只有两种取值true表示真,false表示假。对于boolean类型的空间大小,有些JVM中占1个字节,有些是占1个比特位,没有明确规定空间大小。
boolean value = true;
System.out.println(value + 1);
// 代码编译会出现如下错误
Test.java:4: 错误: 二元运算符 '+' 的操作数类型错误
System.out.println(value + 1);
^
第一个类型: boolean
第二个类型: int 1 个错误
字符串类型
String不是基本类型,而是引用类型。字符串中的数据存储在常量池中,且一些特定的不太方便直接表示的字符需要进行转义。
语法格式示例:String name = “张三”;
字符串的+操作,表示字符串拼接:
String a = "hello";
String b = "world";
String c = a + b;
System.out.println(c);//输出结果helloworld
还可以用字符串和整数进行拼接:
String str = "result = ";
int a = 10;
int b = 20;
String result = str + a + b;
System.out.println(result); // 执行结果 result = 1020
常量
在C语言中有const 限定,使变量变成常量。而java使用final来限定的!当然这里也分为字面值常量(例如:10)和final关键字修饰的常量。那么变量和常量有什么区别呢?变量在运行期间可以改变的,并且是在运行的时候才能知道它的值;而常量在运行期间不能改变,并在编译期间就可以确定它的值!
final int a = 10;
a = 20;// 编译出错. 提示 无法为终变量a分配值
类型转换
Java 作为一个强类型编程语言, 当不同类型之间的变量相互赋值的时候, 会有较严格的校验。
- 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型, 反之则不行。
- 毫不相干的两种类型, 不能相互赋值。
- 使用字面值常量赋值的时候, Java 会自动进行一些检查校验, 判定赋值是否合理。
int a = 10;
long b = 20;
a = b; // 编译出错, 提示可能会损失精度.
b = a; // 编译通过.
强制类型转换:
- 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型。
- 如果需要把范围大的类型赋值给范围小的, 需要强制类型转换, 但是可能精度丢失.。
- 将一个字面值常量进行赋值的时候, Java 会自动针对数字范围进行检查。
int a = 0;
double b = 10.5;
a = (int)b;
int a = 10;
boolean b = false;
b = (boolean)a; // 编译出错, 提示不兼容的类型.
不同类型的数据混合运算, 范围小的会提升成范围大的。由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据. 为了硬件上实现方便, 诸如 byte 和 short 这种低于 4 个字节的类型, 会先提升成 int, 再参与计算。
运算符
java中的大部分运算符和C语言中还是一样的,那接下来我们就说一下一些特殊情况以及新增运算符!
-
% 表示取余, 不仅仅可以对 int 求模, 也能对 double 来求模
System.out.println(11.5 % 2.0); // 运行结果 1.5
-
在C语言中我们可能会有这样的表达式:!0;但是在java中这是不可行的,"!"运算符只能作用于布尔表达式上。
-
i++的特殊情况你知道吗?
int i = 10; i = i++; System.out.println(i);//结果为10
-
新增无符号右移运算符">>>"。
int a = 0xffffffff; System.out.printf("%x\n", a >>> 1); // 运行结果(注意, 是按十六进制打印的) 7fffffff