本文主要基于讲叙最简单的java和c程序编写的区别,以及编译看效果,基于韦老师的视频,自己总结并重点分析了java与c数据类型的区别总结,不积跬步,无以至千里,基础知识是很容易被忽视及用错的,本文记录下来的方便之后使用,更加希望能给大家带来些许帮助
- hello程序
先让我们看c与java一个完整程序同样输出一个hello,world的方式
c语言:hello.c
1 #include <stdio.h>
2 int main(int argc,char **argv)
3 {
4 printf("hello,world! hello qf!\n");
5 return 0;
6 }
编译命令:gcc -o hello hello.c
执行命令:./hello
pb-server@pbserver1:~/workspace/qinfeng/3gr$ vim hello.c
pb-server@pbserver1:~/workspace/qinfeng/3gr$ gcc -o hello hello.c
pb-server@pbserver1:~/workspace/qinfeng/3gr$ ./hello
hello,world! hello qf!
pb-server@pbserver1:~/workspace/qinfeng/3gr$
同样java代码:
Hello.java
public class Hello{
public static void main(String args[]){
System.out.println("hello,world! hello,qf!");
}
}
编译命令:javac Hello.java
执行命令:java Hello
E:\qf项目20160603\java_study(2016)\01helllo>javac Hello.java
E:\qf项目20160603\java_study(2016)\01helllo>java Hello
hello,world! hello,qf!
E:\qf项目20160603\java_study(2016)\01helllo>
c语言的写法大家都很熟悉,主要是提醒几个java写法的注意点:
1.类名字Hello首字母习惯大写,小写也是可以的,并且java文件名要和类名一样
2.String 和 System.out.println都首字母大写
- java与c数据类型小结
java与c数据基本类型总结了一张表如下:
从基本数据类型中可以看出,区别大概有几点
1.java中多了boolean,和byte数据类型,都是1字节的
2.c中char类型占用1个字节,java中占用2个字节
3.c中有指针类型,而java中有引用数据类型
4.c中有unsigned类型,java中没有
以下主要从指针定义及几个数组定义区别加深对java引用的了解:
c指针:
int* p=malloc(10*sizeof(int));
java 引用定义方法:
int p[] =new int[10];
- 字符数组定义
c语言:
字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。
char str[10]={ ‘I’,’ ‘,’a’,’m’,’ ‘,‘h’,’a’,’p’,’p’,’y’};
即把10个字符分别赋给str[0]到str[9]10个元素
如果花括号中提供的字符个数大于数组长度,则按语法错误处理;若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 ‘\0’ )。
char str[10];
java:
char str[]=new char[10];
char str[] —–栈
new char[10]—–堆
- 静态初始化整形数组
c语言:
int p2[]={1,2,5};
java语言
int p2[]={1,2,5};
由以上java关于数组的图示可以得知:
1.java 里面数组永远是引用类型,永远放在堆里面分配,栈里面存放的是地址值,地址指向堆空间,堆空间分配了3个int值的空间,空间中的值就是1 2 5
2.其次请注意,java声明一个数组不需分配任何存储空间,它仅仅是代表你试图创建一个数组。跟C/C++声明一个数组的明显区别就是空间的大小没有被特别标识。因此,下面的声明将会引起一个编译期错误。java 数组静态初始化不能指定长度
int num[5];
即:上面String str2=”abc”静态初始化的方法,如果改为String str2[3]=”abc”; 则在编译时报错。
一个数组的大小将在数组使用new关键字真正创建时被给定,例如:
int num[];
num = new int[5];
3. 对于数组初始化这个问题,关键在于要弄清楚数组变量和数组对象的差别。数组变量是存放在栈内存中的,数组对象是存放在堆内存中的。数组变量只是一个引用变量,他能够指向实际的数组对象。
所谓的数组初始化并非对数组变量初始化,而是对数组对象进行初始化。
- 字符串定义
c语言:
char str2[]=”abc”;
java语言:
String str2=”abc”;
可以看出java中是没有结束符的
java中无需结束符的原因
Java里面一切都是对象,是对象的话,字符串肯定就有长度,即然有长度,编译器就可以确定要输出的字符个数,当然也就没有必要去浪费那1字节的空间用以标明字符串的结束了。比如,数组对象里有一个属性length,就是数组的长度,String类里面有方法length()可以确定字符串的长度,因此对于输出函数来说,有直接的大小可以判断字符串的边界,编译器就没必要再去浪费一个空间标识字符串的结束。
4.java字符串末尾空字符的处理
java和c通信的时候,由于c中的char中有结束符的,所以当java收到C发来的字符串时,后面往往会有若干空字符,如果不做处理的话,java会对其一并输出,为了将空字符处理掉不输出,可以采用如下两种方法:
方法一:
调用java字符串的trim()方法,该方法会将字符串前后的空字符读去掉。
方法二:自己实现去掉尾部空字符的方法:
/**
* 截取掉C中之前的字符串。即只截取前的字符
*
* @param s:尾部带有空字符的java字符串
* @return
*
*/
public static String deletTailChar0(String s){
if(s == null){
return null;
}
char[] chars = s.toCharArray();
StringBuffer sb = new StringBuffer();
for(char c : chars){
Character ch = c;
if(0 == ch.hashCode()){ //如果到了字符串结束,则跳出循环
break;
}else{
sb.append(c);
}
}
return sb.toString();
}
最后我们根据c指针分配内存 int* p=malloc(10*sizeof(int));
可以通过 free(p)释放内存;
java中引用数据类型,使用new 来分配,不需要自己释放,只需要设置为null即可
比如说
int p[] =new int[10];
p=null;(垃圾回收机制会回收堆空间)
如果空间被多个变量引用
char str3=str;
必须设置
str=null;
str3=null;
(垃圾回收机制才会回收堆空间)