Java编程中的一些细节(面试题)

一、类型运算细节

1、我们来看看下面两个代码:

代码一:

class Demo 
{
	public static void main(String[] args) 
	{
		byte b=4;
		b=3+7;
		System.out.println(b);
	}
}

运行结果:

代码二:

class Demo 
{
	public static void main(String[] args) 
	{
		byte b=4;
		byte b1=3;
		byte b2=7;
		b=b1+b2;
		System.out.println(b);
	}
}

运行结果:

代码一可以正常编译并且运行无误,而代码二,看起来貌似与代码一并没有多大的区别,却出现了编译错误,这究竟是为什么呢?

原因在于,第一个程序中,数字4系统默认为int类型,占用4个字节的内存空间,变量b为byte类型,占用1个字节的内存空间,能正常初始化的原因是Java系统中编译时,对数字4进行了判断,判断4的大小是否在1个字节的范围内,若是,则会对4进行默认强制转换为byte类型。而程序2中,因为b1,b2为变量,系统无法判断b1与b2的具体的大小,有可能b1+b2的结果会超出1个字节,因此会报错。

例如:我们都知道byte类型能保存的数据大小范围是-128~127,假设b1=125,b2=126,那么b1+b2的结果会大于byte类型的数据范围。

我们再来看看下一个程序。

class Demo 
{
	public static void main(String[] args) 
	{
		int a = 4;
		int a1 = 5;
		int a2 = 6;
		a = a1 + a2;
		System.out.println(a);
	}
}

运行结果:

我们可以看到,这段程序只是将第二个程序的byte类型,变成了int类型,代码就可以正常运行了,这又是为什么呢?

这是因为Java默认数据类型为int,因此不会报错,若数据计算结果大小超出4个字节,则会自动舍弃最高位,相应的,计算结果也会是负数。

二、运算符

1、%(取余运算):负数%正数——结果为负数;正数%负数——结果为正数。

由此可见,取余运算的结果的正负,由被取余数的正负确定。

2、+(连接符):

class Demo 
{
	public static void main(String[] args) 
	{
		System.out.println("5+5="+5+5);
	}
}

该程序的运行结果为:

出现该结果的原因是,字符串“5+5=”先和第一个5进行了连接,变成了字符串“5+5=5”然后在和第二个5进行连接,最终输出结果为“5+5=55”。

3、+=(赋值运算)

class Demo 
{
	public static void main(String[] args) 
	{
		short x=4;
		x+=3;//等式1
		x=x+3;//等式2
	}
}

这个程序在面试题中常见,面试官会问等式1和等式2有什么区别?

表面上看起来,两个等式没有区别,但是当我们分别注释掉一个,进行编译运行时,区别就可以显现出来了,等式1可以正常编译,而等式2会报错,这是为什么呢,因为等式1是一次运算,运算符为“+=”,赋值运算过程中系统会进行检查,并进行默认强制类型转换,等式2为两次运算,运算符“=”的右边出现了变量x,就会存在精度丢失,具体原因,和第一处讲解的原因相同。总体来说,代码中“x+=3”与“x=x+3”并不相等,因为等式1存在自动转换,所以,等式1相当于“x=(short)(x+3)”。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值