Java最大的竞争对手是谁?

Java的不断发展要归功于C、C++ 和C# 等编程语言的不断挑战。C++、C#和Java等编程语言基本上都来源于C语言但又有很多区别。业内人士经常将C比作爷爷,C++比做儿子,C# 和Java等语言比作孙子。对于变量声明、参数传递、操作符、流控制等,Java使用了和C、C++、C# 相同的传统,而C++ 主要是对C的扩展并融入了面向对象的思想,C#和Java语言是纯粹的面向对象的编程语言并吸收了C、C++ 语言的很多优点,摒弃了很多缺点,但C#编程语言的运行依赖于Windows平台,而Java语言不依赖于任何平台,因此使得熟悉C、C++、C#的程序员能够很方便地转向Java编程。具体描述有如下几点。

  1. Java与C、C++对比

1) 全局变量

在Java编程的过程中,不能在类之外定义全局变量,如:

public String name;             //错,不能在类之外定义全局变量 public class GlobalVar{     public static global_var;   //全局变量也叫成员变量或成员属性  } 

要定义全局变量,只能通过在一个类中定义公用、静态的变量来实现一个全局变量。在类GlobalVar中定义变量global_var为public static,使得其他类可以访问和修改该变量。Java对全局变量进行了更好的封装。而在C和C++ 中,依赖于不加封装的全局变量常常造成系统的崩溃。

2) 剔除goto关键字

虽然在Java中将关键字goto保留了,但是Java不支持C、C++ 中的goto语句,而是通过异常处理语句try、Catch、final等来代替C、C++ 中用goto语句来处理遇到错误时跳转的情况,使程序更易读且更结构化。

3) 良好的指针控制

指针是C、C++ 编程语言中最有魅力的特性,但它的超高使用难度加上超高灵活性,使得大部分程序员望而止步,在学习C、C++ 语言进行编程的过程中,通过指针所进行的内存地址操作常常会造成不可预知的错误,同时通过指针对某个内存地址进行显式类型转换后,可以访问一个C或C++ 中的私有成员,从而破坏安全性,造成系统的崩溃。而Java语言对指针进行完全的控制,程序员不能直接进行任何指针操作,例如把整数转化为指针,或者通过指针释放某一内存地址等。同时,数组作为类在Java中实现,较好地解决了数组访问越界这一问题。

4) 自动内存回收

一般内存资源有限,很容易被程序破坏。在C中,程序员通过库函数malloc()和free()来分配和释放内存,在C++ 中则通过运算符new和delete来分配和释放内存。再次释放已释放的内存块或未被分配的内存块,会造成系统的崩溃;同样,忘记释放不再使用的内存块也会逐渐耗尽系统资源。而在Java中,所有的数据结构都是对象,通过运算符new为它们分配内存堆。通过运算符new可以得到对象的处理权,而实际分配给对象的内存可能随程序运行而改变,Java对此自动地进行管理并且进行垃圾收集,有效防止了由于程序员的误操作而导致的错误,并且更好地利用了系统资源。

5) 固定的数据类型

在C、C++ 语言中不同数据类型在不同的平台上所占的位数不一样,例如,int类型的数据在IBM PC中占16位,在VAX-II中占32位,这就导致了代码的不可移植性。但在Java中,对于这些数据类型都采用国际统一字符编码,即分配固定长度的位数,例如,对int类型的数据,它在任何机器上都占32位,这就保证了Java的平台无关性。

6) 严格控制数据类型转换

一种数据类型的数据转换成另外一种数据类型的数据时,常常会出现数据精度丢失的问题,在C、C++ 中,通过指针进行任意的数据类型转换极不安全,而在Java中,运行时系统对对象的处理要进行类型相容性检查,以防止不安全的转换。

7) 库文件

编程语言中丰富的库文件能快速地开发出各种应用软件。C、C++ 中用头文件来声明类的原型以及全局变量、库函数等,在大的系统中,维护这些头文件是很困难的。而Java不支持头文件,类成员的类型和访问权限都封装在一个类中,运行时系统对访问进行控制,防止对私有成员的操作。同时,Java中用import语句来与其他类进行通信,以便使用它们的方法。

8) 类与结构体和联合体

安全是一个永恒的话题。C、C++ 中的结构体和联合体中的所有成员均为公有,这就带来了安全性问题。Java中不包含结构体和联合体,所有的内容都封装在类中。

其实Java与C、C++ 编程语言还有很多的差别如:速度、内部类、方法嵌入等,但总的来说Java提取了很多其他编程语言的优点,使它更适合于大众程序员的需求。

2. Java与C# 对比

Java语言是开放式的世界语言,基本源代码都公开,而C# 作为Microsoft的一门主打语言也不甘示弱。一个开源,一个收费,它们两者基本上都对C、C++ 深涩的语法和语义进行了改进。在语法方面,两者都摒弃了const修饰、宏替换等;在继承方面,两者都采用更易于理解的单继承和多接口实现方案;在源代码组织方面,两者都提出了声明与实现于一体的逻辑封装。

Java与C# 的不同点主要体现在:C# 在Microsoft的支撑下提供了强大的Visual Studio开发平台,可以极好地提高C# 程序的开发效率。而且C#更善于利用Windows平台。Java的设计宗旨是独立于任何平台,因此自然不会提供太多的Windows特性。但这也正体现了Java语言的跨平台优势。一般企业级应用,无法确定这个应用是在怎样的平台上运行。因而企业级开发一般选择Java作为开发语言。

本文转自:http://book.51cto.com/art/200909/151643.htm

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-08-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏散尽浮华

数组-在Shell脚本中的基本使用介绍

Shell脚本在运维工作中是极其重要的,而数组在shell脚本里的运用无论是在循环或运算方面都是非常实用的一个环节。 下面是对shell脚本中数组方面一些操作在...

1649
来自专栏tkokof 的技术,小趣及杂念

Sweet Snippet 系列之 Lua表排序

  作为Lua中实现各类数据结构的基石,表的使用想必是贯穿于整个项目的开发过程之中,其中对表内容的排序想必亦是常见的需求之一,Lua内置的Table函数库便提供...

624
来自专栏Java面试笔试题

Error和Exception有什么区别?(还在总结)

Error表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的情况;Except...

632
来自专栏程序员互动联盟

【编程基础】C++ Primer快速入门六:数组和指针

我们知道,C语言以及早期的面向结构的语言几乎都支持数组定义,比如整形数组int 女神[2],表示有俩数: 女神[0], 女神[1],她们都是整数。 C++ 语言...

35810
来自专栏java一日一条

提高代码质量:如何编写函数

函数是实现程序功能的最基本单位,每一个程序都是由一个个最基本的函数构成的。写好一个函数是提高程序代码质量最关键的一步。本文就函数的编写,从函数命名,代码分布,技...

652
来自专栏吴小龙同學

关于Android命名规范

第一家公司是如此的重要,如果开发流程规范,对你之后的影响不是一般的大!而我经历的公司大都不成体系,我的习惯就是我的规范!哈哈! 很多的技术人员,恐怕都认为...

3108
来自专栏玄魂工作室

如何学python 第十七课 类-面向对象的概念

欢迎回来。今天要说的东西将会改变我们写程序的方式。今天我们介绍‘类’(class)。 概述 什么叫‘类’?类,类型。变量类型。从日常生活的感觉来说,‘类’其实...

2564
来自专栏C语言及其他语言

[每日一题]哥德巴赫曾猜测(1199)

题目描述 德国数学家哥德巴赫曾猜测:任何大于6的偶数都可以分解成两个素数(素数对)的和。但有些偶数可以分解成多种素数对的和,如: 10=3+7,10=5+5,...

2444
来自专栏前端架构

js学习思维导图

     能够认真看完就是一次对javascript的回顾与提升,可以很好的检验基础。

391
来自专栏about云

about云spark开发基础之Scala快餐

---- spark是用Scala语言来写的,因此学习Scala成为spark的基础。当然如果使用其它语言也是可以的。从性能上来讲,及代码简洁等方面,Scal...

2766

扫描关注云+社区