前言
数据类型与运算符虽然简单,并且在很多地方都和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