Java答疑
1、什么是Java的字节码?
答:它是程序的一种低级表示,可以运行Java的虚拟机。将程序抽象为字节码可以保证Java程序员的代码能够运行在各种设备之上。
2、Java允许整型溢出并返回错误值的做法是错误的。难道Java不应该自动检查溢出吗?
答:这个问题一直是有争议的。简单的说是它们之所以被称为原始数据类型就是因为缺乏此类检查。避免此类问题并不需要很高深的知识。我们会使用int类型表示较小的数(小于10个十进制位)而使用long表示10亿以上的数。
3、 Math.abs(-2147483648)的返回值是什么?
答:-2147483648。这个奇怪的结果(但的确是真的)就是整数溢出的典型例子。
4、如何才能将一个double变量初始化为无穷大?
答:可以使用Java的内置常数:Double.POSITIVE_INFINITY和Double.NEGATIVE_INFINITY。
5、能够将double类型的值和int类型的值相互比较吗?
答:不通过类型转换是不行的,但请记住Java一般会自动进行所需的类型转换。例如:如果x的类型是int且值为3,那么表达式(x<3.1)的值为true----Java会在比较前将x转换为double类型(因为3.1是一个double类型的字面量)。
6、如果使用一个变量前没有将它初始化,会发生什么?
答:如果代码中存在任何可能导致使用未经初始化的变量执行路径,Java都会抛出一个编译异常。
7、Java表达式1/0和1.0/0.0的值是什么?
答:第一个表达式会产生一个运行时除以零异常(它会终止程序,因为这个值是未定义的);第二个表达式的值是Infinity(无穷大)。
8、能够使用<和>比较String变量吗?
答:不行,只有原始数据类型定义了这些运算符。
9、负数的除法和余数的结果是什么?
答:表达式a/b的商会向0取整;a%b的余数的定义是(a/b)*b+a%b恒等于a。例如:-14/3和14/-3的商都是-4,但-14%3是-2,而14%-3是2。
10、为什么使用(a&&b)而非(a&b)?
答:运算符&、|、和^分别表示整数的位逻辑操作与、或和异或。因此10|6的值为14,10^6的值为12。&&和||运算符仅在独立的布尔表达式中有效,原因是短路求值法则:表达式从左向右求值,一旦整个表达式的值已知则停止求值。
11、嵌套if语句中的二义性有问题吗?
答:是的。在Java中,以下语句:
if if else
等价于:
if {if else}。
如果你想表达的是:
if {if }else
要避免这种“无主的”else陷阱最好的办法是显示地写明所有的大括号。
12、一个for循环和它的while形式有什么区别?
答:for循环头部的代码和和for循环的主体代码同在一个代码断中。在一个典型的for循环中,递增变量一般在循环结束之后都是不可用的;但在它等价的while循环中,递增变量循环结束之后仍然是可用的。这个区别往往是使用while而非for循环的主要原因。
13、用int a[]而不是int [] a来声明数组有什么不同?
答:在Java中,两者等价且都合法。前一种是C语言中数组的声明方式。后者是Java提倡的方式,因为变量的类型int[]能更清楚的说明这个是一个整型的数组。
14、为什么数组的初始索引是0而不是1?
答:这个习惯来源于机器语言。那时计算一个数组元素的地址需要将数组的起始地址加上改元素的索引。将起始索引设为1那么会浪费数组的第一个元素的空间那么要华得额外的时间将索引减1。
15、如果a[]是一个数组,为什么StdOut.println(a)打印出来的是一个十六进制的整数?
答:该方法打印出来的是这个数组的地址。
16、我们为什么不用标准的Java库来处理输入和图形?
答:我们的确都用到了它们了,但更希望用到的是更为简单的抽象模型。
17、抽象能够重新读取标准输入中的值吗?
答:不行,只有一次机会。就好像你不能撤销println()的结果一样。
18、如果程序在标准输入为空之后仍然尝试读取,会发生什么?
答:会得到一个错误。StdIn.isEmpty()能够帮助你检查是否还有可用的输入以避免这种错误。
19、“”Exception in thread "main" java.lang.NoClassDefFoundError:StdIn”这句话是什么意思?
答:可以是忘记把StdIn.java文件放到工作目录上去了。
20、在Java中,一个静态方法能够将另一个静态方法作为参数吗?
答:不行。但其实很多语言是可以这么做的。