数据类型
强类型语言:
要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用
基本数据类型:
Java中的数据类型分为两大类 基本类型:基本数据类型包括
boolean(布尔型)、float(单精度浮点型)、char(字符型)、byte(字节型)、short(短整型)、int(整型)、long(长整型)和
double (双精度浮点型)共 8 种
引用类型:
引用数据类型建立在基本数据类型的基础上,包括数组、类和接口。引用数据类型是由用户自定义,用来限制其他数据的类型。另外,Java 语言中不支持 C++ 中的指针类型、结构类型、联合类型和枚举类型。引用类型还有一种特殊的 null类型。所谓引用数据类型就是对一个对象的引用,对象包括实例和数组两种。实际上,引用类型变量就是一个指针,只是 Java 语言里不再使用指针这个说法。
java的数据类型的分类
(1)图一
(2)图二
问题一 什么是字节?
位(bit):是计算机 内部数据 储存的最小单位
字节(byte):是计算机中 数据处理 的基本单位,习惯上用大写B来表示 1B(字节) = 8 bit(位)
1 bit 表示 1 位 1Byte表示一个字节 1B = 8b
1024B = 1KB 1024KB = 1M
1024M = 1G 1024G = 1TB
.
字符:是指计算机中使用的字母、数字、字和符号
问题二 Java基本类型占用的字节数
1字节: byte , boolean
2字节: short , char
4字节: int , float
8字节: long , double
注:1字节(byte)=8位(bits)
附录:
1.编码与中文
Unicode/GBK: 中文2字节
UTF-8: 中文通常3字节,在拓展B区之后的是4字节 综上,中文字符在编码中占用的字节数一般是2-4个字节。
案例1.char在Java中的字节数
char在Java中占用2字节。
Java编译器默认使用Unicode编码,因此2字节可以表示所有字符。
测试代码:
char a= (char) Integer.MAX_VALUE;
System.out.println((int)a);
结果输出:
65535
以上足以说明char占用的字节数是2字节。
一、基本数据类型
byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0
short:短整型,在内存中占16位,即2个字节,取值范围-32768~32767,默认值0
int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0
long:长整型,在内存中占64位,即8个字节-263~263-1,默认值0L
float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数字(与double的区别在于float类型有效小数点只有6~7位),默认值0
double:双精度浮点型,用于存储带有小数点的数字,在内存中占64位,即8个字节,默认值0
char:字符型,用于存储单个字符,占16位,即2个字节,取值范围0~65535,默认值为空
boolean:布尔类型,占1个字节,用于判断真或假(仅有两个值,即true、false),默认值false
对于数值类型的基本类型的取值范围,我们无需强制去记忆,因为它们的值都已经以常量的形式定义在对应的包装类中了。
例如:
基本类型byte 二进制位数:Byte.SIZE
最小值:Byte.MIN_VALUE
最大值:Byte.MAX_VALUE
基本类型short 二进制位数:Short.SIZE
最小值:Short.MIN_VALUE
最大值:Short.MAX_VALUE
基本类型char二进制位数:Character.SIZE
最小值:Character.MIN_VALUE
最大值:Character.MAX_VALUE
基本类型double 二进制位数:Double.SIZE
最小值:Double.MIN_VALUE
最大值:Double.MAX_VALUE
注意:
(1)float、double两种类型的最小值与Float.MIN_VALUE、 Double.MIN_VALUE的值并不相同,实际上Float.MIN_VALUE和Double.MIN_VALUE分别指的是 float和double类型所能表示的最小正数。也就是说存在这样一种情况,0到±Float.MIN_VALUE之间的值float类型无法表示,0 到±Double.MIN_VALUE之间的值double类型无法表示。这并没有什么好奇怪的,因为这些范围内的数值超出了它们的精度范围。
Float和Double的最小值和最大值都是以科学记数法的形式输出的,结尾的"E+数字"表示E之前的数字要乘以10的多少倍。比如3.14E3就是3.14×1000=3140,3.14E-3就是3.14/1000=0.00314。
(2)Java基本类型存储在栈中,因此它们的存取速度要快于存储在堆中的对应包装类的实例对象。从Java5.0(1.5)开始,JAVA虚拟机(Java Virtual Machine)可以完成基本类型和它们对应包装类之间的自动转换。因此我们在赋值、参数传递以及数学运算的时候像使用基本类型一样使用它们的包装类,但这并不意味着你可以通过基本类型调用它们的包装类才具有的方法。另外,所有基本类型(包括void)的包装类都使用了final修饰,因此我们无法继承它们扩展新的类,也无法重写它们的任何方法。
(3)基本类型的优势:数据存储相对简单,运算效率比较高
包装类的优势:有的容易,比如集合的元素必须是对象类型,满足了java一切皆是对象的思想
二、基本数据类型变量间转换
**自动类型转换:**容量小的类型自动转换为容量大的数据类型。
数据类型按容量大小排序为:byte、char、short→int → long→ float →double
注意
(1).byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型。
(2).boolean类型不能与其它数据类型运算。
(3).当把任何基本数据类型的值和字符串(String)进行连接运算时(+),基本数据类型的值将自动转化为字符串(String)类型。
(4)boolean类型不可以转换为其他的数据类型
**强制类型转换:**强制类型转换可能会出现数据丢失,使用时要加上强制转换符:()。但可能造成精度降低或溢出
二、引用数据类型:
类、接口类型、数组类型、枚举类型、注解类型。
区别:
(1)基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上。
(2)引用数据类型在被创建时,首先要在栈上给其引用(句柄)分配一块内存,而对象的具体信息都存储在堆内存上,然后由栈上面的引用指向堆中对象的地址。
案例:
例如,有一个类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释放。其特点是使用灵活,空间比较大,但容易出错
.
栈区:
由编译器自动分配释放,保存局部变量,栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁,其特点是效率高,但空间大小有限
.
文字常量区:
常量字符串就是放在这里的。 程序结束后由系统释放。