|
四川智汇蓝图科技有限责任公司 建立在良好的C语言的基础上,便可以快速学习掌握好其它的语言,下面以一些程序例子来概述C语言和JAVA语言存在的一些差别,以及JAVA的一些注意事项和基础知识,后续章节将会讲述JAVA语言的各个知识点,这章主要以对JAVA有初步认识为出发点进行讲解。 四川智汇蓝图科技有限责任公司 首先介绍一个我使用的编译环境: 开发环境:ubuntu_16.04 开发工具:openjdk-8-jdk(用于编译JAVA程序)、gcc(用于编译C语言程序) JAVA环境的安装也非常方便,在 ubuntu 的命令行下执行以下几个步骤即可: 1.sudo apt-get update 2.sudo apt-get install openjdk-8-jdk 3.sudo apt-get install openjdk-8-jre 所有编程语言的学习都是从 Hello World 开始,它是打开编程的大门的钥匙,也是编程学习的必经之路,当然我们这里也以 Hello World 程序作为起点开始讲解,这样一个简单的打印程序可以测试我们一整个开发环境是否完全的搭建起来了,能否顺序的编译通过并执行。废话不多说,下面我们看看 C 语言和 JAVA 语言的 Hello World 程序存在什么样的差异。程序如下 C: 1 #include <stdio.h> 2 int main(int argc, char **argv) 3 { 4 printf("Hello, world!\n"); 5 return 0; 6 } JAVA: 1 public class Hello {/* 类的首字母要大写,文件名与类名保持一致 */ 2 public static void main(String args[]) { 3 System.out.println("Hello, world!"); 4 } 5 } 四川智汇蓝图科技有限责任公司 两段代码的差异其实不是特别大,C语言跟以前一样需要调用 stdio 的库,而 JAVA 不需要这个库了,而是声明了一个类,JAVA 里面叫 System 类,使用 System 类里面 println 来打印,函数的命名 JAVA 里面需要以 类 作为开头,定义一个名为 Hello 的类,里面实现一个跟 C 一样的mian函数,main函数的形参变为了一个 String 类的数组,而这段代码直观上看并不会看不懂它的含义,因为一样有main,一样有打印,只是细节上存在一些差异,后面再详细描述。 上面程序的编译指令分别如下: C程序: gcc -o Hello Hello.c ./Hello JAVA程序: javac Hello.java(这里会生成一个Hello.java的类) java Hello(java实则为一个虚拟机,在 java 虚拟机里面运行这个程序) 代码以循循渐进的形式来添加内容进行讲解,下面看一下变量的定义以及循环。 C: 1 int i=0; 2 for(i=0; i<3; i++) 3 { 4 printf("Hello World\n"); 5 } JAVA: 1 int i=0; 2 for(i=0; i<3; i++) 3 { 4 System.out.println("Hello World!"); 5 } 这个部分几乎是一样的。紧接着看一下面的程序,主要描述定义变量的差异。 C: /* 一般声明的变量都存在放栈里里面 */ 1 int a = 3; 2 float f = 3.14; 3 /* C语言使用malloc分配内存,这段分配的内存在堆里面 */ 4 int *p = malloc(10*sizeof(int)); 5 /* 数组的定义 */ 6 char str[100]; 7 /* 字符串定义,内容也是存放在栈里面 */ 8 char str2[] = "abc"; 9 /* 良好的习惯不使用的时候free掉 */ 10 free(p); JAVA: 1 /* a这个变量毫无疑问也是在栈里面 */ 2 int a = 3; 3 4 /* 下面 3.14 为 double 类型, java 里面为了保证精度,会自动转换为 double */ 5 /* 自动转换:能够自动转换的前提是数据不丢失, 6 这里转换为 float 可能导致 double 类型的数据丢失,所以不会自动转换 */ 7 /* 这里可以使用强制转换 */ 8 float f = (float)3.14; 9 /* 或如下定义,末尾加个 f ,表明为 float 型 */ 10 float f2 = 3.14f; 11 12 short s = 1; 13 /* 写成 s=s+1 会出错,因为对于 byte、short 的运算,为了保证精度,会自动转换为 int 类型 */ 14 s = (short)(s + 1);/* 所以需要加强制类型转换 */ 15 16 /* 除了基本的数据类型以外,都是引用数据类型 */ 17 /* JAVA里面没有指针,也不存在 malloc 这种形式,取而代之的是 new */ 18 int p[] = new int[10]; 19 20 /* 这里跟 C 的差别就是 C 这样定义的数组都放在栈里,而 java 里 p2 在栈里面,数组值在堆 */ 21 /* 所以JAVA 定义的数组的空间永远是放在堆里面的,因为它属于"引用(即new)"数据类型 */ 22 int p2[] = {1,2,4}; 23 /* 打印上 C 原来使用逗号分隔, JAVA 使用的是‘+’号,如下 */ 24 System.out.println("p2[1]="+p2[1] + " p2[2]="+p2[2]); 25 26 /* java 里面字符串的定义是用个 String 类变量 */ 27 String str = "abc"; 28 29 /* 数组的定义方式 */ 30 char str2[] = new char[100]; 31 32 /* 这里定义一个数组变量指向上面这个数组指向的堆,它们指向同一个堆空间 */ 33 /* 由于指向同一个堆空间,所以想释放这个堆空间的话必须这两个变量都赋值为null才行 */ 34 char str3[] = str2; 35 36 /* java里面没有free,变为null了,它可以使堆空间没有指向, 37 这时垃圾回收机制看到没人指向这个堆空间,就会自动释放这些堆空间 */ 38 p = null; 39 p2 = null; 40 str = null; 41 str2 = null; 42 str3 = null; 四川智汇蓝图科技有限责任公司 上面部分的差异处还是比较多比较明显的,只是粗略的过一下,留个概念,接下来是函数,函数是整个程序的功能主体,在 JAVA 里面它有另一个名字,叫“方法”,下面具体看代码。 1 public class Function{ 2 public static void main(String args[]){ 3 /* 重载后会根据实参的不同调用不同的函数 */ 4 System.out.println(add(1,2)); 5 System.out.println(add(1,2,3)); 6 System.out.println(add(1.5f,2.5f)); 7 } 8 public static int add(int x, int y){ 9 return x + y; 10 } 11 12 /* 函数重载:函数重载的意思就是函数名一样,但是可以根据形参的不同来自动调用对应形参的函数 */ 1 3 /* 如果只修改返回值类型是没法重载的,因为编译器不知道你是想得到得到什么返回类型 */ 14 public static int add(int x, int y, int z){ 15 return x + y + z; 16 } 17 public static float add(float x, float y){ 18 return x + y; 19 } 20 } 四川智汇蓝图科技有限责任公司 下面再简述下 JAVA 里面怎么实现类似 C 里面的指针作为函数形参直接修改地址里面的值的实现方法,代码如下: 1 public class Param{ 2 /* main的参数是个字符数组 */ 3 public static void main(String args[]){ 4 int x = 1; 5 /* 这里跟C语言一样,形参为普通变量无法改变x的值 */ 6 fun(x); 7 System.out.println(x); 8 9 int p[] = new int[1]; 10 p[0] = 123; 11 /* java使用+号做分隔,跟C不一样 */ 12 System.out.println("Before fun2: "+p[0]); 13 /* 因为数组是引用类型,所以传递进去的是指针 */ 14 fun2(p); 15 System.out.println("After fun2: "+p[0]); 16 } 17 18 public static void fun(int x){ 19 x = 100; 20 } 21 22 public static void fun2(int[] p){//也可以写成 int p[] 23 p[0] = 200; 24 } 25 } 四川智汇蓝图科技有限责任公司 上面的执行结果如下: 四川智汇蓝图科技有限责任公司 接下来以一张图作为总结:
我找了另一张图,描述了 JAVA 的数据类型分类
四川智汇蓝图科技有限责任公司 这里需要注意的是 C 里面 char 占一字节,只能用来表示 ASCII 码,而 JAVA 的 char 使用的 unicode 编码,占两字节,可以表示英文也可以表示汉字等。
|