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 位内存
只有两个取值:truefalse
默认值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_数据类型的主要内容,如果未能解决你的问题,请参考以下文章

9_JavaSE_Math类

_01JavaSE基础_关键字标识符常量进制变量注释数据类型数据类型转换

JavaSE_集合(集合简单认识CollectionList)

01 变量与数据类型

JavaSE复习_2 对象与类

4_JavaSE_变量的类型