一、基本数据类型:
byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0
short:短整型,在内存中占16位,即2个字节,取值范围-32768~32767,默认值0
int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0
long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L
float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数字(与double的区别在于float类型有效小数点只有6~7位),默认值0
double:双精度浮点型,用于存储带有小数点的数字,在内存中占64位,即8个字节,默认值0
char:字符型,用于存储单个字符,占16位,即2个字节,取值范围0~65535,默认值为空
boolean:布尔类型,占1个字节,用于判断真或假(仅有两个值,即true、false),默认值false
二、引用数据类型:
类、接口类型、数组类型、枚举类型、注解类型。
区别:
基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上。
引用数据类型在被创建时,首先要在栈上给其引用(句柄)分配一块内存,而对象的具体信息都存储在堆内存上,然后由栈上面的引用指向堆中对象的地址。
例如,有一个类Person,有属性name,age,带有参的构造方法,
Person p = new Person("zhangsan",20);
在内存中的具体创建过程是:
1.首先在栈内存中位其p分配一块空间;
2.在堆内存中为Person对象分配一块空间,并为其三个属性设初值"",0;
3.根据类Person中对属性的定义,为该对象的两个属性进行赋值操作;
4.调用构造方法,为两个属性赋值为"Tom",20;(注意这个时候p与Person对象之间还没有建立联系);
5.将Person对象在堆内存中的地址,赋值给栈中的p;通过引用(句柄)p可以找到堆中对象的具体信息。
相关知识:
静态区: 保存自动全局变量和 static 变量(包括 static 全局和局部变量)。静态区的内容在总个程序的生命周期内都存在,由编译器在编译的时候分配。
堆区: 一般由程序员分配释放,由 malloc 系列函数或 new 操作符分配的内存,其生命周期由 free 或 delete 决定。在没有释放之前一直存在,直到程序结束,由OS释放。其特点是使用灵活,空间比较大,但容易出错
栈区: 由编译器自动分配释放,保存局部变量,栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁,其特点是效率高,但空间大小有限
文字常量区: 常量字符串就是放在这里的。 程序结束后由系统释放。
三、数据类型的转换:
(1)boolean类型不参与转换
(2)默认转换
A:从小到大
B:byte,short,char -- int -- long -- float -- double
C:byte,short,char之间不相互转换,直接转成int类型参与运算。
(3)强制转换
A:从大到小
B:可能会有精度的损失,一般不建议这样使用。
C:格式:
目标数据类型 变量名 = (目标数据类型) (被转换的数据);
(4)思考题和面试题:
A:下面两种方式有区别吗?
float f1 = 12.345f;
float f2 = (float)12.345;
答:有区别,float f1=12.345f定义一个float类型的变量,float f2 = (float)12.345是把double类型的12.345强制转换为float类型的变量。
B:下面的程序有问题吗,如果有,在哪里呢?
byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2;
byte b4 = 3 + 4;
答:byte b3 = b1 + b2;是有问题的因为两个byte类型的变量相加首先会把byte提升为int再做加法运算再把结果int类型的结果赋值给byte类型的变量b3会有问题
而byte b4 = 3 + 4;没问题是因为3+4是一个常量计算,然后把结果赋值给byte类型的b4,如果结果在byte的范围之类就不会报错,显然byte的范围是-127-128所以不会有问题。
C:下面的操作结果是什么呢?
byte b = (byte)130;
答:结果是-126,
我们要想知道结果是什么,就应该知道是如何进行计算的。
而我们又知道计算机中数据的运算都是补码进行的。
而要得到补码,首先要计算出数据的二进制。
A:获取130这个数据的二进制。
00000000 00000000 00000000 10000010
这是130的原码,也是反码,还是补码。
B:做截取操作,截成byte类型的了。
10000010
这个结果是补码。
C:已知补码求原码。
符号位 数值位
补码: 1 0000010
反码: 1 0000001
原码: 1 1111110
D:字符参与运算
是查找ASCII里面的值
'a' 97
'A' 65
'0' 48
System.out.println('a'); 97
System.out.println('a' + 1);98
E:字符串参与运算
这里其实是字符串的连接
System.out.println("hello"+'a'+1);helloa1
System.out.println('a'+1+"hello");98hello
System.out.println("5+5="+5+5);5+5=55
System.out.println(5+5+"=5+5");10=5+5