基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型。它们是我们编程中使用最频繁的类型,因此面试题中也总少不了它们的身影,在这篇文章中我们将从面试中常考的几个方面来回顾一下与基本类型相关的知识。
基本类型共有九种,它们分别都有相对应的包装类。关于它们的详细信息请看下表:
对于基本类型void以及它的包装类java.lang.Void,我们都无法直接进行操作。基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte、short、int、long、float、double。数值类型又可以分为整数类型byte、short、int、long和浮点数类型float、double。JAVA中的数值类型不存在无符号的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变。对于数值类型的基本类型的取值范围,我们无需强制去记忆,因为它们的值都已经以常量的形式定义在对应的包装类中了。请看下面的例子:
运行结果:
运算符对基本类型的影响
当使用+、-、*、/、%运算符对基本类型进行运算时,遵循如下规则:
当使用+=、-=、*=、/=、%=、运算符对基本类型进行运算时,遵循如下规则:
了解了这些,我们就能解答下面这个常考的面试题了。请看:
乍一看,觉得它们都应该没有错误,可以正常运行。我们来写个例子试试:
它们的返回值都是整数,且都采用四舍五入法。运算规则如下:
我们可以通过下面的例子来验证:
运行结果:
根据上面例子的运行结果,我们还可以按照如下方式总结,或许更加容易记忆:
switch语句
哪些类型可以用于switch语句的判断呢?我们做个测试就知道了:
运行结果如下:
结果已经出来了,我们来总结一下:
基本类型共有九种,它们分别都有相对应的包装类。关于它们的详细信息请看下表:
![](http://zangweiren.javaeye.com/upload/picture/pic/18450/8071c6c2-7cfb-3783-829a-a6abb3ae55e5.jpg)
对于基本类型void以及它的包装类java.lang.Void,我们都无法直接进行操作。基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte、short、int、long、float、double。数值类型又可以分为整数类型byte、short、int、long和浮点数类型float、double。JAVA中的数值类型不存在无符号的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变。对于数值类型的基本类型的取值范围,我们无需强制去记忆,因为它们的值都已经以常量的形式定义在对应的包装类中了。请看下面的例子:
- public class PrimitiveTypeTest {
- public static void main(String[] args) {
- int a = 123456;
- short b = (short) a;
- // b的值会是什么呢?
- System.out.println(b);
- }
- }
运行结果:
- -7616
运算符对基本类型的影响
当使用+、-、*、/、%运算符对基本类型进行运算时,遵循如下规则:
- 只要两个操作数中有一个是double类型的,另一个将会被转换成double类型,并且结果也是double类型;
- 否则,只要两个操作数中有一个是float类型的,另一个将会被转换成float类型,并且结果也是float类型;
- 否则,只要两个操作数中有一个是long类型的,另一个将会被转换成long类型,并且结果也是long类型;
- 否则,两个操作数(包括byte、short、int、char)都将会被转换成int类型,并且结果也是int类型。
当使用+=、-=、*=、/=、%=、运算符对基本类型进行运算时,遵循如下规则:
- 运算符右边的数值将首先被强制转换成与运算符左边数值相同的类型,然后再执行运算,且运算结果与运算符左边数值类型相同。
了解了这些,我们就能解答下面这个常考的面试题了。请看:
引用
short s1=1;s1=s1+1;有什么错?short s1=1;s1+=1;有什么错?
乍一看,觉得它们都应该没有错误,可以正常运行。我们来写个例子试试:
- public static int round(float a) {
- //other code
- }
- public static long round(double a) {
- //other code
- }
它们的返回值都是整数,且都采用四舍五入法。运算规则如下:
- 如果参数为正数,且小数点后第一位>=5,运算结果为参数的整数部分+1。
- 如果参数为负数,且小数点后第一位>5,运算结果为参数的整数部分-1。
- 如果参数为正数,且小数点后第一位<5;或者参数为负数,且小数点后第一位<=5,运算结果为参数的整数部分。
我们可以通过下面的例子来验证:
Java代码 <a title="复制代码" copytoclipboard',this);return="" false;"="" href="http://zangweiren.javaeye.com/blog/219369#" style="text-decoration: none; color: rgb(32, 107, 159);">
![复制代码](http://zangweiren.javaeye.com/images/icon_copy.gif)
- public class MathTest {
- public static void main(String[] args) {
- System.out.println("小数点后第一位=5");
- System.out.println("正数:Math.round(11.5)=" + Math.round(11.5));
- System.out.println("负数:Math.round(-11.5)=" + Math.round(-11.5));
- System.out.println();
- System.out.println("小数点后第一位<5");
- System.out.println("正数:Math.round(11.46)=" + Math.round(11.46));
- System.out.println("负数:Math.round(-11.46)=" + Math.round(-11.46));
- System.out.println();
- System.out.println("小数点后第一位>5");
- System.out.println("正数:Math.round(11.68)=" + Math.round(11.68));
- System.out.println("负数:Math.round(-11.68)=" + Math.round(-11.68));
- }
- }
运行结果:
- 小数点后第一位=5
- 正数:Math.round(11.5)=12
- 负数:Math.round(-11.5)=-11
- 小数点后第一位<5
- 正数:Math.round(11.46)=11
- 负数:Math.round(-11.46)=-11
- 小数点后第一位>5
- 正数:Math.round(11.68)=12
- 负数:Math.round(-11.68)=-12
根据上面例子的运行结果,我们还可以按照如下方式总结,或许更加容易记忆:
- 参数的小数点后第一位<5,运算结果为参数整数部分。
- 参数的小数点后第一位>5,运算结果为参数整数部分绝对值+1,符号(即正负)不变。
- 参数的小数点后第一位=5,正数运算结果为整数部分+1,负数运算结果为整数部分。
switch语句
哪些类型可以用于switch语句的判断呢?我们做个测试就知道了:
Java代码 <a title="复制代码" copytoclipboard',this);return="" false;"="" href="http://zangweiren.javaeye.com/blog/219369#" style="text-decoration: none; color: rgb(32, 107, 159);">
![复制代码](http://zangweiren.javaeye.com/images/icon_copy.gif)
- public class MathTest {
- // 枚举类型,Java5.0以上版本可用
- static enum enum_e {
- A, B
- }
- public static void main(String[] args) {
- // byte
- byte byte_n = 0;
- switch (byte_n) {
- case 0:
- System.out.println("byte可以用于switch语句");
- break;
- }
- // Byte类
- Byte byte_m = 0;
- // 需要Java5.0(1.5)以上版本支持
- switch (byte_m) {
- case 0:
- System.out.println("Byte类可以用于switch语句");
- System.out.println();
- break;
- }
- // char
- char char_n = 0;
- switch (char_n) {
- case 0:
- System.out.println("char可以用于switch语句");
- break;
- }
- // Character类
- Character char_m = 0;
- // 需要Java5.0(1.5)以上版本支持
- switch (char_m) {
- case 0:
- System.out.println("Character类可以用于switch语句");
- System.out.println();
- break;
- }
- // short
- short short_n = 0;
- switch (short_n) {
- case 0:
- System.out.println("short可以用于switch语句");
- break;
- }
- // Short
- Short short_m = 0;
- // 需要Java5.0(1.5)以上版本支持
- switch (short_m) {
- case 0:
- System.out.println("Short类可以用于switch语句");
- System.out.println();
- break;
- }
- // int
- int int_n = 0;
- switch (int_n) {
- case 0:
- System.out.println("int可以用于switch语句");
- break;
- }
- // Integer类
- Integer int_m = 0;
- // 需要Java5.0(1.5)以上版本支持
- switch (int_m) {
- case 0:
- System.out.println("Integer类可以用于switch语句");
- System.out.println();
- break;
- }
- // long
- long long_n = 0;
- // 编译错误,long型不能用于switch语句
- // switch (long_n) {
- // case 0:
- // System.out.println("long可以用于switch语句");
- // break;
- // }
- // Long类
- Long long_m = 0L;
- // 编译错误,Long类型不能用于switch语句
- // switch (long_m) {
- // case 0:
- // System.out.println("Long类可以用于switch语句");
- // System.out.println();
- // break;
- // }
- // float
- float float_n = 0.0F;
- // 编译错误,float型不能用于switch语句
- // switch (float_n) {
- // case 0.0F:
- // System.out.println("float可以用于switch语句");
- // break;
- // }
- // Float类
- Float float_m = 0.0F;
- // 编译错误,Float类型不能用于switch语句
- // switch (float_m) {
- // case 0.0F:
- // System.out.println("Float类可以用于switch语句");
- // System.out.println();
- // break;
- // }
- // double
- double double_n = 0.0;
- // 编译错误,double型不能用于switch语句
- // switch (double_n) {
- // case 0.0:
- // System.out.println("double可以用于switch语句");
- // break;
- // }
- // Double类
- Double double_m = 0.0;
- // 编译错误,Double类型不能用于switch语句
- // switch (double_m) {
- // case 0.0:
- // System.out.println("Double类可以用于switch语句");
- // System.out.println();
- // break;
- // }
- // boolean
- boolean bool_b = true;
- // 编译错误,boolean型不能用于switch语句
- // switch (bool_b) {
- // case true:
- // System.out.println("boolean可以用于switch语句");
- // break;
- // }
- // Boolean类
- Boolean bool_l = true;
- // 编译错误,Boolean类型不能用于switch语句
- // switch (bool_l) {
- // case true:
- // System.out.println("Boolean类可以用于switch语句");
- // System.out.println();
- // break;
- // }
- // String对象
- String string_s = "Z";
- // 编译错误,long型不能用于switch语句
- // switch (string_s) {
- // case "Z":
- // System.out.println("String可以用于switch语句");
- // System.out.println();
- // break;
- // }
- // enum(枚举类型,Java5.0以上版本可用)
- switch (MathTest.enum_e.A) {
- case A:
- System.out.println("enum可以用于switch语句-A");
- break;
- case B:
- System.out.println("enum可以用于switch语句-B");
- break;
- }
- }
- }
运行结果如下:
- byte可以用于switch语句
- Byte类可以用于switch语句
- char可以用于switch语句
- Character类可以用于switch语句
- short可以用于switch语句
- Short类可以用于switch语句
- int可以用于switch语句
- Integer类可以用于switch语句
- enum可以用于switch语句-A
结果已经出来了,我们来总结一下:
- byte、char、short、int四种基本类型以及它们的包装类(需要Java5.0/1.5以上版本支持)都可以用于switch语句。
- long、float、double、boolean四种基本类型以及它们的包装类(在Java所有版本中)都不能用于switch语句。
- enum类型,即枚举类型可以用于switch语句,但是要在Java5.0(1.5)版本以上才支持。
- 所有类型的对象(包括String类,但在Java5.0/1.5以上版本中,该项要排除byte、char、short、int四种基本类型对应的包装类)都不能用于switch语句。