3_JavaSE_数据类型
Posted Jack·Kwok
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3_JavaSE_数据类型相关的知识,希望对你有一定的参考价值。
1. 基本数据类型
我们都说 Java 是面向对象的语言,理论上Java中的数据类型应该都是类类型,但事实并非如此。Java提供了八种基本类型,其中包括六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
基本数据类型并不是类类型,因此 Java 并不是纯面向对象的语言,这么做其实是为了提高效率,当然为了弥补基本数据类型没有对象的特征这个缺点,Java 也设计出了包装类型。可能有点复杂,没事,继续往下看。
首先是介绍 Java 的八种基本类型。
byte:
占 8
位内存
有符号(表示正数可以省略符号)
最小值是 -128(-2^7)
最大值是 127(2^7-1)
默认值为 0
byte b1 = 34;
byte b2 = -24;
short:
占 16
位内存
有符号(表示正数可以省略符号)
最小值是 -32768(-2^15)
最大值是 32767(2^15 - 1)
默认值是 0
short s1 = 45;
short s2 = -9;
int:
占 32
位内存
有符号(表示正数可以省略符号)
最小值是 -2,147,483,648(-2^31)
最大值是 2,147,483,647(2^31 - 1)
一般地整型变量默认为 int 类型
默认值是 0
int i1 = 45;
int i2 = -43;
long:
占 64
位内存
最小值是 -9,223,372,036,854,775,808(-2^63)
最大值是 9,223,372,036,854,775,807(2^63 -1)
默认值是 0L
表示 long 类型的数值需要在末尾加上 L
,如 2456L
表示 2456
long l1 = 23L;
long l2 = -98L;
float:
单精度、占 32
位内存
默认值是 0.0f
float 类型不能用来表示精确的值,如货币
表示 float 类型的数值需要在末尾加上 f
,如 2456.6f
表示 2456.6
float f1 = 4.567f;
float f2 = -4.3456f;
double:
双精度、占 64
位内存
浮点数的默认类型为 double 类型
double 类型同样不能表示精确的值,如货币
默认值是 0.0d
double d1 = 34.4345;
double d2 = -34.55;
boolean:
占 1
位内存
只有两个取值:true
和 false
默认值是 false
boolean b1 = true;
boolean b2 = false;
char:
占16
位内存
存储 Unicode
字符
最小值是 \\u0000
(十进制等效值为 0)
最大值是 \\uffff
(即为 65535)
char 数据类型可以储存任何字符
默认值是 'u0000'
char c1 = 'a';
char c2 = '4';
2. 引用类型
引用类型包括数组(对象数组、基本类型数组)和对象
默认值为 null
引用类型可以用来引用与之兼容的类型(可以是相同类型、子类…)
//创建自定义的对象
Dog dog = new Dog();
//创建JDK提供的对象
String str = new String();
//创建基本类型数组,指定数组长度为4
int[] i = new int[4];
//创建对象数组,指定数组长度为4
Dog[] dogs = new Dog[4];
3. 包装类型
一开始我们说到 Java 中使用了基本数据类型是为了提高效率,但是基本数据类型有个很明显的缺点,就是不能使用 null
值,比如有个系统中有个「关于我」的模块,里面有一个字段是年龄,由于涉及到隐私,设计者把这个字段设计成选填的状态,那么如果用户不填这个字段,而这个字段在后台又是使用了int
存储,存储不了空,只能为默认值0
,这就很尴尬了。由于基本数据类型在处理数值时非常不方便,因此 Java 引入了包装类型。
以上就是八种基本数据类型所对应的包装类型,包装类型实际上就是类类型,因此包装类型的默认值是 null
。在这里还要讲一个常用的类 —— String
类,这个类经常用来存储字符串,它的值是不可变的。
装箱和拆箱的概念:
装箱:基本数据类型转换为包装类。
拆箱:包装类转换为基本数据类型。
自动装箱与自动拆箱:
好比学习驾驶证时的手动挡和自动挡,手动装箱是通过创建包装类对象,调用构造函数传入参数;而手动拆箱则是通过调用包装类的intValue
方法返回包装类的值。结合源码来看手动装箱和手动拆箱原理很简单,但平时使用步骤相对复杂。而自动装/拆箱则只需要在类型兼容的情况下相互赋值即可。
//1.自动装箱
int t1 = 1;
Integer t2 = t1;
//2.手动装箱
Integer t3=new Integer(t1);
System.out.println("int类型t1="+t1);
System.out.println("自动装箱,Integer类型对象t2="+t2);
System.out.println("手动装箱,Integer类型t3="+t3);
//1.自动拆箱
int t4 = t2;
//2.手动拆箱
//通过intValue()方法返回int值,还可以利用其他方法装换为其他类型
int t5 = t2.intValue();
System.out.println("自动拆箱,int型t4="+t4);
System.out.println("手动拆箱,int型t5="+t5);
自动类型转换与强制类型转换
在 Java 的编写过程中,我们有时候需要将一个类型的数据转换成另一个类型的数据的情况。
自动类型转换:转换前的数据类型的位数要低于转换后的数据类型(short --> int ,float --> double)
强制类型转换:转换的数据类型必须是兼容的
//自动类型转换
short s = 34;
int i = s;
//强制类型转换
int i1 = 123;
byte b = (byte)i1;
运算表达式过程中,整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。
转换从低级到高级。
低 ------------------------------------> 高
byte,short,char—> int —> long—> float —> double
例如:byte 类型和 int 类型的数据做运算,那么将 byte 类型的数据转换为 int 类型,再做运算,运算结果自然为 int 。
byte b = 12;
int l = 23;
System.out.println((Object)(b+l) instanceof Integer);//true
隐含的强制类型转换:(例如:计算结果如果没有强制转换,数值类型默认为 int ,小数类型默认为 double)
整数的默认类型是 int 。
小数的默认类型是 double 。
4. 常量
用 final
关键字修饰变量,该变量则为常量,并且在程序运行的过程中,常量的值不能被改变,常量命名一般为全大写,单词之间用下划线分开。如果需要表示非十进制数则前缀 0 表示 8 进制,而前缀 0x 代表 16 进制
表示常量 π
final double PI = 3.1415927;
表示 8 进制
final int EIGHT_WEI = 0144;
表示 16 进制常量
final int TEN_WEI = 0x64;
表示字符串常量
String THE_KEY_WORD = "Hello World";
常用转义字符:
\\n 换行
\\r 回车
\\t 制表符
\\" 双引号
\\' 单引号
\\\\ 反斜杠
\\ddd 八进制字符(ddd)
\\uxxx 十六进制字符(xxxx)
5. 总结
好了,以上就是所有的数据类型。实际上,记忆很简单。你只需要记住 Java 是面向对象的,因此 Java 的大部分类型都是对象,其次,由于考虑到效率问题,Java 设计了八大基本数据类型(非对象,所以没有对象的性质),后来因为运用原因,为基本数据类型设计了对应的包装类型(有了对象的性质),本质上包装类型也是对象。剩下的就是数组类型(因为大部分编程语言都有数组,这也是当时的形式,当然后面也推出了基于对象的集合来完善数组的过程,数组类型可以包含基本数据类型也可以包含对象)。
以上是关于3_JavaSE_数据类型的主要内容,如果未能解决你的问题,请参考以下文章
_01JavaSE基础_关键字标识符常量进制变量注释数据类型数据类型转换