如果你想学好Java编程语言,最最基本的,你要搞懂变量的概念。
一、变量
1、概念
jvm在其管理的内存中开辟的、用来存储数据的存储空间。我们使用变量名称来操纵(使用)这些存储空间。
2、命名规则
我们用名称来标识存储空间,因此,变量名称的命名要符合标识符语法规则
- 可以由字母,数字,_和$任意多个组成,但是数字不能开头
- 大小写字母敏感,需要特别注意
- 可以使用汉字,但是不建议使用
- 不能使用关键字,如int,for,if等
- 尽量做到见名知意,多个单词时需要符合驼峰命名法
3、使用规则
我们是通过操作变量名来访问存储空间的,需要符合一些语法规则:
(1)变量名必须先声明和初始化
声明的含义:因java是强类型语言,因此在定义变量名时,必须先声明类型,强调该变量要存储的数据类型
格式: 数据类型名 变量名;
初始化含义:存储空间第一次存储数据。
格式: 变量名 = 初始化值。
初始化时机:
1) 使用前进行初始化:int a;a = 3;
2) 声明类型时直接初始化:int a = 3;
(2)可以对变量中的值进行存取操作
变量是存储数据的空间,可以对其赋值,更改和操作;要把对变量的操作理解为是对其所存储的数据的操作
int a = 100;
a = a + 200; // 将变量a中的值取出加上200的结果在存入变量a中
(3)变量的操作必须与类型匹配
int salary;
salary = 2000.65;//编译不通过,因为类型不匹配
double d = 12345.6;
int n = d%2;//编译不通过,d%2的结果为double类型
(4)变量是有自己的作用域
作用域:从声明处开始,一直到所在大括号的结束符号为止。在此作用域中,仅能声明一次;出了作用域,变量失效,需要重新声明才能使用
4、变量的分类
按照声明时所在的位置分类:
成员变量:方法外部,类的内部定义的变量。
局部变量:方法内部定义的变量注意:类外面不能有变量的声明
按照数据类型进行分类:
基本数据类型变量
引用数据类型变量对于不同数据类型的变量,在内存中占得空间大小也不相同。
二、基本数据类型
java语言中的数据类型可以概括为两大类:基本数据类型和引用数据类型。
基本数据类型中共有八种: byte,short,int,long,double,float,char,boolean。我们可以把这八种基本数据类型再次归类:
整数类型:byte,short,int,long
浮点类型:float,double
字符类型:char
布尔类型:boolean
1、整数类型
Java各整数类型都有固定的表数范围和字段长度,这样不受具体OS的影响,保证了java的可移植性。
1)int类型
int是最常用的整数类型,是java语言中的整数字面量的默认类型。一个int类型的变量在内存中在用4个字节大小(32位二进制)。最大表示范围为: -2^31 ~ 2^31 -1,即 -2147483648 ~ 2147483647。
封闭式运算
两个整数运算时,可以能会出现溢出情况,即超出整数范围的运算。正数溢出,会变成负数;负数溢出,会变成正数。我们也称之为封闭式运算。
2)long类型
在表示整数时,如果int类型的范围不够用,我们可以使用long类型,一个long类型的变量在内存中占用8个字节大小(64位)。其最大表示范围为:-2^63 ~ 2^63-1。即-9223372036854775808 ~ 9223372036854775807。
在往long类型的变量中存储整数字面量时,需要以L或者l结尾。换句话说,long类型的字面量需要添加L/l字符。
时间毫秒数来存储日期和时间
JDK提供了System.currentTimeMillis()方法,返回1970年1月1日0点0分0秒时间点到当前系统时间点所经历的毫秒数,其数据类型为long,该方法经常用于计时操作。
long类型进行较大整数运算
当long类型参与较大整数运算时,需要注意int的封闭式运算问题。
2、浮点数类型
与整数类型类似,Java 浮点类型也有固定的表数范围和字段长度,不受具体OS的影响。
Java 的浮点型字面量默认为 double 型,声明 float型字面量时,须在后加 f或 F。
浮点型常量有两种表示形式:
- 十进制数形式 如:5.12 512.0f .512 (必须有小数点)
- 科学计数法形式 如:5.12e2 512E2 100E-2
1)范围
float和double的范围是由指数的位数来决定的。float的指数位有8位,而double的指数位有11位,分布如下:
float | 1bit(符号位) | 8bit(指数位) | 23bit(尾数位) |
double | 1bit(符号位) | 11bit(指数位) | 52bit(尾数位) |
因此,我们可以得出,float的指数范围为-127~128,而double的指数范围为-1023~1024;其中负指数决定了浮点数所能表达的绝对值最小的非零数,而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。
float的范围为-2^128 ~ 2^128,也即-3.40E+38 ~ 3.40E+38;double的范围为-2^1024 ~ 2^1024,也即-1.79E+308 ~ 1.79E+308。
2)精度
float和double的精度是由尾数的位数来决定的。
float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。
3)计算误差
二进制系统中无法精确的表示1/10,就好像十进制系统中无法精确表示1/3一样。所以,2进制表示十进制会有一些舍入误差,对于一些要求精确运算的场合会导致代码的缺陷。
如: double money = 3.0;
double price = 2.9;
System.out.println(money-price);//看输出结果
如果需要精确运算,可以考虑使用BigDecimal类型来实现。
3、字符类型
char类型用来表示字符。字符字面量必须用单引号(‘ ’)括起来,且只有一个字符,涵盖世界上所有书面语的字符。
1)转义字符 "\"
对于不方便输出的字符,采用转义字符来表示,例如:
2)字符集
事实上,char也是一个16位无符号整数,整数范围为0~65535。每个整数都是对应字符的编码。java字符类型采用了Unicode字符集编码。Unicode是世界通用的定长字符集,所有的字符都是16位。
赋值方式有三种:
- 可以赋值字符,使用单引号,能且只能是一个字符
- 可以赋值十进制整数,范围为0~65535。
- 可以赋值Unicode形式:’\uXXXXX’,XXXX表示16进制数
乱码问题(思考题)
3)char计算
因为char也是无符合整数,因此可以参与整数计算。
4、布尔类型
boolean 类型适于逻辑运算,表示某个条件是否成立。一般用于程序流程控制:
1)分支控制结构语句
2)循环控制结构语句
boolean类型数据只允许取值true和false,true表示条件成立,false表示条件不成立。
boolean类型变量经常用于存储关系运算的结果,所谓关系运算就是比较两个变量的大小相等等关系。
三、类型转换
在java语言开发过程中,我们会经常遇到基本数据类型的转换问题。
1、自动类型转换(隐式类型转换):
占内存空间小的类型自动转换为占内存空间大的数据类型。数据类型按占内存大小排序为:
当有多种类型的数据混合运算时,系统首先自动将所有数据转换成占内存空间最大的那种数据类型,然后再进行计算。
byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型。
2、强制转换
占内存空间大的类型转换为占内存空间小的数据类型(参考上图),需要强制语法:(需要转成的类型)变量
注意:强制转换有可能出现精度损失或溢出
案例:
int a = 100;
int b = 200;
long c = a + b;//自动将int转换成longlong num = 1024L * 1024*1024*4;
int j = (int) num;//会产生溢出double pi = 3.141592653589793;
float f = (float) pi;//会造成精度损失
------------------------------------如有疑问,敬请留言--------------------------------------