一 、变量与类型
变量:是指程序运行过程中可以改变的量,相当于在内存中开辟了一块内存空间来保存一些数据。
类型:对变量的种类进行了划分,不同类型的变量具有不同特性。
Java类型汇总:
(一) 整型
1. 字节类型变量
基本语法格式:
byte 变量名 = 初始值;
示例:
byte value = 0;
System.out.println(value);
//输出结果:0
注意:字节类型表示的也是整型,只占一个字节,表示的范围为(-2^7 ~ 2^7 - 1)
2. 短整型变量
基本语法格式:
short 变量名 = 初始值;
示例:
short value = 0;
System.out.println(value);
//输出结果:0
3. 整型变量
基本语法格式:
int 变量名 = 初始值;
示例:
int value = 10;
System.out.println(value);
//输出结果:10
4. 长整型变量
基本语法格式:
long 变量名 = 初始值;
示例:
short value = 10L; //L也可以是小写,即:10l
System.out.println(value);
//输出结果:10
(二) 浮点型
1. 单精度浮点型变量
基本语法格式:
float 变量名 = 初始值;
示例:
float value = 10.0F; //L也可以是小写,即:10.0F
System.out.println(value);
//输出结果:10.0
float 类型在 Java 中占四个字节, 遵守 IEEE 754 标准. 由于表示的数据精度范围较小, 一般在工程上用到浮点数都优先考虑 double, 不太推荐使用float。
2. 双精度浮点型变量
基本语法格式:
double 变量名 = 初始值;
示例:
double value = 10.0;
System.out.println(value);
//输出结果:10.0
(三) 字符型
char类型变量
基本语法格式:
char 变量名 = 初始值;
示例:
char value = 'A';
System.out.println(value);
//输出结果:A
注意事项:
1. Java 中使用 单引号 + 单个字母 的形式表示字符字面值.
2. 计算机中的字符本质上是一个整数. 在 C 语言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符. 因此一
个字符占用两个字节, 表示的字符种类更多, 包括中文.
使用一个字符表示一个汉字:
char ch = '呵';
System.out.println(ch);
执行javac的时候可能会出现以下错误:
此时我们在执行 javac 时加上 -encoding UTF-8 选项即可
(四) 布尔类型
boolean类型变量
基本语法格式:
boolean 变量名 = 初始值;
示例:
char value = true;
System.out.println(value);
//输出结果:true
注意事项:
1. boolean 类型的变量只有两种取值, true 表示真, false 表示假.
2. Java 的 boolean 类型和 int 不能相互转换, **不存在 **1 表示 true, 非0 表示 false 这样的用法.
3. boolean 类型有些 JVM 的实现是占 1 个字节, 有些是占 1 个比特位, 这个没有明确规定
(五) 字符串类型
String类型变量
1. 介绍
基本语法格式:
String 变量名 = 初始值;
示例:
String str = "zhangshang";
System.out.println(str);
注意事项:
1. Java 使用 双引号 + 若干字符 的方式表示字符串字面值.
2. 和上面的类型不同, String 不是基本类型, 而是引用类型.
3. 字符串中的一些特定的不太方便直接表示的字符需要进行转义
2. 字节串的 + 操作
此操作表示字符串的拼接
- 字符串之间的 拼接
String a = "hello";
String b = "world";
String c = a + b;
System.out.println(c);
- 字符串和整数的拼接:
String str = "result = ";
int a = 10;
int b = 20;
String result = str + a + b;
System.out.println(result);
// 执行结果:
result = 1020
- 使用 System.out.println 同时打印多个字符串或数字
int a = 10;
int b = 20;
System.out.println("a = " + a + ",b = " + b)
(六) 变量的作用域
即变量的生效范围,一般是变量所在的代码块(大括号)。
(七)常量
常量是指程序运行过程中不能够被改变的量。
1.字面常量
10 // int 字面值常量(十进制)
010 // int 字面值常量(八进制) 由数字 0 开头. 010 也就是十进制的 8
0x10 // int 字面值常量(十六进制) 由数字 0x 开头. 0x10 也就是十进制的 16
10L // long 字面值常量. 也可以写作 10l (小写的L)
1.0 // double 字面值常量. 也可以写作 1.0d 或者 1.0D
1.5e2 // double 字面值常量. 科学计数法表示. 相当于 1.5 * 10^2
1.0f // float 字面值常量, 也可以写作 1.0F
true // boolen 字面值常量, 同样的还有 false
'a' // char 字面值常量, 单引号中只能有一个字符
"abc" // String 字面值常量, 双引号中可以有多个字符
2. final 关键字修饰的常量
final int a = 10;
a = 20; // 编译出错. 提示 无法为最终变量a分配值 -》常量在运行过程中不能够被改变
(八) 类型转换
java作为一个强类型编程语言,当不同类型的变量之间相互赋值时,会有较严格的校验。
先看以下几个代码场景:
- int 和 long /double 相互赋值
int a = 10;
long b = 20;
a = b; // 编译出错, 提示可能会损失精度.
b = a; // 编译通过.
int a = 10;
double b = 1.0;
a = b; // 编译出错, 提示可能会损失精度.
b = a; // 编译通过
long表示的范围更大,可以将int的值赋给long类型的变量,但不能将long类型的值赋给int的变量。
double表示的范围更大,可以将int的值赋给ldouble类型的变量,但不能将ldouble类型的值赋给int的变量。
结论: 不同类型的变量之间相互赋值时,表示范围小的类型能隐性转换成范围较大的类型,反之则不行。
- int和boolean相互赋值
int a = 10;
boolean b = true;
b = a; //编译错误,提示不兼容的类型
a = b; //编译出错,提示不兼容的类型
结论 : int和boolean是毫不相干的两种类型,不能相互赋值
- int字面常量赋值给byte类型变量
byte a = 100; // 编译通过
byte b = 256; // 编译报错, 提示 从int转换到byte可能会有损失
注意: byte 表示的数据范围是 -128 -> +127, 256 已经超过范围, 而 100 还在范围之内.
结论: 使用字面值常量赋值的时候, Java 会自动进行一些检查校验, 判定赋值是否合理
使用强制类型转换
int a = 0;
double b = 10.5;
a = (int)b; //a = 10
int a = 10;
boolean b = false;
b = (boolean)a; //编译出错,提示不兼容的类型
结论: 使用 (类型) 的方式可以将 double 类型强制转成 int. 但是
1. 强制类型转换可能会导致精度丢失. 如刚才的例子中, 赋值之后, 10.5 就变成 10 了, 小数点后面的部分被忽略.
2. 强制类型转换不是一定能成功, 互不相干的类型之间无法强转
类型转换小结
- 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型.
- 如果需要把范围大的类型赋值给范围小的, 需要强制类型转换, 但是可能精度丢失.
- 将一个字面值常量赋值给一个变量时,java会自动对变量的存储范围进行检查。
二、运算符
(一) 算术运算符
- 基本四则运算符:+ - * /
- 复合赋值运算符:+= -= *= /=
- 自增、自减运算符: ++ - -
% 求模操作
不同于c语言的是,在java中,%不仅可以对int类型的值求模,也可以对double类型的值求模 ,也可以对负数求模
System.out.println(10%3); //1
System.out.println(-10%3); //-1
System.out.println(10%-3);//1
System.out.println(-10%-3);//1
System.out.println(11.5%2); //1.5
(二) 关系运算符
主要有六个:== != < > <= >=
System.out.println(a <= b);
System.out.println(a >= b);
注意:关系运算符的返回值都是boolean类型
(三) 逻辑运算符
主要有三个:&& || !
注意: 逻辑运算符的操作数(操作数往往是关系运算符的结果)和返回值都是 boolean 类型。
(四) 位运算符
主要有四个:& | ^ ~
(五) 移位运算符
主要有三个:<< >>(有符号右移) >>>(无符号右移)
左移 <<: 最左侧位不要了, 最右侧补 0
右移 >>: 最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)
无符号右移 >>>: 最右侧位不要了, 最左侧补 0
注意:
1. 左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方.
2. 右移 1 位, 相当于原数字 / 2. 右移 N 位, 相当于原数字 / 2 的N次方.
3. 由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代替.
4. 移动负数位或者移位位数过大都没有意义
(六) 条件运算符
只有一个:
三目运算符:表达式1 ? 表达式2 : 表达式3