今天又看了会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,这就是表达式最终结果的类型。