java 基础答疑

问 什么是Java 的字节码?
答 它是程序的一种低级表示,可以运行于Java 的虚拟机。将程序抽象为字节码可以保证Java 程序员的
代码能够运行在各种设备之上。


问 Java 允许整型溢出并返回错误值的做法是错误的。难道Java 不应该自动检查溢出吗?
答 这个问题在程序员中一直是有争议的。简单的回答是它们之所以被称为原始数据类型就是因为缺乏
此类检查。避免此类问题并不需要很高深的知识。我们会使用int 类型表示较小的数(小于10 个十
进制位)而使用long 表示10 亿以上的数。


问 Math.abs(-2147483648) 的返回值是什么?
答 -2147483648。这个奇怪的结果(但的确是真的)就是整数溢出的典型例子。


问 如何才能将一个double 变量初始化为无穷大?
答 可以使用Java 的内置常数:Double.POSITIVE_INFINITY 和Double.NEGATIVE_INFINITY。


问 能够将double 类型的值和int 类型的值相互比较吗?
答 不通过类型转换是不行的,但请记住Java 一般会自动进行所需的类型转换。例如,如果x 的类型是
int且值为3,那么表达式(x<3.1)的值为true——Java 会在比较前将x转换为double类型(因为3.1是一个double 类型的字面量)。


问 如果使用一个变量前没有将它初始化,会发生什么?
答 如果代码中存在任何可能导致使用未经初始化的变量的执行路径,Java 都会抛出一个编译异常。


问 Java 表达式1/0 和1.0/0.0 的值是什么?
答 第一个表达式会产生一个运行时除零异常(它会终止程序,因为这个值是未定义的);第二个表达
式的值是Infinity(无穷大)。


问 能够使用< 和> 比较String 变量吗?
答 不行,只有原始数据类型定义了这些运算符。请见1.1.2.3 节。


问 负数的除法和余数的结果是什么?
答 表达式a/b 的商会向0 取整;a % b 的余数的定义是(a/b)*b + a % b 恒等于a。例如-14/3 和
14/-3 的商都是-4,但-14 % 3 是-2,而14 % -3 是2。


问 为什么使用(a && b) 而非(a & b) ?
答 运算符&、| 和^ 分别表示整数的位逻辑操作与、或和异或。因此,10|6 的值为14,10^6 的值为
12。在本书中我们很少(偶尔)会用到这些运算符。&& 和|| 运算符仅在独立的布尔表达式中有效,
原因是短路求值法则:表达式从左向右求值,一旦整个表达式的值已知则停止求值。


问 嵌套if 语句中的二义性有问题吗?
答 是的。在Java 中,以下语句:
if <expr1> if <expr2> <stmntA> else <stmntB>
  等价于:
if <expr1> { if <expr2> <stmntA> else <stmntB> }
  即使你想表达的是:
if <expr1> { if <expr2> <stmntA> } else <stmntB>
避免这种“无主的”else 陷阱的最好办法是显式地写明所有大括号。

问 一个for 循环和它的while 形式有什么区别?
答 for 循环头部的代码和for 循环的主体代码在同一个代码段之中。在一个典型的for 循环中,递
增变量一般在循环结束之后都是不可用的;但在和它等价的while 循环中,递增变量在循环结束
之后仍然是可用的。这个区别常常是使用while 而非for 循环的主要原因。


问 有些Java 程序员用int a[] 而不是int[] a 来声明一个数组。这两者有什么不同?
答 在Java 中,两者等价且都是合法的。前一种是C 语言中数组的声明方式。后者是Java 提倡的方式,
因为变量的类型int[] 能更清楚地说明这是一个整型的数组。

 

问 为什么数组的起始索引是0 而不是1 ?
答 这个习惯来源于机器语言,那时要计算一个数组元素的地址需要将数组的起始地址加上该元素的索
引。将起始索引设为1 要么会浪费数组的第一个元素的空间,要么会花费额外的时间来将索引减1。


 

问 如果a[] 是一个数组, 为什么StdOut.println(a) 打印出的是一个十六进制的整数, 

比如@f62373,而不是数组中的元素呢?
答 问得好。该方法打印出的是这个数组的地址,不幸的是你一般都不需要它。


 

问 我们为什么不使用标准的Java 库来处理输入和图形?
答 我们的确用到了它们,但我们希望使用更简单的抽象模型。StdIn 和StdDraw 背后的Java 标准库是
为实际生产设计的,这些库和它们的API 都有些笨重。要想知道它们真正的模样,请查看StdIn.java
和StdDraw.java 的代码。


 

问 我的程序能够重新读取标准输入中的值吗?
答 不行,你只有一次机会,就好像你不能撤销println() 的结果一样。


 

问 如果我的程序在标准输入为空之后仍然尝试读取,会发生什么?
答 会得到一个错误。StdIn.isEmpty() 能够帮助你检查是否还有可用的输入以避免这种错误。


 

问 这条出错信息是什么意思?
Exception in thread "main" java.lang.NoClassDefFoundError: StdIn
答 你可能忘记把StdIn.java 文件放到工作目录中去了。


 

问 在Java 中,一个静态方法能够将另一个静态方法作为参数吗?
答 不行,但问得好,因为有很多语言都能够这么做。

 

转自《算法(第4版)》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值