Java变量和数据类型
1、变量的定义和使用
变量用一个符号来表示,在某一个变化的范围内,是一个变化的值。
变量的定义:
int a;
//int 变量允许存储的数据类型
//a 表示变量的符号
变量的赋值:
int a;
a = 10;
//此时打印 a 的值就是10
System.out.println("a = " + a);
a = 7;
//此时打印 a 的值是7
System.out.println("a = " + a);
变量可以在定义的同时初始化:
java中的 = 表示赋值
int num = 7;
使用变量就是使用表示这个变量的符号,就是要使用这个符号代表的值
变量必须被定义且初始化之后才能使用
2、变量的形态
public class nums {
static int b;//静态属性/类成员变量/类变量
int c;//属性/成员变量/实例变量
public static void main(String[] args) {
int a;//局部变量
}
}
3、变量的类型
四类八种
整形(byte int short long)
浮点型(float double)
字符型(char)
布尔型(boolean)
一个 int 变量占4个字节
在这里我们要明白 什么是字节?
字节是计算机中表示空间大小的基本单位 计算机使用二进制表示数据,8个二进制位(bit)表示一个字节 8GB内存就是指 8G个字节
1KB = 2^10 Byte= 1024 Byte
1MB = 2^10 KB
1GB = 2^10 MB
8GB = 8 * 2^30 Byte
也就是80多亿个字节 4个字节表示的范围是 -2^31 ~2 ^31-1
数字在计算机上都是以补码的形式存储,最小整数的补码:
1000 0000 0000 … 0000,那原码就是:1000 … 0000,负数的补码就是该数的绝对值的原码取反再 +1 ,所以我们计算出来的绝对值是2^31,那最小负数就是 -2^31
短整型占2个字节
short num = 2;
长整型,占8个字节表示的整数的范围是-2^63 ~ 2^63-1
定义一个长整形变量
long num = 10l;//l大小写都可以
单精度浮点型占4个字节
float num2 = 1.0f;
双精度浮点型占8个字节
double num1 = 1.0;
float类型表示的数据的精度范围比较小,因此再使用浮点型数据时一般先考虑double
接下来我们看一段代码
int a = 1;
int b = 2;
System.out.println(a/b);//结果输出为0
double a1 = 1.0;
double b1 = 2.0;
System.out.println(a1/b1);//结果输出为0.5
以数学思维来看结果就是0.5呀,为什么会出现0这个结果呢?
因为在Java中 int 型与 int 型进行计算时,得到的结果仍然是 int 型,我们知道 int
型是不能有小数点的,计算结果会将小数点后的数据直接舍去,而double 是双精度浮点型,当然可以有小数点啦,对叭。
double num3 = 1.1;
System.out.println(num3 * num3);//输出结果:1.2100000000000002
那这段代码的输出结果又为什么是这样的呢?结果不应该是1.21嘛?
因为double 类型的数据的内存布局和 int 型有很大差别,遵守IEEE
754标准,尝试用有限的内存空间表示无限的小数,因此会存在精度误差.
字符类型
C语言中使用ASCII码表示字符,一个字符占1个字节,Java中用Unicode表示字符,一个字符占2个字节,字符类型也可以表示中文
char ch = 'a';
字节类型
byte b = 0;
字节类型表示的也是整数,只占1个字节,表示的范围是-128~127
布尔类型
有时占1个字节,有时候占一个比特位,没有明确规定
boolean value = true;//boolean类型的变量只有 true(真) 和 false(假) 两种取值
Java中 boolean 类型和 int 类型不能相互转换,不存在 1 表示true,0 表示 false
4、变量的作用域
变量的作用域就是变量的生效范围,一般范围都在变量所在的大括号内
public class Test {
public static void main(String[] args) {
int a = 0;
System.out.println(a);
}
public void print1() {
System.out.println(a);//Cannot resolve symbol 'a',找不到变量a
}
}
public class Test {
public static void main(String[] args) {
{
int a = 0;
System.out.println(a);//打印0
}
{
double a = 3;
System.out.println(a);//打印3.0
//编译通过,虽然跟上面的变量名相同,但是与上面的变量完全无关
}
}
}
5、变量的命名规则
(1)变量名只能由数字、字母、下划线组成
(2)不能是数字开头
(3)变量名中的字母有大小写之分
(4)变量名要见名知意,一般都是英文,狮子啊不好用英文描述拼音也不是不可以
(5)词性一般是名词,小驼峰命名法比较好看,就是变量名由很多单词组成时第一个单次小写,其他的单词的首字母都大写
int maxValue = 3;
final 修饰的变量就是一个常量,它所代表的值不能被修改
final int a = 10;
a = 20;//编译出错,Cannot assign a value to final variable 'a'
6、类型转换
int a = 10;
short b = 20;
long c = 30;
double d = 40;
boolean e = false;
a = b;//short 转换成 int 可以
b = a;//编译出错,int 转换成 short 不可以
a = c;//编译出错,long 转换成 int 不可以
c = a;//int 转换成 long 可以
a = d;//编译出错,double 转换成 int 不可以
d = a;//int 转换成 double 可以
a = e;//编译出错,boolean 转换成 int 不可以
e = a;//编译出错,int 转换成 boolean 不可以
从上面代码我们可以看出,表示范围小的类型可以转换成表示范围大的数据类型,反过来就会编译出错,而boolean 和int 是不能相互转换的
byte f = 100;//编译通过,100在 byte 能表示的范围之内(-128~127)
byte g = 300;//编译出错,300 超出了 byte 能表示的范围
Java会自动进行检查校验,判断赋值是否合理
使用强制类型转换
int a = 0;
double b = 10.5;
a = (int)b;
System.out.println(a);//输出结果为10
通过这段代码可以看到可以把 double 类型的数据强制转换成 int 类型,但是小数点之后的数据就丢失了,所以强制转换可能会导致精度丢失
但是强制类型转换不一定都能够转换成功,比如:
int a = 5;
boolean b = false;
b = (boolean)a;//编译失败,Inconvertible types; cannot cast 'int' to 'boolean'
7、数值提升
当不同类型的数值进行运算时,会产生怎样的结果呢?
int a = 10;
long b = 20;
int c = a + b;//编译出错
long d = a + b;
当 int 和 long 类型的数据混合进行运算的时候,int 会提升为 long 类型,得到的结果也是 long 类型的,非要用 int 类型接收结果的话就要强制转换
int c = (int)(a + b);//编译成功
下面这种情况也是编译失败的
byte a = 10;
byte b = 20;
byte c = a + b;//编译失败
因为计算机的CPU通常是按照4个字节为单位从内存中读写数据,为了硬件上实现方便,像byte ,short 这中低于4个字节的,会先提生成 int 再进行计算。