从C++到JAVA
JAVA和C++都是目前最常见的编程语言。众所周知,JAVA起源于C++,因而两种语言在很多地方大同小异。但不同之处也是需要我们注意的。JAVA禁用了很多C++独有的特性,也加入了非常丰富的库和函数。下面我们来看看以C++的基础如何迁移到JAVA。
1. 变量与数据类型
JAVA不再支持自动类型转换。在C/C++中,等号两边的数据类型不一致(比如int和float),会自动执行转换。但在JAVA中不可以;如果等号两边数据类型不一致,必须手动转换(cast)。
Boolean值不再能够使用任何数据代替。C++默认0(NULL)是false,否则都是true。但是JAVA不再允许这样。必须被声明成boolean的数据才可以是true, false。
JAVA不支持typedef
JAVA不支持unsigned
JAVA中所有的对象都是pass by reference的(换句话说,凡是new出来的东西都是pass by reference的,因为JAVA不支持pointer)
JAVA的对象必须通过new来分配,不能像C++那样直接声明在函数的stack上。
JAVA的数组必须通过new来分配,不能直接放在函数stack上。
JAVA中字符不是char而是byte。
2. 对象(Object)和类(Class)
JAVA是一个完全面向对象语言,也就是说,所有的函数和变量都必须放在类(Class)里面。类似C++里面的全局变量和函数是不会出现在JAVA里面的,因为C++只是给C加上了面向对象的功能而已。在C++里我们写
int global;
int main(int argc, char* argv[]) {
return 0;
}
而在JAVA里面就要写成
public class Main {
int global;public static void main(String[] args) {
}
}
JAVA没有header file,也就是说不能像C/C++那样通过引用header文件来找到需要的函数。JAVA不必要在文件中做额外声明就可以使用同一个文件夹下面的其他class和里面的公共函数。但是要注意,一个JAVA文件只能有一个公共类,而该文件的文件名必须是类的名字。比如public class Main就必须在Main.java文件中,区分大小写。
JAVA是完全面向对象语言,也就是其中的一切都是一个object。包括C++里面最基本的数据结构,int, float还有array这种抽象概念在JAVA中都有相对应的class。这些数据结构可以在Oracle官方网站上面的Java API References里面查看到。
这样解决了一些C++里面的问题,比如C/C++的array长度信息是要额外保存的,一旦丢失就无法找回了。但是JAVA的array因为是一个class,其中成员之一就是获取长度的函数,前面所说的问题就不会出现在JAVA里面。但是代价就是JAVA不管是空间占用还是运行效率都不如C++。
3. 常用函数和库
在C++中,我们需要通过#include来加载一些常用的库,比如最基本的控制台输入输出,iostream;在JAVA中我们使用import来导入标准JAVA库,一般我们会导入java.lang来使用常见的数据类型。在C++中我们需要using namespace std;来导入标准名称空间,但在JAVA中不需要这样做。在C++中,控制台有3种流,分别是cin(standard input), cout(standard output), cerr(standard error)。在JAVA中,分别对应这三种流的是System.in, System.out, System.err。这3中流不需要任何导入操作就可以使用。其中System.out和System.err这两个class提供了丰富的member,只要同学们看一眼reference,相信很快能够理解。
System.in的使用方法则与C++有所差别,System.in必须通过Scanner来读取其中的内容,Scanner位于库java.util,使用前必须导入。下面是一个读取用户名字并输出欢迎信息的程序。
C++版本:
#include <iostream>
#include <string>
using namespace std;int main(int argc, char* argv[]) {
string name;
cout << “Please input your name:”<< endl;
cin >> name;
cout << “Welcome, “ << name << endl;
return 0;
}
JAVA版本:(以下代码必须放在Main.java文件中)
import java.lang.*; //表示导入java.lang下面所有的class
import java.util.*; //表示导入java.util下面所有的classpublic class Main {
public static void main(String[] args) {
String name;
Scanner scan = new Scanner(System.in); /*创建新的scanner并制定输入流为System.in */
System.out.println(“Please input your name:”);
name = scan.next();
System.out.println(“Welcome, ”+ name);
}
}
JAVA提供了非常丰富的标准库,Oracle提供了对这些库详细的解释。
http://docs.oracle.com/javase/7/docs/api/
上面的链接指向Oracle官方提供的JAVA SE 7 API文档。
4.编译和执行
C++程序的编译和执行相信大家都很熟悉了,使用g++进行编译,直接就可以在shell中执行。C++编译器生成的是编译后的二进制程序,两台电脑的CPU和系统构架必须一样才可以使用在对方机器上编译的程序。
而JAVA编译的结果是JAVA Object Code,扩展名为.class的文件。这些文件可以跨平台使用,因为他们需要被JAVA虚拟机解释运行,而JAVA虚拟机有不同平台的版本。
JAVA的编译工具是javac,所有JAVA源代码需要被编译为class文件来执行。
javac HelloWorld.java
java HelloWorld
javac工具后面跟需要编译的JAVA源代码文件名,java运行工具后面跟的则是需要运行的类的名称。因为JAVA文件命名必须是其中唯一一个公共类的名称,java会自动寻找相应的文件来执行。而被执行的类中就要有public static void main这个函数。
This site uses Akismet to reduce spam. Learn how your comment data is processed.
Recent Comments
- Franny on 留言板
- jerry on UWaterloo的CS课程介绍,一篇充斥着淡淡忧伤的总结…..ˋ(╯ω╰)ˊ
- 上官小天 on UWaterloo的CS课程介绍,一篇充斥着淡淡忧伤的总结…..ˋ(╯ω╰)ˊ
- tooyoungtoosimple on UWaterloo的CS课程介绍,一篇充斥着淡淡忧伤的总结…..ˋ(╯ω╰)ˊ
- 上官小天 on UWaterloo的CS课程介绍,一篇充斥着淡淡忧伤的总结…..ˋ(╯ω╰)ˊ
Leave a Reply