Java中的变量其实与C语言中的变量还是有些许差别的;原因就是Java是静态强类型语言,而C语言为静态弱类型语言。
强/弱类型语言的区别主要在于类型之间的转换上。强类型的语言中不同类型之间的转换限制的很严格,而弱类型的语言则不严格。
如基本类型之间的区别:
int / double 之间的转换问题
int a = 10;
int c = 15;
double b = 20.0;
a = b;
b = c;
printf("%d\n",a);
printf("%d\n",b);
system("pause");
return 0;
上述是C语言的代码,其中包括了int向double赋值与double向Int赋值;其中double向int赋值属于范围大的向范围小的赋值,这时候就存在因为存储大小不同(除了个别机器int存在16位情况,大部分是32位的),其中int大部分是4字节,double是8字节;大的转换成小的就存在截断的问题,即大的高范围高位部分,小范围没有该范围,就无法表示出来,这时候C语言就会截断并发出警告,注意这里是警告而不是异常或者直接出错,结果是截断后的结果。
而Java就不会出现上面的截断问题,Java一旦发现,高范围的赋值给低范围变量的情况出现就会直接报出异常,而不是如C语言继续运行。
int a = 10;
double b = 20.0;
a = b;
System.out.println(a);
异常部分:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from double to int
其中低范围向高范围赋值不存在异常问题。
Java的变量:
Java的数据类型基本分为:基本数据类型和引用数据类型
其中数据类型包括:数值型、字符型、布尔型
数值型可以分为:整形和浮点型
整形包含:byte、short、int、long
浮点型包含:float、double
字符型:char(默认值为'\u0000') 其中\u0000 表示的是unicode码表中的nul
布尔型:boolean(默认值为false)
引用数据类型包括:数组、类、接口等(默认值为null)
变量部分主要需要注意的就是隐式类型转换与类型提升的问题;
隐式类型转换:
就是在基本的同一个小框架下,如数值型之间不同范围的类型之间的隐式转换,这里的转换基本是向着范围更大的方向发展;如double 与 int 两个类型相加其结果暗中就变成了double类型,如果这个时候结果输出给了一个int类型那么就会出现类型错误的问题。
int a = 10;
double b = 20.0;
int c = a + b;
System.out.println(c);
异常:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from double to int
类型提升:
类型提升问题只存在于小于int范围的数值型类型,即byte、short存在该种情况
这时候如果两个byte类型或者两个short类型相加减乘除的时候,最终结果就会变成int的类型,这就是类型提升;因为数据的取大部分都是以4个字节的方式进行的。
Java的运算符
运算符包含:算术运算符、逻辑运算符、关系运算符、位运算符、条件运算符、移位运算符等
算术运算符:基本四则运算、增量赋值运算符、自增/自减运算符
基本四则运算包含:+ - * / % 其中%与C语言略微不同,其它相同;Java中的%,不仅可以对int求模也可以对double求模运算。
逻辑运算符:&& || ! 这里的逻辑运算与C语言的逻辑运算不同;Java中的逻辑运算操作数和返回值类型都是boolean类型的。相同点在于&& || 具有短路求值的属性。
关系运算符:== != < > <= >= 操作符与C语言类似,而返回值类型就是boolean类型
位运算符:& | ~ ^ 位运算是按照二进制位进行的;这里需要注意的是按位与 与 按位或 ,其可以视作按位操作也可以视作逻辑运算,区别在于他们的操作数的类型;如果操作数的类型是Boolean的类型,那么可以看作是逻辑与 或者 逻辑或运算,不过此时不具有短路求值的属性。当然,如果操作数是整形,那么就看作是按位运算,这个时候按位运算是按照二进制位进行的。
条件运算符:条件运算符只有一个三目运算符; 表达式1 ? 表达式2 : 表达式3
移位运算符:左移操作 与 右移操作
左移操作 << : 做左侧位不要,最右侧补0;即 最高为扔掉,最低为补0
右移操作分为 逻辑右移(无符号右移) 与 算术右移(右移)
逻辑右移 >>>:最右侧位不要,做左侧补0
算术右移 >>: 最右侧位不要,最左侧补符号位(正数补0,负数补1)