数据类型
数据类型:
Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存总分配了不同大小的内存空间.
数据类型分类:
基本数据类型,引用数据类型
基本数据类型:
数值型[整数类型(byte,short,int,long),浮点类型(float,double)],字符型(char),布尔型(boolean).
引用数据类型:
类(class),接口(interface),数组([]).
整数类型: byte(字节),short(短整型),int(整型),long(长整型).
占用字节数 1 2 4 8
表数范围 -128~127,-2^15~2^15-1,-2^31~2^31-1,-2^63~2^63-1
Float double char boolean
占用字节数 4 8 2 1
表数范围 -3.403E38~3.403E38,-1.798E308~1.798E308
整数默认: int 小数默认: double
注意:长整型后缀用L或l标记.建议用L.
例子://超过int j = 1000000000000;
//错误格式 long j = 1000000000000;
long j = 1000000000000L;
System.out.println(j);
注意: 单精度浮点数用F或者f标记.建议使用F.(因为浮点数默认double)
例子: //错误格式 float f = 12.345;
float f = 12.345F;
System.out.println(f);
使用变量注意事项:
作用域 : 变量定义在哪一级大括号中,哪个大括号的范围就是这个变量的作用域.相同的作用域中不能定义两个同名变量.
初始化值 : 没有初始化值的变量不能直接使用.(也可以只要在使用前给值就可以,不一定非要在定义时候立刻给值).
初始化例子: int z;
Z = 100;
System.out.println(z);//这样定义也是可行的.
定义变量的格式:
A: 数据类型变量名 = 变量值(初始化值);
B: 数据类型变量名;
变量名 =变量值(初始化值);
建议: 一行只定义一个变量(也可以定义多个,但是不建议).
多个变量定义格式: int d,e;
d = 40;
e = 50;//正确但不建议
//int f,int g; //错误
int h;int I; //正确但不建议
数据类型转换 (默认转换)
注: 一般来说,我们在运算的时候,要求参与运算的数据类型必须一致.
class DataTypeDemo3{
public static void main(String[] args){
//直接输出的方式叫做加法
//System.out.println(3 + 4);
//两个int类型做加法
int x = 3;
int y = 4;
int z = x + y;
System.out.println(z);
//定义一个byte类型,一个int类型,做加法
byte a = 3;
int b = 4;
System.out.println(a + b);
//可能损失精度
//byte c = a + b;
int c = a + b;
System.out.println(c);
}
}
默认转换(从小到大转换):
A:byte,short,char -int-long-float-double(转化顺序)
B:byte,short,char相互之间不转换,他们参与运算首先转换为int类型。
案例 :
数据类型转换(强制转换)
强制转换:从大的数据类型到小的数据类型.
格式:目标数据类型 变量 =(目标数据类型) (被转换的数据);
注意:不要随意去使用强制转换,因为它隐含了精度损失问题.
例:
class Demo{
public static void main(String[] args){
byte a = 3;
int b = 4;
//这个肯定没有问题//int b = a+b;
//byte c = 7;
//byte c = a+b;//这个是有问题的
//用强制类型转换改进
byte c = (byte) (a+b);
System.out.println(c);//但是不建议在实战中经常使用强制类型转换,容易损失精度。
}
}
思考题: 请问下面这个有没有(怎么转换).
double d = 12.345;
float f = d;
解:
class Demo{
public static void main(String[] args){
double d = 12.345;
float f = (float)d;//把double赋值给了float,加了强制类型转换。
//看看下面的两个定义有没有区别?
float f1 = (float)12.345;
float f2 = 12.345f;
//区别:f1其实是通过一个double类型转换过来的;而f2本身就是一个float类型。
}
}
面试题: byte b1 = 3,b2 = 4,b;
b = b1 + b2;
b = 3 + 4;
那句是编译失败的呢?为什么呢?
解:
class Demo{
public static void main(String[] args){
byte b1 = 3,b2 = 4,b;
b = b1 + b2;//b1和b2是byte类型相加,首先会进行类型提升转换为int类型,因为b是byte类型,b1和b2相加是int类型,所以冲突,结果报错。
b = 3 + 4;//常量,先把结果计算出来,然后看是否在byte的范围内,如果在就不报错。
}
}
例题总结:两个变量相加,先对类型进行提升,然后运算,再将运算结果赋值。
两个常量相加,先计算常量数值,然后判断是否满足类型范围,在赋值。
强制转换数据溢出后的结果怎么计算?
(1)byte b = 130; 有没有问题?如果我想让赋值正确,可以怎么做?结果是多少呢?
(2)练习:byte b = 300;
class Demo{
public static void main(String[] args){
byte b = 130;//报错是损失精度,因为byte的范围是:-128到127。而130不再范围内所以报错。
byte b = (byte)130;//我们可以使用强制类型转换
System.out.println(b);//结果是-126;
分析过程:我们想要知道结果是什么,就应该知道是如何进行计算的,而我们又知道计算机中数据的运算都是补码进行的。而要得到补码,首先要计算出数据的二进制。
A:获取130这个数据的二进制。
00000000 00000000 00000000 10000010
B:做截取操作,截成byte类型的了。
C:已知补码求原码。
符号位 数值位
补码: 1 0000010
反码: 1 0000001
原码: 1 1111110
}
}
初学的宝宝们可能不懂,因为这里涉及到转换与反补码,我只能说习惯就好。一步一步脚踏实地的慢慢来