Thinking in Java 中文版翻译的比较刻板,很多时候将英文原版的语境上下文给忽略了。
主要列举出一些Java中有别于C++的并且可能引起歧义的语言规范。
1. 变量作用域屏蔽(隐藏)特性
如下所示例子:
public void function()
{
int a = 1;
{
int a = 2; //Illegal for java
}
}
变量a在函数中定义了两次,在C++中,上述函数代码是合法的,在内部语句块中的变量a会屏蔽掉外部定义的变量(a=1中的a),也就是说在C++中,拥有较大作用域的变量会被隐藏起来。但是上述代码在java中是错误的,错误信息为:Duplicate local variable x。
2. Java中不可将一个非布尔值当做布尔值在逻辑表达式中使用
如下:
int i = 1;
int j = 2;
if( i || j )
{
System.out.println("i and j");
}
if( i || j ) 在C++中是正确的,但是在Java中会有错误提示:
The operator || is undefined for the argument type(s) int, int 。
3. 无符号右移运算符">>>"
Java 相比较C++所特有的运算符。
4. Java中不存在sizeof()函数
在C/C++中sizeof()函数使用的最大的原因就是为了代码的移植,但是对于java语言而言,基本数据类型的定义对于所有的平台都是相同的,已经被设计在语言之中了,因此java不需要使用sizeof()获得类型的存储空间。
5. Java中不支持条件编译功能
在C里面条件便宜功能大多用来解决跨平台的问题,而Java本身运行与虚拟机上在语言上就解决了跨平台的问题。
调试功能也是条件编译的一个应用,即调试功能在开发过程中是开启的,但是在发布阶段则是禁用的。在Java中这一功能可以通过修改被导入的package的方法来实现这一目的,在开发阶段导入调试版的package包,在发布阶段导入发布版的package包。
6. 重载(overload)与重写(override)
在C++中不支持子类对父类函数的重载,但是在Java中却可以,如下:
package com.naruto.overloadride;
import static net.mindview.util.Print.*;
public class overloadridetest {
public static void main(String[] args) {
Bart b = new Bart();
b.doh(1);
b.doh('x');
b.doh(1.0f);
b.doh(new Milhouse());
}
}
class Milhouse {
}
class Homer {
public char doh(char ch) {
print("doh(char) in Homer: " + ch);
return ch;
}
public float doh(float f) {
print("doh(float) in Homer: " + f);
return f;
}
}
class Bart extends Homer {
public void doh(Milhouse m) {
print("doh(Milhouse) in Bart");
}
}
输出为:
doh(float) in Homer: 1.0
doh(char) in Homer: x
doh(float) in Homer: 1.0
doh(Milhouse) in Bart
Bart 类中的doh() 函数为一个对父类Homer()中doh(char)和doh(float)的重载,但是在C++中为了防止误解,仅允许对父类函数进行重写。在Java中允许对父类的函数同时进行重写与重载,此时Bart类可以改写为如下:
class Bart extends Homer {
public void doh(Milhouse m) { //重载函数overload
print("doh(Milhouse) in Bart");
}
public char doh(char ch) { //重写父类函数override
print("doh(char) in Bart: " + ch);
return ch;
}
}