首先,因为变量要保存数据,因此需要一块空间来存储,而这块空间就在“内存”上。
其次,变量必须先定义,再被赋值或者让初始化,才能被使用。
那么在JAVA中,变量有哪些形态呢?
没有无符号类型!!!
以及数据有哪些类型呢?
那么,下面就来一一介绍一下这些类型。
1. 整型变量
•基本语法格式: int 变量名 = 初始值; 初始化操作是 可选的 , 但是 建议 创建变量的时候都显式初始化 。
•在 Java 中 , 一个 int 变量占 4 个字节 , 和操作系统没有直接关系。 而 4 个字节表示的数据范围是 -2^31 -> 2^31-1 , 也就大概是 -21亿 到 +21亿 。
•可通过以下代码查看 Java 中的整型数据范围 :
System.out.println(Integer.MAX_VALUE); // int 的最大值
System.out.println(Integer.MIN_VALUE); // int 的最小值
※如果运算的结果超出了 int 的最大范围,就会出现溢出的情况。
// Integer 是int的包装类,'.'相当于"的"。
int maxValue = Integer.MAX_VALUE;
System.out.println(maxValue+1);
int minValue = Integer.MIN_VALUE;
System.out.println(minValue-1);
2.长整型变量
•基本语法格式: long 变量名 = 初始值;
long num = 10L;
初始化设定的值为 10L,表示一个长整型的数字,10l 也可以。使用 10 初始化也可以,10 的类型是 int,10L 的类型是 long,使用 10 L 或者 10 l 更好一些。
•Java 中 long 类型占 8 个字节。表示的数据范围 -2^63 -> 2^63-1
•我们依然可以使用以下代码查看 Java 中的长整型数据范围 :
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
// 运行结果
9223372036854775807
-9223372036854775808
这个数据范围远超过 int 的表示范围,足够绝大部分的工程场景使用。
3. 双精度浮点型变量
•基本语法格式: double 变量名 = 初始值;
在 Java 中, int 除以 int 的值仍然是 int( 会 直接舍弃 小数部分 );如果想得到 带小数的结果 , 需要使用 double 类型计算。
•Java 中的 double 虽然也是 8 个字节, 但是 浮点数的内存布局 和整数差别很大, 不能单纯的用 2 ^ n 的形式表示数据范围。Java 的 double 类型的内存布局依然遵守 IEEE 754 标准 ( 和 C 语言一样 ), 尝试使用有限的内存空间表示可能无限的小数, 势必会 存在一定的精度误差 。
4. 单精度浮点型变量
•基本格式: float 变量名 = 初始值;
•float 类型在 Java 中占 四个字节, 同样 遵守 IEEE 754 标准。 由于表示的数据 精度范围较小 , 一般在工程上用到浮点数都 优先考虑 double, 不太推荐使用 float。
5. 字符类型变量
•基本格式: char 变量名 = 初始值;
Java 中使用 单引号 + 单个字母 的形式表示字符 字面值 。
•计算机中的字符 本质上 是一个 整数 , 在 C 语言中使用 ASCII 表示字符; 而 Java 中 使用 Unicode 表示字符, 因此一个字符占用 两个字节, 表示的字符 种类更多 , 包括中文。
char ch = 'A';
char ch = '呵';
System.out.println(ch);
6.字节类型变量
•基本语法格式: byte 变量名 = 初始值;
字节类型表示的 也是整数。 只占 一个字节, 表示范围较小 ( -128 ~ +127 )。
•字节类型和字符类型 互不相干 。
7. 短整型变量
•基本语法格式: short 变量名 = 初始值;
•short 占用 2 个字节, 表示的数据范围是 -32768 -> +32767。
•这个表示范围比较小, 一般不推荐使用。
8. 布尔类型变量
•基本语法格式: boolean 变量名 = 初始值;
•boolean 类型的变量 只有两种取值, true 表示真, false 表示假。
•Java 的 boolean 类型和 int 不能 相互转换, 不存在 1 表示 true,0 表示 false 这样的用法。
•boolean 类型有些 JVM 的实现是占 1 个字节 , 有些是占 1 个比特位, 这个没有明确规定。
※ 字符串类型变量
•基本语法格式: String 变量名 = "初始值";
•Java 使用 双引号 + 若干字符 的方式表示字符串 字面值 。
•和上面的类型不同 , String 不是 基本类型 , 而是 引用类型。
•字符串中的一些特定的不太方便直接表示的字符需要进行转义。转义字符示例:
// 创建一个字符串 My name is "张三"
String name = "My name is \"张三\"";
转义字符有很多 , 其中几个比较常见的如下 :
转义字符 | 解释 |
\n | 换行 |
\r | 回到行首 |
\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
※变量的作用域
也就是该变量 能生效的范围 , 一般是变量定义所在的 代码块 (大括号) 。举个例子:
class Test {
public static void main(String[] args) {
{
int x = 10;
System.out.println(x); // 编译通过;
}
System.out.println(x); // 编译失败, 找不到变量 x.
}
}
class Test {
public static void main(String[] args) {
{
int x = 10; // 这里定义了一个变量 x,类型是 int,值是 10
System.out.println(x); // 会打印 10
}
{
double x = 20.0; // 这里又定义了一个变量 x,类型是 double,值是20.0
// 和上面的变量完全无关,只是用到的符号(变量名)相同
※变量的命名规则
•硬性指标:
1. 一个变量名 只能包含 数字, 字母, 下划线;
2. 数字 不能 放 开头;
3. 变量名是大小写敏感的, 即 num 和 Num 是两个不同的变量。
注: 虽然语法上 允许 使用中文 / 美元符 ($) 命名变量, 但是 不推荐 使用。
•软性指标:
1. 变量命名要具有描述性, 见名知意;
2. 变量名不宜使用拼音 ( 但是不绝对 );
3. 变量名的词性推荐使用名词;
4. 变量命名推荐 小驼峰命名法 ( 当一个变量名由多个单词构成的时候, 除了第一个单词之外, 其他单词首字母都大写)。
※字面量和常量
•字面值:
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 字面值常量 , 双引号中可以有多个字符
•final 关键字修饰的常量,常量 不能 在 程序运行过程中 发生 修改 。
※类型转换
Java 作为一个 强类型 编程语言, 当不同类型之间的变量相互赋值的时候, 会有教严格的校验。因此, 不同 数字类型 的变量之间赋值,表示范围 更小的 类型 能隐式转换 成 范围较大的 类型, 反之则不行。 但 int 和 boolean 是毫不相干的两种类型, 不能 相互赋值。还有在 int 字面值常量 给 byte 赋值时,因为 byte 表示的数据范围是: -128 -> +127,因此在赋值时必须考虑范围问题。
※使用强制类型转换
int a = 0;
double b = 10.5;
a = (int)b;
int a = 10;
boolean b = false;
b = (boolean)a; // 编译出错,提示不兼容的类型。
•使用 (类型) 的方式可以将 double 类型强制转成 int。 但是强制类型转换可能会导致 精度丢失。
•强制类型转换 不是一定能成功, 互不相干的类型之间 无法 强转。
※数值提升
•当 int 和 long 混合运算的时候, int 会 提升 成 long, 需要使用 long 类型的变量来接收结果。如果非要用 int 来接收结果, 就需要 使用强制类型转换 。
•byte 和 byte 都是相同类型, 但是出现编译报错。这是因为计算时会 先将 byte类型 都 提升 成 int类型 再进行计算, 得到的 结果也是 int 。 这是由于计算机的 CPU 通常是 按照 4 个字节为单位 从内存中读写数据, 为了硬件上实现方便, 像 byte 和 short 这种 低于 4 个字节的类型, 会先提升 成 int, 再参与计算。
※ 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);
※打印输出
System.out.println(msg); // 输出一个字符串, 带换行
System.out.print(msg); // 输出一个字符串, 不带换行
System.out.printf(format, msg); // 格式化输出(和C语言的printf的用法基本一致)
System.out.format(format, msg); // 完全等同于 printf
※运算符
名称 | 内容 |
赋值运算符 | = |
算数运算符 | + - * / (0不能作为除数) % += -= *= /= %= ++ (如果取表达式的返回值,则前置自增的返回值是自增之后的值,后置自增的返回值是自增之前的值) -- |
关系运算符 | == != < > <= >== |
逻辑运算符 | && || ! (返回值都是boolean) |
位运算符 | & | ~ ^ |
移位运算符 | << (最左侧位不要了,最右侧补0.左移N位相当于原数字*2的N次方) >> (最右侧位不要了,最左侧补符号位.右移N位,相当于原数字/2的N次方) >>> (无符号右移:最右侧位不要了,最左侧补0) |
条件运算符 | 表达式1 ? 表达式2 : 表达式3 |
• && 和 || 遵守 短路求值 的规则:
1. 对于 &&, 如果 左侧 表达式值 为false, 则表达式的整体的值一定是 false, 无需计算右侧 表达式。
2. 对于 ||, 如果 左侧 表达式值 为true, 则表达式的整体的值一定是 true, 无需计算右侧 表达式。
& 和 | ( 不推荐使用 ) 如果 操作数为 boolean 的时候 , 也表示逻辑运算。 但是 它们 不支持 短路求值。
•运算符之间是有优先级的,在可能存在歧义的代码中 加上括号 即可。
※注释
注释是为了让代码更容易被读懂而附加的描述信息, 不参与编译运行 , 但是却非常重要。
•Java中的注释主要分为以下三种:
1.单行注释: // 注释内容(用的最多);
2.多行注释: /* 注释内容 */ (不推荐);
3.文档注释: /** 文档注释 */ (常见于方法和类之上描述方法和类的作用 ) ,可用来自动生成文
档。
※关键字
关键字是 Java 中的一些 具有特定含义 的单词。特别注意,在定义的变量名时 不能 和关键字冲突。