- Java 变量
第三章 Java 变量
变量原理
变量是程序的基本组成单位。不论是使用哪种高级程序语言编写程序,变量都是其程序的基本组成单位。
(变量有三个基本要素:类型 + 名称 + 值)
变量概念
- 变量相当于内存中的一个数据存储空间的表示
变量使用注意事项
- 变量表示内存中的一个存储区域,不同的变量类型占用的空间大小不同,比如:int 4个字节、double 8个字节;
- 每一次存储区域都要有自己的名称(变量名)和类型(变量类型);
- 变量必须先声明,才能使用;
- 变量在同一个作用域内不能重名;
★程序中 “+号” 的使用
- 当左右两边都是数值类型时,则做加法运算;
- 当左右两边有一方为字符串时,则做拼接运算。
1 | public class Test{ |
(注意:第三个输出结果为 103hello,因为运算顺序是从左到右,先做加法,后做拼接)
数据类型
基本数据类型(8种)
- 数值型
- 整数类型(存放整数):byte[1],short[2],int[4],long[8]
- 浮点(小数)类型:float[4],double[8]
- 字符型:char[2]:存放单个字符,如 ‘A’、’方’ 等
- 布尔型:boolean[1]:存放 true 和 false
- 数值型
引用数据类型
- 类:class( Java 中 String 是一个类)
- 接口:interface
- 数组:[]
整数类型使用细节
- Java 各整数类型有固定的范围和字段长度,不受具体OS(操作系统)的影响,以保证 Java 程序的可移植性;
- Java 整型常量默认为 int 型,声明 long 型常量须后加 ‘l’ 或 ‘L’ 。
浮点数类型使用细节
与整数类型类似,Java 浮点类型也有固定的范围和字段长度,不受具体 OS 的影响;
Java 浮点型常量默认为 double 型,声明 float 型常量须后加 ‘f’ 或 ‘F’ ;
(注意:
float num = 1.1;
编译会出错,因为 1.1 默认为 double 类型,所以应该为float num = 1.1F;
)浮点型常量有两种表现形式:
- 十进制数形式:如 5.12,512.0f,.512 ;
- 科学计数法形式:如 5.12e2,5.12E-2 ;
通常情况下,应该使用 double 类型,因为它比 float 型更精确;
浮点数使用陷阱:
1 | public class Test{ |
(输出结果为 num1 和 num2 差值很小,近似认为相等
,这是因为浮点数采用二进制系统表示,二进制的小数无法精确地表示十进制的小数,计算机在计算十进制小数的过程中要先转换为二进制小数再进行计算,在这个转换过程中出现了误差,所以无法精确计算 8.1/3 ,而是得到一个近似值,约为 2.6999999997。)—> 所以在判断两个小数是否相等时,应该要判断两个小数在某种精度要求下是否相等。
字符类型使用细节
- 字符常量是用单引号(’ ‘)括起来的单个字符;
- 在 Java 中,char 的本质是一个整数,在输出时,是 Unicode 码对应的字符;
- 可以直接给 char 赋一个整数,然后输出时,会按照对应的 Unicode 码输出字符;
- char 类型是可以进行运算的,相当于一个整数。
字符类型本质探讨(ASCII、Unicode、utf-8、gbk)
字符型存储到计算机中,是需要将字符对应的码值转换为二进制,然后存储到内存中。
存储:’a’ ——> 97 ——> 二进制 110 0001 ——> 存储
读取:二进制 110 0001 ——> 97 ——> ‘a’ ——> 显示
字符和码值的对应关系是通过字符编码表决定的。
▲ASCII(用一个字节表示,一共 128 个字符,实际上一个字节可以表示 256 个字符,只用了 128 个)
Unicode ( Universal character encoding ) (用两个字节表示字符,字母和汉字统一都是占用两个字节)(Unicode 码兼容 ASCII 码)
★utf-8(Unicode Transformation Format)(大小可变的编码,字母使用一个字节,汉字使用三个字节)——> 对 Unicode 码的一个改进
gbk(可以表示汉字,而且范围广,字母使用一个字节,汉字使用两个字节)。gb2312 是 gbk 的一个子集
布尔类型使用细节
- 不可以用 0 或 非0 的整数代替 false 和 true 。
基本数据类型转换
当 Java 程序在进行赋值或运算时,精度小的数据类型自动转换为精度大的数据类型,称为自动类型转换。
自动类型转换注意细节
有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算;
当我们把精度大的数据类型赋值给精度小的数据类型时,就会出错,反之会进行自动类型转换;
1
2
3
4
5
6
7
8
9public class Test{
public static void main(String[] args){
int i = 1;
short s = i; //错误,虽然 i 的值为 1 ,但是这个 i 是 int 类型的,不能赋给 short 类型的 s
double num1 = 3d; //正确,数字后面加 d 表示是 double 类型的数
char ch = i + 1; //错误,i + 1 的结果是 int 类型的,不能赋给 char 类型的变量
}
}(byte、short)和 char 之间不会相互自动转换;
byte、short 和 char 他们三者可以计算,在计算时首先转换为 int 类型;——> 所以结果会是 int 类型的数
1
2
3
4
5
6
7
8
9
10public class Test{
public static void main(String[] args){
byte b1 = 1;
byte b2 = 2;
char c1 = 1;
char c2 = b1; //错误,因为 byte 和 char 之间不会自动转换
short s1 = b1 + c1; //错误,因为 b1 + c1 的结果是 int 类型,而变量 s1 是 short 类型
byte b3 = b1 + b2; //错误,因为运算过后,b1 + b2 的结果转变为 int 类型,而 b3 是 byte 类型
}
}boolean 不参与转换;
自动提升原则:表达式结果的类型自动提升为操作数中最大的类型。
强制类型转换:将容量大的数据类型转换为容量小的数据类型,使用时要加上强制转换符(),但可能造成精度降低或者溢出。
- 强制类型转换注意细节:
- 强制类型转换符号只针对于最近的操作数,往往会使用小括号提升优先级;
- char 类型可以保存 int 的常量值,但不能保存 int 的变量值,需要强转;
- byte 和 short 类型在进行运算时,当作 int 类型处理。
- 强制类型转换注意细节:
▲基本数据类型和 String 类型的转换
基本类型转 String 类型:将基本类型的值 +“” 即可;
String 类型转基本类型:通过基本类型的包装类调用 parseXX 方法即可。
例如
Integer.parseInt("123");
Double.parseDouble("123.1");
等。