一、数据类型
1、基本数据类型
四类(整型、浮点型、字符型、布尔型),八种(byte、short、int、long、float、double、char、boolean)。
类型 | byte | short | int | long | float | double | char | boolean |
默认值 | 0 | 0 | 0 | 0 | 0.0f | 0 | /u0000 | FALSE |
注意:
- 不管是16位还是32位的系统,int都占四个字节,long都占八个字节。(Java的跨平台性)
- 整型和浮点型都是带符号的,最高位为符号位,0为正数,1为负数。
- 整型默认为int型,浮点型默认为double型。
2、引用数据类型
三种:类、接口、数组。
2.1类(class)引用
object:所有类的父类,所有对象(包括数组)都实现了这个类的方法。
String:字符串。
此外还有基本数据类型对应的包装类:Byte、Short、Integer、Long、Float、Double、Character、Boolean。
2.2接口(interface)引用
常用的Map、Set、Lest……
2.3数组引用
数组:存储在一个连续的内存块中的相同数据类型(引用数据类型)的元素集合。
注意:数组是定长的。无论,以哪种方式初始化数组,一旦初始化完成,数组的长度就固定了,不能改变,除非重新初始化。
2.4默认初始值
引用数据类型的默认值是null。
二、变量
语法格式:数据类型 变量名 = 初始值;
1、基本数据变量
1.1整型变量
- 定义时可以没有初始值,但是在使用前必须设置初值,如果没有合适的初始值,可以设置为0;
- 无论在什么系统下字节型bite都是一个字节,短整型short都是两个字节,整形都是四个字节,长整型都是八个字节;
- 变量赋初始值超过其表示范围的,编译器会自动报错;
- 在Java中整型除以整型还是整型(小数部分直接舍弃);
- 长整型的初始值后面加L,如:long a = 100L;
- 对于byte short 这种小于4个字节的整型变量,赋值的字面值没有超过其最大表示范围时,不会被解析为整型。
1.2浮点型变量
- 无论在什么系统下单精度浮点型float都是四个字节,双精度浮点型double都是八个字节;
- 浮点数与整数在内存中的存储方式不同,不能单纯使用 的形式来计算;
- 上用到浮点数都优先考虑 double, 不太推荐使用 float;
- 单精度浮点型的初始值后边要加f或F,否则会报错,因为浮点数默认为double。
浮点数存储原理(以四个字节大小的float为例):
例如浮点数3.25,转化为二进制为11.01,再用科学计数法表示为1.101^10(这里所有的数字都是二进制的),就这样,1.101被存放在尾数位,10被存放在指数位,符号位为0。因为二进制科学记数法的尾数都是以1开头,因此尾数开头的1省去不记。即 23 位的尾数位可存储 24 位尾数。
有的浮点数的二进制是无限的,但是计算机存储浮点数的位数是固定的。计算机只能表示它能表示的部分,因此浮点数有时候会出现精度丢失的问题。
1.3字符型变量
Java 中使用 单引号+ 单个字母 的形式表示字符字面值; 计算机中的字符本质上是一个整数,可以存放整形,Java 中使用 Unicode 表示字符,因此一个字符占两个字节。
1.4布尔型变量
- boolean 类型的变量只有两种取值, true 表示真, false 表示假;
- Java 的 boolean 类型和 int 不能相互转换, 不存在 1 表示 true, 0 表示 false 这样的用法;
- Java虚拟机规范中,并没有明确规定boolean占几个字节,也没有专门用来处理boolean的字节码指令,在《Java虚拟机规范》给出了单个boolean占4个字节,和boolean数组1个字节的定义,具体还要看虚拟机实现是否按照规范来,所以1个字节、4个字节都是有可能的。
- 补充:因为在虚拟机规范中说了,boolean值在编译之后都使用Java虚拟机中的int数据类型来代替,而int是4个字节,那么boolean值就是4个字节。boolean类型数组的访问与修改共用byte类型数组的baload和 bastore指令,因为两者共用,只有两者字节一样才能通用呀,所以byte数组中一个byte是1个字节,那么boolean数组中boolean是1个字节。总结:boolean在数组情况下为1个字节,单个boolean为4个字节。
1.5类型转换
Java作为一个强类型编程语言, 当不同类型之间的变量相互赋值的时候, 会有教严格的校验。当参与运算数据类型不一致时,就会进行类型转换。Java中类型转换主要分为两类:自动类型转换(隐式) 和强制类型转换(显式)。
1.5.1自动类型转换(隐式)
代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。特点:数据范围小的转为数 据范围大的时会自动进行。
1.5.2强制类型转换(显式)
当进行操作时,代码需要经过一定的格式处理,不能自动完成。特点:数据范围大的到数据范围小的。例如:
int a = 10; long b = 100L; a = (int)b;
注意:
- 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型;
如果需要把范围大的类型赋值给范围小的 , 需要强制类型转换 , 但是 可能丢失数据; 将一个字面值常量进行赋值的时候 , Java 会自动针对数字范围进行检查 ; 强制类型转换不一定能成功,不相干的类型不能互相转换 。
1.6类型提升
正确的写法因该是:
byte a = 10;
byte b = 20;
byte c = (byte)(a + b);
System.out.println(c);
2、引用数据类型
对应内存存储的值是一个引用,是对象的存储地址。对象的引用在栈中,实际对象存储在堆中。
null 在 Java 中表示 "空引用" ,也就是一个不指向对象的引用。null的作用类似于C语言中的空指针,都是表示一个无效的内存位置。因此不能对这个位置做任何的读写操作,否则就会抛出空指针异常:NullPointerException。
注意:Java中没有约定null和0号地址的内存有任何联系。
3、基本类型变量与引用类型变量之间的区别
三、问答
1.变量为什么能点出方法?
答:点出来的方法是变量类型所包含的方法。