一、变量和类型
变量指的是程序运行时可变的量,相当于开辟一块空间来保存一些数据。
类型则是对变量的种类进行划分,不同的类型的变量具有不同的特征。
1.1整形变量
基本语法格式
int 变量名 = 初始值;
代码示例
int num = 10; //定义一个整形变量
System.out.println(num);
注意事项:
- int表示变量的类型是一个整形
- 变量名是变量的标识,后续都是通过这个名字来使用变量
- java中 = 表示赋值(和数学不一样),意思是给变量设置一个初始值
- 初始化操作是可选的,但是建议创建变量的时候都显示初始化
- 最后不要忘记分号,否则会编译失败
- // 表示注释,注释作为代码的解释说明部分,不参与变异运行
使用代码查看java中的整形数据范围:
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
//运行结果
-2147483848
2147483847
1.2、长整形变量
基本语法格式:
long 变量名 = 初始值;
代码示例:
long num = 10L; //定义一个长整形变量
System.out.println(num);
注意事项:
- 基本语法格式和创建int变量一致,只是把类型修改成long
- 初始化设定的值为10L,表示一个长整形的数字,10l也可以
- 使用10初始化也可以,10的类型是int,10L的类型是long,使用10L比10l更好看一点
使用代码查看java中长整形数据的范围:
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
// 运行结果
9223372036854775807
-9223372036854775808
1.3双精度浮点型变量
基本语法格式
double 变量名 = 初始化;
代码示例:
double num = 1.0;
System.out,println(num);
例1:
int a = 1;
int b = 2;
System.out.println(a/b);
//运行结果
0
在java中,int除以int的值扔然是int(会直接舍弃小数部分),如果要得到0.5,需要使用double类型
double a = 1.0;
double b = 2.0;
System.out.println(a / b);
// 执行结果
0.5
例2:
double num = 1.1;
System.out.println(num * num)
// 执行结果
1.2100000000000002
注:Java 中的 double 虽然也是 8 个字节, 但是浮点数的内存布局和整数差别很大, 不能单纯的用 2 ^ n 的形式表示数据范围
1.4 单精度浮点型变量
基本语法格式
float 变量名 = 初始值;
代码示例
float num = 1.0f; // 写作 1.0F 也可以
System.out.println(num);
float 类型在 Java 中占四个字节, 同样遵守 IEEE 754 标准. 由于表示的数据精度范围较小, 一般在工程上用到浮点数都
优先考虑 double, 不太推荐使用 float.
1.5 字符类型变量
基本语法格式:
char 变量名 = 初始值;
代码示例:
char ch = 'A';
注意事项:
- java中使用单引号 + 单个字母 的形式表示字符字面值
- 计算机中的字符本质上是一个整数,在C语言中使用ASCII表示字符,而java中使用Unicode表示个字符占用两个字节,表示的字符种类更多,包括中文
例1:使用字符表示一个汉字:
char ch = '呵';
System.out.println(ch);
执行 javac 的时候可能出现以下错误:
Test.java:3: 错误: 未结束的字符文字
char ch = '鍛?';
^
此时我们在执行 javac 时加上 -encoding UTF-8 选项即可
javac -encoding UTF-8 Test.java
1.6 字节类型变量
基本语法结构:
byte 变量名 = 初始值;
代码示例:
byte value = 0;
System.out.println(value);
注意事项:
- 字节类型表示的也是整数,只占一个字节,表示范围较小(-128 ~ +127)
- 字节类型和字符类型互不相干
1.7 短整型变量
基本语法格式:
short 变量名 = 初始值;
代码实例:
short value =0;
System.out.println(value);
注意事项:
- short占用两个字节,表示的数据范围是 -32768 ~+32767
- 这个表示范围比较小,一般不推荐使用
1.8 布尔类型
基本语法格式:
boolean 变量名 = 初始值;
代码示例:
boolean value = true;
System.out.println(value);
注意事项:
- boolean类型的变量只有两种取值,ture表示是真,false表示是假
- java的boolean类型和int不能相互转化,不存在1表示ture,0表示false这样的说法
3.boolean类型有些JVM的实现是占1个字节,有些是占一个比特位,这个没有明确规定
boolean value = true;
System.out.println(value + 1);
//代码编译会出现如下错误
Test.java:4错误: 二元运算符 ‘+’的操作数类型的错误
System.out.println(value + 1);
^
第一个类型:boolean
第一个类型: int
1个错误
1.9 字符串类型变量
基本语法格式:
String 变量名 = “ 初始值”;
代码示例:
- java使用双引号 + 若干字符 的方式表示字符串字面值
- 和上面的类型不同,String不是基本类型,而是应用类型
- 字符串中的一些特定的不太方便直接表示的字符需要进行转义
转义字符示例:
\n -------------------- 换行
\t --------------------- 水平制表符
\’ ---------------------- 单引号
\“---------------------- 双引号
\ ---------------------- 反斜杠
字符串的 + 操作, 表示字符串拼接:
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)
//执行结果
a = 10,b = 20
1.10 变量的作用域
定义在大括号里的变量,其作用域只在这个大括号里
1.11 变量的命名规则
硬性指标:
- 一个变量名只能包含数字, 字母, 下划线
- 数字不能开头.
- 变量名是大小写敏感的. 即 num 和 Num 是两个不同的变量.
注意: 虽然语法上也允许使用中文/美元符($)命名变量, 但是 强烈 不推荐这样做
软性指标:
- 变量命名要具有描述性, 见名知意.
- 变量名不宜使用拼音(但是不绝对).
- 变量名的词性推荐使用名词.
- 变量命名推荐 小驼峰命名法, 当一个变量名由多个单词构成的时候, 除了第一个单词之外, 其他单词首字母都大写
1.12 常量
常量指的是运行时类型不能发生改变
- 字面值常量
- final 关键字修饰的常量
final int a = 10;
a = 20; // 编译出错. 提示 无法为最终变量a分配值
常量不能在程序运行过程中发生修改.
1.13 类型转换
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 赋值给 double, 但是不能将 double 赋值给 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;
int a = 10;
boolean b = false;
b = (boolean)a; // 编译出错, 提示不兼容的类型.
结论: 使用 (类型) 的方式可以将 double 类型强制转成 int. 但是
- 强制类型转换可能会导致精度丢失. 如刚才的例子中, 赋值之后, 10.5 就变成 10 了, 小数点后面的部分被忽略.
- 强制类型转换不是一定能成功, 互不相干的类型之间无法强转.
类型转换小结
- 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型.
- 如果需要把范围大的类型赋值给范围小的, 需要强制类型转换, 但是可能精度丢失.
- 将一个字面值常量进行赋值的时候, Java 会自动针对数字范围进行检查.
1.14 数值提升
int 和 long 混合运算
int a = 10;
long b = 20;
int c = a + b; // 编译出错, 提示将 long 转成 int 会丢失精度
long d = a + b; // 编译通过.
结论:当 int 和 long 混合运算的时候, int 会提升成 long, 得到的结果仍然是 long 类型, 需要使用 long 类型的变量来接收结果. 如果非要用 int 来接收结果, 就需要使用强制类型转换.
byte 和 byte 的运算
byte a = 10;
byte b = 20;
byte c = a + b;
System.out.println(c);
// 编译报错
Test.java:5: 错误: 不兼容的类型: 从int转换到byte可能会有损失
byte c = a + b;
^
结论: byte 和 byte 都是相同类型, 但是出现编译报错. 原因是, 虽然 a 和 b 都是 byte, 但是计算 a + b 会先将 a 和 b 都提升成 int, 再进行计算, 得到的结果也是 int, 这是赋给 c, 就会出现上述错误
**由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据. 为了硬件上实现方便, 诸如 byte 和 short 这种低于4 个字节的类型, 会先提升成 int, 再参与计算.
正确的写法:
byte a = 10;
byte b = 20;
byte c = (byte)(a + b);
System.out.println(c);
类型提升小结:
- 不同类型的数据混合运算, 范围小的会提升成范围大的.
- 对于 short, byte 这种比 4 个字节小的类型, 会先提升成 4 个字节的 int , 再运算.
1.15 int与String之间的相互转换
int 转成 String
int num = 10;
// 方法1
String str1 = num + "";
// 方法2
String str2 = String.valueOf(num);
String 转成 int
String str = "100";
int num = Integer.parseInt(str);
1.16 小结
public class TestDemo {
public static boolean flg; //boolean默认值是false
public static char flg1; //char->'\u0000
public static int flg2; //int ->0
public static double flg3; //double->0.0
public static void main11(String[] args) {
System.out.println(flg);
System.out.println(flg1);
System.out.println(flg2);
System.out.println(flg3);
}
}