Java与C/C++的区别(Thinking in Java)

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;
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值