浅析Java基本数据类型

作为一种强类型语言,Java针对每一种数据都定义了明确的数据类型。大体来讲可分为:基本数据类型和引用数据类型;在此,主要讨论前者,后者以后再继续探究。

Java基本数据类型分为四类八种:

	1: 整数类型		  占用字节数
		byte			1
		short			2
		int				4
		long			8
		
	2:浮点数类型
		float 			4
		double 			8
		
	3:字符类型
		char			2
		
	4:布尔类型
		boolean			1

请注意:

  1. 整数类型默认为int,在内存中占4个字节
  2. 浮点数类型默认为double,在内存中占8个字节
  3. 在声明long类型的数据时,建议添加后缀L
  4. 在声明float类型的数据时,建议添加后缀F
  5. 浮点数中double的精度高于float

不同类型的数据所占字节数也是不一样的,但是它们可以相互转换,请看下图:

这里写图片描述

请注意:

  • 左侧数据类型可自动转换至右侧数据类型,这也称为java数据类型自动转换(提升)
  • 右侧数据类型可强制转换为左侧数据类型;但是在该转换过程中可能造成数据的精度丢失
  • boolean类型数据不可与其他数据类型相互转换

现在我们来通过一些实例,进一步了解Java基本数据类型及其相互转换。

示例一:

public void test0(){
	char c='a';
	int i=9;
	int result=c+i;
	System.out.println(result);
	int int_a=c;
	System.out.println(int_a);
}

先来看字符char类型的数据。字符从本质上来讲是数字;它可以参与算术预算;故也可将char转换成int查看其对应的数值是什么。

示例二:

这里写图片描述

此处,我们想声明一个float类型的变量f用于保存小数123.45,但是IDE报错:

Type mismatch: cannot convert from double to float
不能将double转换为float类型

此处IDE给出了两个修改该错误的建议

第一种建议:将123.45转换为float,即:

float f=(float) 123.45;

这是为什么呢?其实,原因我们刚才已经讲过了:浮点数默认为double类型。所以,此时系统将123.45当做了double类型,故可将其强转为float类型,但是别忘了如此强转可能造成精度丢失

第二种建议:将变量f的类型改为double,即:

double f=123.45;

直接将f声明为double类型,用其来存储123.45是再合适不过的了。

示例三:

这里写图片描述

在该例子中定义了int i=5和byte b=7,再将两者相加赋值给byte类型的result;此时IDE报错:

Type mismatch: cannot convert from int to byte
不能将int类型转换为byte类型

与示例二非常类型,IDE也给出了两个建议,我们可遵循其建议进行修改。

好了,继续看一个例子。

示例四:

这里写图片描述

看到这里,或许就郁闷了:两个byte类型的数据相加再赋值给byte的变量也有错么??居然再次报错:

Type mismatch: cannot convert from int to byte

或许有的人会想:两个byte相加,其结果可能会大于byte的取值范围。这么想没啥错,但这是根本的原因么?继续往下看!

示例五:

这里写图片描述

看到此处,可能没有那么郁闷但是有点麻木了,为啥又报错了呢?

示例六:

这里写图片描述

这些错误的原因到底是什么呢?

当byte,char,short类型的变量参与算数运算时,JVM会首先将byte,char,short处理成32位长再进一步操作;也就是说JVM会将byte,char,short变量转换为int类型再继续运算。

关于Java基本数据类型参与+、-、*、/、%运算的时候请注意:

  • 整个算术表达式的数据类型会自动提升到与表达式中最高等级操作数相同的类型
  • 当使用+=、-=、*=、/=、%=、运算符对基本类型进行运算时,遵循如下规则:运算符右边的数值将首先被强制转换成与运算符左边数值相同的类型,然后再执行运算,且运算结果与运算符左边数值类型相同。

再来看个例子:

public void test7(){
	byte b1=3;
	byte b2=4;
	byte b3=b1+b2;		
	byte b4=3+4;
}

通过之前的讲解我们已经知道了:byte b3=b1+b2;会报错的
但是byte b4=3+4;为什么是对的呢?因为等号的右侧是两个常量相加并不是两个变量相加;就算写byte b4=300;明显超出byte的范围IDE也是不会报错的。变量所表示的值在运行时才会最终确定,而常量所表示的值在编译期间就已经确定了。


最后,附上文中的测试代码:

package cn.com;

/**
 * @Author 原创作者:谷哥的小弟
 * @Blog   博客地址:blog.csdn.net/lfdfhl   
 * @Time   2017年7月13日下午9:45:06
 * @Desc   测试java基本数据类型
 */
public class TestDataType {
	public static void main(String[] args) {
		String arch = System.getProperty("sun.arch.data.model");
		System.out.println(arch);
		TestDataType testDataType=new TestDataType();
		testDataType.test0();
	}
	
	public void test0(){
		char c='a';
		int i=9;
		int result=c+i;
		System.out.println(result);
		int int_a=c;
		System.out.println(int_a);
	}
	
	public void test1(){
		float f=123.45F;
	}
	
	public void test2(){
		int i=5;
		byte b=7;
		int result=i+b;
	}
	
	public void test3(){
		byte b1=4;
		byte b2=6;
		int b3=b1+b2;				
	}
	
	
	public void test4(){
		long l=5;
		double d=6;
		double result=l+d;
	}
	
	public void test5(){
		int i=9527;
		float f=12.35F;
		float result=i+f;
	}
	
	public void test6(){
		short s1=3;
		short s2=4;
		short s3=0;
		s3+=s1;
		System.out.println(s3);
	}
	
	public void test7(){
		byte b1=3;
		byte b2=4;
		int b3=b1+b2;		
		byte b4=3+4;
		
	}
	
	public void test8(){
		char c='A';
		int result=c+6;
		System.out.println(result);
	}
	
}

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谷哥的小弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值