Java 变量及基本数据类型
1.Java变量
1.1 变量的概念
- 内存中开辟的一块存储空间,用于存放运算过程中需要用到的数据;
- 该区域有自己的名称(变量名)和类型(数据类型);
- 该区域的数据可以在同一类型范围内不断变化;
1) 为什么需要定义变量
- 用来不断的存放同一类型的常量,并可以重复使用;
2) 定义变量的格式
- 数据类型 变量名 = 初始化值;
3)变量使用范围
- 变量的作用范围(一对{}之间有效,"就近原则");
1.2 变量的使用
1)声明
int a ; //表示声明一个整型变量,名为a;
int b,c,d; //表示声明三个整型变量,名为b,c,d;
2)命名
- 只能包含数字、字母、_(下划线)和$(美元符号),并且不能以数字开头;
- 严格区分大小写
- 不能使用关键字
- 可以中文命名,但不建议
- 命名规则:建议“驼峰命名法”、“见名知意”,如定义个变量表示学生成绩:studentScore
//演示错误的命名
int 123abc; //不能以数字开头
int ab*5; //不能使用除了_和$之外的其它特殊字符
int break; //不能使用关键字
int score = 90;
System.out.println(Score); //编译错误,Java大小写严格区分
//演示正确的命名
int abc12;
int 变量; //正确但是不建议中文命名
int _12$a;
int MyName;
int myName;
3)初始化
声明的同时初始化:
int a = 250;
先声明后初始化:
int a;
a = 250;
int a,b=5; //声明了变量a和b,并给b赋值为5,a没有赋值
4)使用
- 对变量操作就是对它所存的那个数进行操作。
int a = 5; //声明变量a并赋值为5;
int b = a+10; //声明变量b,取出a的值5,加上10后,将和赋值给b
System.out.println(b); //输出b的值是15
a = a+b; //取出a的值5,再取出b的值15,再把两个数的和重新赋值给a
System.out.println(a); //输出a的值是20
- 变量的操作必须与数据类型匹配
int a = 3.14;
//报错:类型不匹配,Type mismatch: cannot convert from double to int
- 变量在使用之前必须声明并初始化
System.out.println(m); //编译错误,m未声明
int m;
System.out.println(m); //编译错误,m未初始化
2.基本数据类型
Java语言有8种基本数据类型,分别是用于存储整数、小数、字符和布尔类型数据,分别是:整数类型(包含byte、short、int、long)、小数类型(包含float、double)、char类型和boolean类型(false、true)。
数据类型 |
字节空间 | 使用场景 |
byte | 1字节(8位) | 存储字节数据(较常用) |
short | 2字节(16位) | 兼容性考虑(很少用) |
int | 4字节(32位) | 存储普通整数(常用) |
long | 8字节(64位) | 存储长整数(常用) |
float | 4字节(32位) | 存储浮点数(不常用) |
double | 8字节(64位) | 存储双精度浮点数(常用) |
char | 2字节(16位) | 存储一个字符(常用) |
boolean | 1字节(8位) | 存储逻辑变量(true、false)(常用) |
2.1 int类型
整型,占4个字节(32位),最大表示范围:-2^31~2^31-1,-2147483648~2147483647,大概21亿~-21亿。整数直接量默认为int型,但不能超出范围,超范围则编译错误。
int x = 3000000000; //java默认直接写出的整数直接量是int类型,30亿超出整数范围
//编译错误:The literal 3000000000 of type int is out of range ,超出int范围。
整数直接量(literal):就是直接写出的整数,如100,除了十进制书写形式,也可以写16进制形式(以0x或0X开头,如0x186a)或8进制(以0开头,如0303240)。
1)两个整数相除,结果还是整数,小数位无条件舍弃;
int a = 5; int b = 2; int c = 5/2;
int d = 2/5; System.out.println(c); //结果为整数:2,小数位无条件舍弃
System.out.println(d); //结果为0
2)整数运算时若超出范围,则发生溢出,溢出是需要避免的;
int a = 2147483647; //int最大值
int b = a+1;
System.out.println(b); //-2147483648,结果超出最大值范围,发生溢出,int最大值+1得到int的最小值
2.2 long长整型
对于较大的整数运算(超出int的范围),可以使用long型,一个long型变量占用8个字节(64位),最大表示范围是:-2^63~2^63-1,即-9223372036854775808~9223372036854775807。
1)长整型直接量需再数字后加L或l
long a = 3000000000l; //声明一个长整型变量a,赋值为30亿
long b = 3000000000L; //声明一个长整型变量b,赋值为30亿
2)运算时若有可能溢出,建议在第1个数字后加L
//计算10*3亿并输出结果
long a = 10*300000000;
//两个整型运算默认得到的还是整型,但是结果已经超int范围,所以发生溢出
System.out.println(a); //结果发生溢出:-1294967296
//如可能溢出,建议在第1个数字后加L,这样得到的结果就是long型,这里发生自动类型转换
long b = 10L*300000000;
System.out.println(b);
3)获取自1970年1月1日0时到现在的毫秒数
//System.currentTimeMillis()可以获取,得到的结果是long型
long time = System.currentTimeMillis();
System.out.println(time);
2.3 double类型
浮点型,就是小数,包括folat和double,double类型变量占8个字节(64位),double型的精度值是float类型的两倍,所以也成为双精度浮点型。大多数场合使用double表示浮点数。
1)浮点数直接量默认为double型,若想表示float型,需要在数字后面加F或f
float a = 5.6F;
float b = 7.8f;
double pi = 3.14;
2)double型数据在参与运算时,有可能会出现舍入误差,所以精确运算场合不可使用
2进制系统中无法精确的表示1/10,就好像十进制系统中无法精确表示1/3一样,所以才会出现舍入误差,如果在需要精确运算的时候,可以使用BigDecimal类来实现。
double x = 3.0;
double y = 2.9;
System.out.println(x-y);
//结果是0.10000000000000009,出现舍入误差
2.4 char类型
字符类型事实上是一个2字节(16位)无符号整数,这个值对应字符的编码。Java字符类型采用Unicode字符集编码,Unicode是世界通用的定长字符集,所有的字符都是16位。
字符直接量通过单引号表示,如‘中’,也可以采用16进制表示形式,如‘\u4e2d'。
char c1 = '中'; //内存中存的是'中'的编码
char c2 = '\u4e2d'; //‘4e2d’是‘中’对应的16位Unicode编码的16进制表示形式
System.out.println(c1);
System.out.println(c2);
1)采用Unicode编码格式,每个字符都对应一个码,表现形式是字符char,但实质上是码(int型)
在对char型变量赋值时,有三种方式:
- 字符直接量:如'A',变量中实际存储的是该字符的Unicode编码(无符号整数值),一个char型变量只能存储一个字符。
- 整型直接量:范围0~65535之间的整数,变量中实际存储的即该整数值,但表示的是该整数值所对应的Unicode字符。
- Unicode:如'\u0041',Unicode字符的16进制形式。
ASCII('a' = 97, 'A' = 65, '0' = 48)
public class Test {
public static void main(String[] args){
char cha = 97; //内存中存的是'中'的编码
char chA = 65;
char chNum0 = 48;
System.out.println("97表示字母"+cha);
System.out.println("69表示字母"+chA);
System.out.println("48表示数字"+chNum0);
}
/*
运行结果:
97表示字母a
69表示字母A
48表示数字0
*/
2)字符直接量必须放在单引号中,有且仅有一个
char x = '你';
char y = '你好'; //编译错误
3)特殊字符需要通过\来转义
转义字符 | 含义 |
'\n' | 表示回车符 |
'\r' | 表示换行符 |
'\\' | 表示反斜杠(\) |
'\'' | 表示单引号(') |
'\"' | 表示双引号(") |
char x = '\"';
char y = '\\';
System.out.println(x); //结果: "
System.out.println(y); //结果: \
2.5 boolean类型
boolean类型占1个字节(8位),适用于逻
辑运算,表示某个条件是否成立,一般用于程序的流程控制。boolean类型只允许取值true或false;true表示条件成立,false表示条件不成立,默认值为false。
int a = 5;
boolean b = a-1>0;
System.out.print(b); //结果:true
3.基本类型间转换
不同的基本类型直接可以相互转换,类型大小关系如下图:
3.1两种方式:
- 自动类型转换(隐式类型转换):从小类型到大类型可以自动完成。
- 强制转换:从大类型到小类型,强制转换语法:(需要转换成的类型)变量,强制转换可能会造成精度丢失或溢出。
int a=5,b=5;
long c = a+b; //发生自动类型转换,int自动转换为long
a = (int)c; //强制转换,long强制转换为int,因为c=10没有超int范围,所以没发生溢出
long d = 3000000000L;
b = (int)d; //30亿超出int范围,强制转换发生溢出
System.out.println("d的值为"+d);
System.out.println("强制转换后b的值为"+b);
/*
运行结果:
d的值为3000000000
强制转换后b的值为-1294967296
*/
3.2 两点规则:
- 整数直接量可以直接赋值给byte、short、char,但不能超出范围
- byte、short、char型数据参与运算时,先一律转换位int再运算
char a = 'a';
int b = a+10;
System.out.println(b);
/*
运行结果:107
字符a是数字97,运算时先将a转换为码int97再做运算
*/