(1)、JAVA 学习点滴、复合语句、表达式中的自动类型提升

本文对比了Java和PHP中变量的作用域概念及表达式中的自动类型提升机制,通过具体代码示例深入解析两者差异,旨在帮助开发者理解这两种语言在处理变量作用域和类型转换方面的独特之处。

今天又看了会JAVA。

脑海中一直觉得JAVA 就是一个框架,就如YII 框架。
提供了很多的类包提供给程序员们 使用。

不过看着看着,以PHP的编程经验就会觉得别扭!

java有复合语句的概念:

{

 //方法体
int a;
    a = 1321321//代码块

  System.out.println(a); }

如上所示,变量 a 是不能获取到的,程序编译会报错。
使用 {} 包起来的代码块 会生成一个作用域。

但PHP代码 :

{
$a = 13132;
}
 echo $a;

而如上的PHP代码却是可以直接访问到变量a的。

在PHP中,只有在类,方法和函数中有作用域的概念。

而在JAVA 中,只要是用{} 包裹住的代码,在其中定义的变量就会产生作用域。


如若要在外部访问到该变量a的运算结果,那么就应该在获取变量的同一级层中进行定义方可。



表达式中的自动类型提升:

除了赋值外,还有另外一个地方也可能会发生某些类型转换:在表达式中。为了分析其中的原因,考虑下面的情况。在表达式中,中间值要求的精度有时会超出操作数的范围。例如,检查下面的表达式:

byte a = 40;
byte b = 50;
byte c = 100;
int d = a * b / c;

中间部分a*b的结果很容易超出byte操作数的范围。为了解决这类问题,当对表达式求值时,Java自动将每个byte、short或char操 作数提升为int 类型。这意味着使用int 类型而不是byte类型执行子表达式a*b。因此,尽管a和b都被指定为byte类型,中间表达式(50*40)的结果2000是合法的。

尽管自动类型提升很有用,但是它们会导致编译时混淆错误。例如,下面的代码看起来是正确的,但是会导致问题: 

byte b = 50;
b = b * 2; // Error! Cannot assign an int to a byte!

上面的代码试图将50*2——一个完全有效的byte值——保存在一个byte变量中。但是,当计算表达式的值时,操作数被自动提升为int 类型,所以结果也被提升为int 类型。因此,现在表达式的结果是int 类型,如果不使用强制类型转换,就不能将结果赋给那个byte变量。尽管对于这个特定情况来说,所赋予的值仍然满足目标类型,但是仍然需要进行强制类型转 换。

如果能理解溢出产生的后果,就应当使用显式的强制类型转换,如下所示:

byte b = 50;
b = (byte)(b * 2);
 
这样就可以得到正确的值100。

类型提升规则

Java定义了几个应用于表达式的类型提升规则,如下所示:首先,正如刚才所描述的,所有byte、short和char类型的值都被提升为int 类型。然后,如果有一个操作数是long 类型,就将整个表达式提升为long 类型;如果有一个操作数是float 类型,就将整个表达式提升为float类型;如果任何一个操作数为double类型,结果将为double类型。

下面的程序演示了为了使第二个参数与每个二元运算符相匹配,如何提升表达式中的每个值:

class Promote {
public static void main(String args[]) {
byte b = 42;
char c = 'a';
short s = 1024;
int i = 50000;
float f = 5.67f;
double d = .1234;
double result = (f * b) + (i / c) - (d * s);
System.out.println((f * b) + " + " + (i / c) + " - " + (d * s));
System.out.println("result = " + result);
}
}

下面进一步分析程序中如下这行代码中的类型提升:

double result = (f * b) + (i / c) - (d * s);
 
在第一个子表达式f*b中,b被提升为float类型,并且该子表达式的结果也是float类型。接下来在子表达式i/c 中,c被提升为int 类型,并且结果也是int 类型。然后在d*s中,s的值被提升为double类型,并且该子表达式的类型为double。最后考虑三个中间值的类型——float、int 和double。float加上int 的结果是float。之后,作为结果的float减去最后的double,会被提升为double,这就是表达式最终结果的类型。

转载于:https://www.cnblogs.com/phpdragon/archive/2013/01/07/2848481.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值