Java中的八种基本数据类型详解

目录
  • 一、八种基本数据类型常识
    • 基本常识表
  • 详解二、直接量与类型转换
    • 2.1、直接量
    • 2.2、类型转换
      • 1.自动转换:低类型的向高类型的转换
      • 2.强制转换:高类型的向底类型转换,但可能会数据溢出或者精度丢失
  • 三、对应包装类及使用
    • 3.1、基本介绍
    • 3.2、常用方法一:静态方法 valueOf()
    • 3.3、常用方法二:静态方法parseXXX(String str)
    • 3.4、常用方法二:非静态方法XXXValue()
    • 3.5、自动拆箱与装箱
    • 3.6、关于valueOf()方法源码研究
  • 四、相关面试题
    • 4.1、类型转换
    • 4.2、+=的情况
    • 4.3、自动装箱
    • 4.4、char类型存储汉字

一、八种基本数据类型常识

基本常识表

对于上图有以下几点需要注意:

  • java八种基本数据类型分为四类八种,四类分别为整型、浮点型、布尔型、字符型;八种分别为byte、short、int、long、float、double、boolean、char;
  • java八种基本数据类型的字节数:分别为1、2、4、8个字节;1字节(byte、boolean)、 2字节(short、char)、4字节(int、float)、8字节(long、double);
  • 整数的默认类型为int,浮点数的默认类型为double;
  • 八种基本数据类型的包装类:除了char的是Character、int类型的是Integer,其他都是首字母大写
  • 关于值的范围问题,需要注意char类型是无符号的,不能为负,所以是0开始的;

详解二、直接量与类型转换

2.1、直接量

  • 整数型的直接量默认为int类型
  • 浮点型的直接量默认为double类型
@Test
	public void d() {
		int a=100;//这个100就是直接量
		a=a+100;//但是这个a+100不是直接量
		double b=3.14;
	}

2.2、类型转换

1.自动转换:低类型的向高类型的转换

如下图:顺着箭头的方向是可以自动转换的;

2.强制转换:高类型的向底类型转换,但可能会数据溢出或者精度丢失

以上现象在实际中可以出现这三种问题:

  • 定义变量时出现的类型转换
@Test
	public void e(){
		long a=200;//200是直接量,默认为int类型这里是自动转换为弄类型

		/*long b=100000000000;*/
		//100000000000是个整数直接量,默认应该为int类型,但是超出了int类型的取值范围

		long c=1000000000000L;
		//在整数直接量后面将了一个L,表示该直接量不再默认为int类型,为long类型,所以没错

		/*float d=34.3;*/
		//浮点型直接量默认为double,double类型大,所以不能直接转换为float

		float e=34.3f;
		//在浮点数直接量后面加上一个f,表示该直接量不再默认为double,为float类型
	}

以上为几种正常的情况,但是有一种特殊的情况,就是int型直接量可以直接赋给byte、short、char类型变量,只要不超出变量类型的取值范围

@Test
	public void f() {
		byte a=100;
		short b=200;
		char c=100;//注意char类型是一种特殊的int类型,可以不用写成单引号括起来的

		/*byte d=128;直接量128超出了byte类型的取值范围*/

		/*char e=-1;直接量-1不在char类型的取值范围内*/

	}
  • 数据运算时的类型转换

(1)运算时,运算结果会向较大的类型转换

@Test
	public void g() {
		int a=3;
		double b=4;
		System.out.println(a+b);//输出7.0

		float c=3.2f;
		/*c=c+3.14; 编译错误,运算之后变为double类型*/
	}

(2)特殊的:byte、short、char三种数据类型参与运算时,先一律转化为int类型;

	@Test
	public void h() {
		byte a=3;
		byte b=4;
		/*byte c=a+b;
		 * 编译错误,此处由于byte类型参与运算时,先直接转换为int类型,
		 * 所以最后的结果也是int类型,但是得出的结果不能叫做int类型的直接量,所以编译错误
		 * */
		int d=a+b;
	}
  • 强制转换

高等级转为低等级的时候,必须强制转换,但实际工作中不推荐使用强制转换,可能会失精度或数据溢出;

@Test
	public 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,精度丢失
	}

补充说明:不是只有强制转换的时候会出现数据,例如下面这种情况

@Test
	public void k() {
		int a=10000000;
		int b=10000000;
		int c=a*b;
		System.out.println(c);//输出276447232,得到的结果超出了int类型的范围,数据溢出
	}

三、对应包装类及使用

3.1、基本介绍

java是一门面向对象的语言,但是8中基本数据类型不具备面向对象的特征,所以实际使用中很不便所以为java八种基本数据类型提供了对应的包装类。

基本数据类型 对应包装类 包装类的父类
byte java.lang.Byte java.lang.Number
short java.lang.Short java.lang.Number
int java.lang.Integer java.lang.Number
long java.lang.Long java.lang.Number
float java.lang.Float java.lang.Number
double java.lang.Double java.lang.Number
boolean java.lang.Boolean java.lang.Object
char java.lang.Character java.lang.Object
  • 对应包装类比较特殊的就是int对应的Integer和char对应的Character;
  • 对应包装类的直接父类:前6个由于是数,直接父类为Number,而后两个的直接父类就是Object类;

3.2、常用方法一:静态方法 valueOf()

  • 参数为基本数据类型,返回包装类对象;
  • 参数为String字符串(Character类没有以String为 参数的该方法),返回包装类对象;
@Test
	public void a() {
	/*1.参数为基本数据类型
	 * 作用:将基本数据类型转换为对应包装类 * */
		Integer i=Integer.valueOf(10);
		System.out.println(i);//输出10

	/*2.参数为String字符串时,
	 * 作用:返回指定字符串值的包装类对象
	 * 	*/
		Integer a=Integer.valueOf("100");
		System.out.println(a);//输出100

		Integer b=Integer.valueOf("100a")为
		System.out.println(b);//运行错误,字符串的值不少一个int类型的

	}

3.3、常用方法二:静态方法parseXXX(String str)

  • Character类没有该方法;
  • 作用:将字符串装换为对应的基本数据类型(注意此处和上面的valueOf方法返回值的不同);
@Test
	public void b() {
		/*作用:将给定字符串装换为对应的基本数据类型
		 * 前提是该字符串必须正确描述该基本数据类型表示的值*/
		int a=Integer.parseInt("100");
		System.out.println(a);//输出100

		int b=Integer.parseInt("100a");
		System.out.println(b);//运行错误,字符串的值不为int类型

	}

3.4、常用方法二:非静态方法XXXValue()

  1. 因为是非静态方法,所以不能像上面两个方法用类名调用了;
  2. 数字类的包装类(八种包装类中父类是Number的的六个类)才有该方法;
  3. 作用:将当前包装类对象转换为对应的基本数据类型;
@Test
	public void c() {
		/*作用:将包装类对象转换为对应的基本数据类型*/

		Integer a=Integer.valueOf(100);//将基本数据类型转换为包装类对象
		int b=a.intValue();//将包装类对象转换为对应的基本数据类型
		System.out.println(b);//输出100

		Double c=Double.valueOf(2.33);
		double d=c.doubleValue();
		System.out.println(d);
	}

3.5、自动拆箱与装箱

简介:jdk1.5之后的新特性。该特性是编译器认可的,是在编译器自动将基本数据类型和包装类相互转换,节省了麻烦。

  • 自动拆箱 包装类——>基本数据类型 (原理是调用了xxxValue方法)
  • 自动装箱 基本数据类型——>包装类 (原理是调用了valueOf方法)
@Test
	public 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)之间在数组中取,否则new
Integer (-128,127)之间在数组中取,否则new
Long (-128,127)之间在数组中取,否则new
Float 直接new
Double 直接new
Boolean 直接返回,不new
Character 0-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八种基本数据类型的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

随机推荐

  • PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
  • linux下mysql开启远程访问权限 防火墙开放3306端口
  • SQLServer 2008中的代码安全(七) 证书加密
  • 用QuickWAP组件结合ASP建设Wap站点第1/2页
  • MD和RD命令的使用方法
  • Redis 集成Spring的示例代码(spring-data-redis)
  • 使用Java构造和解析Json数据的两种方法(详解二)
  • python连接sql server乱码的解决方法
  • Linux Shell脚本面试25问集合
  • Collections工具类_动力节点Java学院整理
  • JDBC SQL语法
  • 基于jquery的cookie的用法
  • 推荐40个简单的 jQuery 导航插件和教程(下篇)
  • 通过$(this)使用jQuery包装后的方法或属性
  • Java日期时间操作的方法
  • php使用curl判断网页404(不存在)的方法 原创
  • php实现保存submit内容之后禁止刷新
  • PHP unlink与rmdir删除目录及目录下所有文件实例代码
  • 详解webpack-dev-server的简单使用
  • MyBatis SQL xml处理小于号与大于号正确的格式

玻璃钢生产厂家商场美陈制作周期兰州人物玻璃钢雕塑定制清尚雕塑玻璃钢作品福禄临门佛山玻璃钢卡通雕塑包括哪些玻璃钢花盆工艺品厂贺州园林玻璃钢雕塑定制内江玻璃钢卡通雕塑厂家玻璃钢军人雕塑玻璃钢花盆经销商金华玻璃钢雕塑制作玻璃钢鹿雕塑加工淮安东安玻璃钢雕塑报价明细表晋城优质玻璃钢仿铜雕塑厂家平顶山珠海玻璃钢雕塑上海环保玻璃钢雕塑制作鹤壁房地产水景玻璃钢雕塑公司山东景区玻璃钢雕塑生产厂家株洲玻璃钢雕塑生产厂家玻璃钢雕塑怕雨吗卫滨玻璃钢雕塑定制西安 玻璃钢花盆玻璃钢石头效果雕塑济南户内玻璃钢雕塑生产厂家上海玻璃钢卡通雕塑阿狸报价江门玻璃钢卡通雕塑厂家上海中庭商场美陈哪里有河北玻璃钢雕塑制作玻璃钢仿石雕塑图片吉林商场美陈保定玻璃钢雕塑售价香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化