前言:我们应该都学过了c语言程序设计,其实Java的数据类型和变量与c语言程序设计是差不多的,也有一些不同,我就这里讲述我所了解到的差异,如果有一些地方没讲到的,可以评论区告诉我,我也可以学习学习;如果有讲错的,也可以评论区告诉我,我立马改正,谢谢!!!
1,字面常量
什么是字面常量呢?举一个最简单的例子,在上一篇中写的HelloWorld程序中,System.out.println("hello world")语句,不论何时运行,输出的都是“hello world”,这里的“hello world”就是字面常量。
常量即程序运行期间,固定不变的量。(以下我给你们举一些例子)
在以上的结果中,我们可以看到,无论是整型还是浮点型等等,这里输出的就叫做字面常量。
字面常量的分类:
(1),字符串常量:由""括起来的,比如"hello"、"123"、"你好"。
(2),整型常量:程序中直接写的数字(注意没有小数点),如:10、140
(3),浮点数常量:程序中直接写小数的,如:3.14、9.58、0.56
(4),字符常量:由''括起来的单个字符,如:'A'、'5'
(5),布尔常量:这里的布尔常量只有两种,不是true就是false,与c中的不同的是不可以写成1/0
(6),空常量:null(与c语言中的NULL有所不同,在这里就不详细讲了)
注意:字符串、整型、浮点型、字符型以及布尔型,在Java中都被称为数据类型
2,数据类型
(1) Java中数据类型主要分为两类:基本数据类型和引用数据类型(下图是做一个简单的概括)
基本数据类型和引用数据类型的区别:基本数据类型里面存的是简单的数值,引用数据类型则存的是地址。
(2)基本数据类型中八种类型有什么不同呢?下面这张图可以观察出。
注意:1,我们可以看出不论是32位系统还是64位系统的(程序可移植性很强),int都占用4个字 节,long都占用8个字节。
2,整型和浮点型都是带有符号的。
3,整型默认为int型,浮点型默认为double型。
4,字符串属于引用类型,占用2个字节。
3,变量
在程序中,除了有始终不变的常量外,也有一些内容是可能会经常改变的,对于这种经常改变的内容,在Java程序中,称为变量。而数据类型就是用来定义不同种类的变量的。包括有局部变量(方法内部的变量)和成员变量(类和对象中会讲到)
以上代码就定义了一个整型变量a和一个布尔值flg,a的值是可以改变的,顺便教大家两个快捷键 。
(1)整型变量
以下定义整型变量的方法,有一些细节需要注意的。
既然讲到整型变量了,就讲详细一点,以下我们来看一下整型变量的范围。
注意:从上面可以看出,我们在定义整型变量的时候不能超过它的范围,否则编译器就会报错;
int的包装类型是Integer(包装类型就是基本数据类型所对应的类类型)(也就是Integer只是int的plu版本),包装类的好处就是可以灵活地进行数据类型处理(如下图)。
(2) 长整型变量
注意:1,long的包装类型就是Long
2,l长整型变量的初始值后加L或l,建议写L
3,长整型不论在哪个系统下都占用8个字节
(3)短整型变量
注意:1,同样,short的包装类型是Short
2,short在任何系统下都占用2个字节
(4)字节型变量
当对byte进行强制类型转换时,
注意:byte在任何系统下都只占用1个字节
包装类型是Byte
(5)浮点型
(5.1)双精度浮点型
注意:1,我们可以看到,在第二个打印b/c的时候,输出结果是0,为什么呢?结果不应该是0.5的吗?原因是因为 在Java中,int除以int的值仍然是int(会直接舍弃小数部分),所以这里输出的是0,如果想要得到0.5,则需要用到double型,像上面的d/e,得到的就是0.5
2,看上面最后一个代码,为什么不输出1.21?原因是因为double类型的内存布局遵守IEEE754标准(和c语言的一样),尝试使用有限的内存空间表示可能无限的小数,势必会存在一定精度误差,因此浮点数是个近似值,并不是精确值。
3,double类型的包装类型是Double
4,double类型在任何系统下都是占用8个字节
(5.2)单精度浮点型
看到这个代码,你可能会有疑惑,什么时候用double型?什么时候会用float型?
在我看来,这两者都差不多,只是double的范围相对于float的大一点。float类型在Java中占4个字节,同样遵守IEEE754标准,由于表示的数据精度范围较小,一般在工程上用到的浮点数优先考虑double,不太推荐使用float。
第二个需要知道的是,float的包装类型是Float。
(6)字符型变量
这里的char与c语言中的char有所不同。
在Java中的字符可以存放整型,计算机中的字符本质上是一个整型,在c语言中使用的是ASCll表示字符,而在Java中使用Unicode表示字符,因此一个字符占用两个字节,表示字符种类更多,包括中文。
第二个我们需要知道的是,char的包装类型是Character。
(7)布尔型变量
注意:1,在Java中,布尔类型只有2个值,一个是true,一个是false,没有所谓的0是假,非0是真!!!
2,boolean的包装类是Boolean。
3,Java虚拟机规范中,并没有明确规定boolean占几个字节,也没有专门用来处理boolean的字节码指令,在Oracle公司的虚拟机实现中,boolean占用1个字节。
4,类型转换
我们来看一下以下的一个代码:
为什么会出现这种情况呢?
因为在Java中,当参与运算的数据类型不一致时,就会进行数据类型转换。Java中数据类型转换主要分为两类:自动类型转换(隐式)和强制类型转换(显式)。上面代码中a和b都是整型,a的范围小,b的范围大,当将a赋值给b时,编译器会自动将a提升为long类型,然后赋值。而“a=b”的时候编译器报错,long的范围比int范围大,会有数据丢失,不安全。
(1),自动类型转换(隐式)
自动类型转换:代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。特点:数据范围小的转换为数据范围大的,就好比如上面的那个代码一样。
(2)强制类型转换(显式)
强制类型转换:当进行操作时代码需要经过一定的格式处理,不能自动完成。特点:数据范围 大的到数据范围小的。
上面举一个代码,就可以一目了然了!
5,类型提升
类型提升就是不同类型的数据之间相互运算时,数据类型小的会被提升到数据类型大的。
这个代码可以很好的理解,a在和b相加时,会先转换成long型。
再看上面这个byte和byte的运算,为什么会出错呢?
原因:由于计算机的CPU通常是按照4个字节为单位从内存中读写数据的。为了硬件上实现方便,像byte和short这种低于4个字节的类型,会先提升为int型,在参与运算。所以编译器在计算a+b的时候,编译器会先将a和b提升为int整型,再进行运算,得到的结果也是int型, 这时赋值给j(j是byte型),就会出错。
正确的写法应该是:
6,字符串类型(String类型先做简单的了解)
在Java中使用String类定义字符串类型,比如:
(1)int型转换为String型
(2)String型转换为int型
后记:如果上面的文章对你有用或者你觉得有用的,你可以点赞+关注+转发收藏,谢谢您对小博主的支持,我会持续更新的,关注小博主,学习Java不迷路!!谢谢!!