Java基础语法2
java学习路线Day03
一、变量
变量概述:
在程序执行的过程中,在某个范围内其值可以发生改变的量。
理解:如同数学中的未知数
Java中定义一个变量的语句定义格式:
数据类型 变量名=初始化值
注意:
1.格式是固定的,记住格式,以不变应万变
2.变量的值不能随便给,数据的类型我们要提前定义好
3.变量在被使用的时候必须要给一个值,初始化值
4.我们要给一个变量起一个名字
public class DataTypeDemo1 {
public static void main(String[] args) {
//Java中定义一个变量的语句定义格式:
//数据类型 变量名=初始化值
//定义一个Byte类型的变量
byte b1=10;
//定义一个short类型的变量
short s1 = 100;
//定义一个int类型的变量
int i1 = 1000;
//定义一个long类型的变量
long l1 = 10000000000000L;
System.out.println(l1);
//定义一个float类型的变量
float f1 = 12.34F;
System.out.println(f1);//使用变量就是使用变量中存储的值
//定义一个double类型的变量
double d1 = 12.34;
//定义一个char类型的变量
char c1 = 'a';
//定义一个boolean类型的变量
boolean b2 =true;
注意事项:
1.如果要定义一个long类型的变量,在数值后面需要加上l或者L,表示是一个long类型的数据,推荐使用L, 因为Java中默认整数是int型
2.小数默认是double类型的,要定义float类型变量时,要加上f或F,表示是一个float类型
3.定义变量需要注意作用域,同一个作用域下,不能定义重名的变量
作用域:在Java中可以理解为同一个大括号 { } 内
4.一个变量如果没有初始化值,是不能使用的,只要在使用之前进行赋值即可,但是推荐在定义变量时就赋值
5.在方法上或内部定义的变量称之为局部变量。
6.在一行上建议只定义一个变量,可以定义多个,但是不建议
二、数据类型
java是一个强类型语言,对于每一种数据都定义了明确的具体数据类型。
因为不同的数据类型在内存中分配了不同大小的内存空间,所以每个大类型又分为很多小类型。分类如下:
各数据类型占字节数,以及表示范围如下:
数据类型范围问题
以Byte类型为例,Byte数据类型占一个字节,一个字节是8个bit位,最高位是符号位。所以在我们人脑的理解中范围应该是
1111 1111(-127) ~ 0111 1111(127)。
但是为什么Byte表示的范围是-128 ~ 127呢?
因为计算机中的所有数据运算都是以补码的形式完成。我们来把
1111 1111(-127) ~ 0111 1111(127)转换为补码应该是:
原码 | 反码 | 补码 | 值 |
---|---|---|---|
1111 1111 | 1111 1110 | 1000 0001 | -1 |
0111 1111 | 0111 1111 | 0111 1111 | 127 |
问题来了:
1000 0000(Byte类型的)代表的十进制值应该是多少呢?
System.out.println((byte)(0b10000000));
注意这里强制类型转换为了Byte型,如果是int型,10000000表示多少?
System.out.println((int)(0b10000000));
因为int型数据占4个字节,1000 0000只有一个字节,程序编译时,直接用0补全前三个字节,所以最高位也就是0,所以为正数。
System.out.println((byte)(0b11111111));
System.out.println((byte)(0b10000001));
System.out.println((byte)(0b00000000));
System.out.println((byte)(0b01111111));
从这里看出,Byte类型数据,从1111 1111~1000 0001表示 -1 到 -127,从
0000 0000~0111 1111表示0到127.而1000 0000表示-128.
所以Byte数据类型范围是 -128 ~127
三、数据类型转换
1.常量之间参与运算,会先进行数值相加,然后拿着结果去看一看在不在目标数据类型的范围内,如果在,就直接赋值,不在则报错
2.变量之间参与运算,要先提升数据类型,然后再运算
public class DataTypeDemo2 {
public static void main(String[] args) {
int a = 3;
int b = 4;
System.out.println(a+b);
int c = a+b;
System.out.println(c);
byte d=a+b;//报错
byte e=3+4;
System.out.println(e);
}
}
a为int类型,b为int类型,a+b同样为int类型。而d是Byte类型,等于是用小盒子装大象,所以报错。
不想报错就需要强制类型转化:
注意:e虽然是Byte类型,3,4默认应该是int类型,但是e=3+4却没有报错?
因为常量之间参与运算,会先进行数值相加,然后拿着结果去看一看在不在目标数据类型的范围内,如果在,就直接赋值,不在则报错。
数据类型之间有两种转换:
自动类型转换:
指的是byte,short,char这些变量参与运算的时候,会先提升数据类型到int
(byte,short,char) —>int ---->long—>float—>double
byte,short,char相互之间不转换,他们参与运算首先转换为int类型
强制类型转换:
用小的数据类型变量接收大的数据类型变量的时候会报错,这时候使用强制类型转换
语句定义格式:
目标数据类型 变量名 = (目标数据类型)(要转型的变量值或表达式)
注意:由于是强制类型转换,底层有截取的过程,可能会造成最终结果有精度损失。
例如把上面的d强制类型转换:
byte d=(byte)(a+b);//类型转换
System.out.println(d);
题目:
byte b1=3,b2=4,b;
b=b1+b2;
b=3+4;
哪句是编译失败的呢?为什么呢?
1.虽然b1和b2定义时是Byte类型,但是参与运算时自动转换为int类型,而变量b是Byte类型,属于是小盒子装大象。所以编译失败。
2.虽然在Java中,整数默认是int类型,但是常量之间参与运算,会先进行数值相加,然后拿着结果去看一看在不在目标数据类型的范围内,如果在,就直接赋值,不在则报错。所以b=3+4;这一个语句没有报错。(那如果换成小数常量相加呢?自己试一试)