java的四种基本数据类型,java语言中的八种基本数据类型
00-1010一、八种基本数据类型基础知识表二。直接数量和类型转换2.1,直接数量2.2,类型转换1。自动转换:低型到高型转换2。强制转换:高位类型到低位类型的转换,但是,数据可能会溢出或准确性可能会丢失。3.对应的打包类和使用3.1、基本介绍3.2、常用方法1:静态方法valueOf()3.3、常用方法2:静态方法parseXXX(String str)3.4、常用方法2:非静态方法XXXValue()3.5、自动拆箱打包3.6、valueOf()方法的源代码研究4、相关。
目录
一、八种基本数据类型常识
对于上图,有以下几点需要注意:
八种基本的java数据类型分为四类,即整型、浮点型、布尔型和字符型。八个是byte、short、int、long、float、double、boolean和char;八种基本java数据类型的字节数为3360,分别为1、2、4、8字节;1字节(byte,boolean),2字节(short,char),4字节(int,float),8字节(long,double);整数的默认类型是int,浮点数的默认类型是double;八种基本数据类型的打包类:除了char是字符,int是整数,其他都是首字母大写。需要注意的是,char是无符号的,不能是负数,所以从0开始;
基本常识表
00-1010整型的直接数量默认为int类型,浮点型的直接数量默认为double类型@ @ test public void d(){ int a=100=100;//这个100就是直接量a=a 100//但是这个a 100不是直接数量双b=3.14}
详解二、直接量与类型转换
如下图00-1010:可按箭头方向自动转换;
00-1010以上的现象在实践中会造成这三个问题:
类型转换@ test public void e(){ long a=200;//200是直接量,默认值是int类型。在这里,它被自动转换为get类型。/* longb=1000000000;*///100000000000是整数直接量,默认应该是int类型,但是超出了int类型long c=1000000000000L的范围;//整数直接量后面会放一个L,意味着直接量默认不再是int类型,而是long类型,所以没错。/*浮点d=34.3*///浮点直接量默认为double,double,是大类型,所以不能直接转换为floatfloat e=34.3f//在浮点直接量后面加一个F,表示直接量默认不再是double,是float类型的}以上是几种正常情况,但是有一种特殊情况,就是int直接量可以直接赋给byte,short,char变量,只要不超出变量类型的范围。
@ Test public void f(){ byte a=100;短b=200char c=100//注意char类型是int的一种特殊类型,可以写在单引号中。/*字节d=128直接量128超出了byte type *//*char e=-1的取值范围;直接数量-1不在数据运算中char type */}类型转换的范围内(1)当进行运算时,运算结果将被转换为更大的类型。
@ test public void g(){ int a=3;双b=4;system . out . println(a b);//输出7.0float c=3.2f/* c=c 3.14;编译错误,运算*/}(2)特殊:byte、short、char数据类型参与运算时,都会先转换成int类型;
@ test public void h(){ byte a=3;字节b=4;/*字节c=a b;*编译错误。这里字节型参与运算时,先直接转换成int型。*所以最终结果也是int类型,但是得到的结果不能称为int类型的直接量,所以编译错误* */int d=
a+b;}强制转换高等级转为低等级的时候,必须强制转换,但实际工作中不推荐使用强制转换,可能会失精度或数据溢出;
@Testpublic void j() {int a=128;byte b=(byte)a;System.out.println(b);//输出-128,出现了数据溢出double c=1.23;int d=(int)c;System.out.println(d);//输出1,精度丢失}
补充说明:不是只有强制转换的时候会出现数据,例如下面这种情况
@Testpublic void k() {int a=10000000;int b=10000000;int c=a*b;System.out.println(c);//输出276447232,得到的结果超出了int类型的范围,数据溢出}
三、对应包装类及使用
3.1、基本介绍
java是一门面向对象的语言,但是8中基本数据类型不具备面向对象的特征,所以实际使用中很不便所以为java八种基本数据类型提供了对应的包装类。
基本数据类型对应包装类包装类的父类bytejava.lang.Bytejava.lang.Numbershortjava.lang.Shortjava.lang.Numberintjava.lang.Integerjava.lang.Numberlongjava.lang.Longjava.lang.Numberfloatjava.lang.Floatjava.lang.Numberdoublejava.lang.Doublejava.lang.Numberbooleanjava.lang.Booleanjava.lang.Objectcharjava.lang.Characterjava.lang.Object对应包装类比较特殊的就是int对应的Integer和char对应的Character;对应包装类的直接父类:前6个由于是数,直接父类为Number,而后两个的直接父类就是Object类;
3.2、常用方法一:静态方法 valueOf()
参数为基本数据类型,返回包装类对象;参数为String字符串(Character类没有以String为 参数的该方法),返回包装类对象;
@Testpublic void a() {/*1.参数为基本数据类型 * 作用:将基本数据类型转换为对应包装类 * */Integer i=Integer.valueOf(10);System.out.println(i);//输出10/*2.参数为String字符串时, * 作用:返回指定字符串值的包装类对象 * */Integer a=Integer.valueOf("100");System.out.println(a);//输出100Integer b=Integer.valueOf("100a")为System.out.println(b);//运行错误,字符串的值不少一个int类型的}
3.3、常用方法二:静态方法parseXXX(String str)
Character类没有该方法;作用:将字符串装换为对应的基本数据类型(注意此处和上面的valueOf方法返回值的不同);
@Testpublic void b() {/*作用:将给定字符串装换为对应的基本数据类型 * 前提是该字符串必须正确描述该基本数据类型表示的值*/int a=Integer.parseInt("100");System.out.println(a);//输出100int b=Integer.parseInt("100a");System.out.println(b);//运行错误,字符串的值不为int类型}
3.4、常用方法二:非静态方法XXXValue()
因为是非静态方法,所以不能像上面两个方法用类名调用了;数字类的包装类(八种包装类中父类是Number的的六个类)才有该方法;作用:将当前包装类对象转换为对应的基本数据类型;
@Testpublic void c() {/*作用:将包装类对象转换为对应的基本数据类型*/Integer a=Integer.valueOf(100);//将基本数据类型转换为包装类对象int b=a.intValue();//将包装类对象转换为对应的基本数据类型System.out.println(b);//输出100Double c=Double.valueOf(2.33);double d=c.doubleValue();System.out.println(d);}
3.5、自动拆箱与装箱
简介:jdk1.5之后的新特性。该特性是编译器认可的,是在编译器自动将基本数据类型和包装类相互转换,节省了麻烦。
自动拆箱 包装类——>基本数据类型 (原理是调用了xxxValue方法)自动装箱 基本数据类型——>包装类 (原理是调用了valueOf方法)
@Testpublic void d() {/*自动装箱:valueOf*/Integer i=123;//原理是 Integer i=Integer.valueOf(123);/*自动拆箱*/int i1=i+1;//原理是int i1=i.intValue()+1;Integer a=123;Integer b=123;Integer c=a+b;/*原理为Integer c=Integer.valueOf(a.intValue()+b.intValue());*/}
3.6、关于valueOf()方法源码研究
通过按住Ctrl键,鼠标点击该方法即可查看源码,以Integer类的valueOf(int i)的源码为例
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
关于源码的理解:Integer类的valueOf(int i)方法首先会判断i是否在-128~127之间,如果在的话,就返回的对象是Integer类中静态数组cache中的对象,如果不是在这之间,就会重写创建一个新的对象。通过查看其它类的该方法的源码之后,可以得到该表:
包装类valueOf(X i)返回对象的原则Byte直接取,数组范围为(-128,127),且byte值的范围也是(-128,127)Short(-128,127)之间在数组中取,否则newInteger(-128,127)之间在数组中取,否则newLong(-128,127)之间在数组中取,否则newFloat直接newDouble直接newBoolean直接返回,不newCharacter0-127之间从数组中取,否则new
四、相关面试题
4.1、类型转换
注意一些喜欢忽视的类型转换
public static void main(String[] args) {int a=10;double b=3.4;System.out.println(a>b?a:b);System.out.println(a);}/*输出:10.0 10解析:这里是一个很容易让人不注意的类型转化,这里a与b参与了运算,所以类型向类型大的方向转化,10就变成了10.0,但是a本身是没有变化的*/
4.2、+=的情况
public static void main(String[] args) {short a=1;//第一行 a=a+1;//第二行 a+=1;//第三行}/*第几行的代码会出错?答案:第二行会出错,由于a+1变为了int类型,而int类型不能直接赋值给short类型但是+=这种情况是特殊的,所以不会出错;*/
4.3、自动装箱
包装类和基本数据类型比较时,只要值相等就相等
public static void main(String[] args) {Integer a1=127;Integer a2=127;int a3=127;Integer b1=128;Integer b2=128;int b3=128;System.out.println(a1==a2);System.out.println(a1==a3);System.out.println(b1==b2);System.out.println(b1==b3);}/*输出:true true false true解析:自动装箱时采用valueOf方法,由于127在静态数组的范围内,所以不是new的,而128的两个引用是指向new出现对象的,所以第一个是true,第三个是false。而包装类和基本数据类型比较时,只要数值是相等的,就相等*/
4.4、char类型存储汉字
char类型能不能存储一个汉字?为什么?
解析:能,char类型采用的是Unicode编码,Unicode编码包含汉字,所以char类型自然是可以存储一个汉字的
4.5、浮点数精度问题
public static void main(String[] args) {System.out.println(0.1*3==0.3);System.out.println(0.1*4);}/*输出:false 0.4解析:有些浮点数不能准确的表示出来,与整数相乘之后出精度丢失,常见为小数位含3的*/
到此这篇关于Java八种基本数据类型的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持盛行IT。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。