Java学习笔记之与C语言的对比

笔者这学期在软件构造课程上首次接触Java, 需要自学。由于大一的时候学习过c语言,并且有人称java为c++ --,其语法和c语言比较类似,因此我打算对比着c语言进行学习,并在此记录学习笔记,便于随时复习,也希望能给和我情况类似的同学有一点小小帮助。初学者,如有错误,敬请指正。

总体差异

刚刚我们提到了 java被一些人称作C++ --,为什么这么说呢?下面我们讨论一下C, C++和java的三种语言区别。
    从编程思想来说,c是面向过程语言的典型代表,java是面向对象语言典型代表,而c++则是二者混合型的语言。
怎么理解“面向过程”和“面向对象”两种思想呢,我在网上看到一个例子,或许并不恰当,但对于初学者来说是很好理解的。

需求:把大象放进冰箱里。
面向过程:1.打开冰箱门 2.放进大象 3.关上冰箱门
面向对象:1.冰箱{容量,开门,关门} 2.大象{体积,移动}

面向过程编程时,需要编写的是打开冰箱门,放进大象,关上冰箱门三个函数,然后在main函数中依次调用三个函数以实现需求。
面向对象编程时,需要定义冰箱和大象两个类,并定义两个类对应的成员(冰箱的容量,大象的体积),对应的方法(开门,关门,移动)。 然后在main函数中,实例化冰箱,大象两个对象,再调用对应方法实现需求。

C一切采用函数的形式完成,然后在主函数main中依次调用。

C++是在C语言的基础上扩展而生的一门新语言,所以一般兼容C语言库。C++集成了类的概念,可以将所有的东西封装在类中,类中的私有成员不可被别人访问,这样就有效地解决了代码互干扰性,提高了团队工作效率。

java是汲取C++的长处而诞生的,这个语言采用完全面向对象的概念,将所有的功能封装在类中,而不像C++部分封装。同时它也删去了C++中一些难于理解和应用,以及比较危险容易出现bug的内容,如结构,联合,全局变量,指针变量,直接操作内存,多重继承等。因此java具有简洁安全,易于学习,可移植性高等特点,目前非常流行。

细节差异

除了上面提到的大体差异外,java语法中还有一些跟C语言有出入的地方,在这里做一点补充。

数据类型

Java和C语言数据类型相比,基本数据类型除了c语言有的整型,浮点型,字符型,还增加了布尔型(boolean,又称逻辑型)。Java不包含结构、联合和指针,但其独特的引用数据类型有着类似指针的用法。其引用数据类型有数组、类(Class)和接口(Interface)。基本数据类型是存在栈中的,而引用数据类型类似一个指向堆中一块区域的指针(指针本身也存在栈中)。

整数型

  1. 不同于C语言中有无符号整型unsigned int,Java中整型数全是有符号数。但我们知道有符号数和无符号数的位级编码是一致的,因此在特殊情况下我们也可以使用整型数来处理无符号问题。为了便于处理,java增加了无符号右移运算符>>>,用法与有符号右移>>类似。
  2. 整型数中还多了一个类型byte,表示一字节大小的整型变量,范围是-128~127。byte和char在Java中有如下差别:
    1) 在java中char不是1个字节而是2个字节大小(见下一知识点);
    2) byte是有符号的整型,而char无法识别负数。如char c = -3 在Java中会报错。
  3. 除了十、八、十六进制写法,Java7以上还支持二进制写法如0b00000001。

字符型

  1. C语言中字符型采用ASCII编码,占一个字节,而Java中的字符型采用Unicode编码,占两个字符,因此可以表示汉字及其他非英文字符。
  2. 除了同c语言可用8进制ascii码表示一个字符如’\101’,还可以用16进制Unicode表示一个字符,如’\u0100’

布尔型

    Java增添了布尔型变量,它只有一位两个值,写作true或false。用于流程控制语句(如if语句,while语句)的逻辑判断,取代了C语言中其他类型变量(0为假,非0为真)的法则。这样避免了程序员失误写出while(flag=1)这样的永真循环。
    需要注意的是,位运算(&,|)和逻辑运算(&&,||)均可用于布尔变量,且其运算结果常常相同。但有一点不同的是,后者存在短路现象,而前者没有。

数组

Java中虽然也有数组,但和C语言中的数组有很大的不同:

  1. Java中的数组是引用数据类型,数组中的元素是储存在堆中而不是栈中,更类似于C中的动态数组。因此在声明变量时不能写下具体的大小如 int a[5]; 此外,也不能用指针相关操作如*(a+1)来取元素。
  2. 定义:除了c语言定义方法 int a[],b[];
    还可以这样定义 int[] a,b;注意后者只需在变量名后写一对方括号,其后所有变量均为数组。
  3. 初始化:方法有两种:
a = new int[n];//n可以是变量,数组元素初始化为0或null
a = new int[]{1,2,3};//大小为3,初始化为对应元素
  1. 可用a.lenth获取数组长度
  2. 多维数组的声明也类似C语言的动态数组,必须声明第一维大小,第二维可以每个元素不同。
int a[][] = new int[3][2];
//int b[][] = new int[][3]; Error
int c[][] = new int[3][];
c[0] = new int[4];
c[1] = new int[2];
c[2] = new int[]{1,3};

字符串(String)

字符串虽然不是和整型,数组同级的数据类型,而是一个类,但由于我们经常用到它,我就在这里讲一下它的特殊之处:

  1. 字符串是不可变类型的变量。
  2. 不能用“==”来判断字符串是否相同,而应该用s1.equals(s2),之后会讲到原因。
  3. 可用运算符 + 连接两个字符串,甚至可以连接其他类型,其他类型将会自动转换成字符串。如“your ID is ”+666,得到”your ID is 666“,注意这是一个新的字符串,原字符串并不会被修改。

预处理语句

  1. java不支持宏定义
  2. java是用import语句而非include引用第三方库
    格式:import 包名.类名
    例子:import java.util.Scanner
  3. btw:如果文件不在根目录下,还需要在文件最前面写上package语句,例如:package src.p1.Class1

流程控制语句

switch语句

Java中也支持switch语句。不同点在于,switch语句中的变量不仅可以是整数、字符,Java6之后还支持字符串。
例:

switch(s){
	case "hello":
		...
	case "java":
		...
	default:
		...
}

for语句

除了沿用C语言中的循环语句外,Java(5之后)还支持一种foreach循环,又称增强型for循环,可遍历一个可迭代对象的每个元素。格式如下:

for(Type element :iterable){ ... }

例子:

for(int i : set){ ... }

其等价于下面代码:

for(Iterator it = set.iterator(); it.hasNext();){
		int i = it.next() 
		... 
}

这种方法类似Python中的for语句,即:

for i in set:
	...

在此类循环中,有两点需注意:

  1. 元素element是被遍历元素的一个拷贝,不能通过直接修改element达到修改被遍历对象的目的。
  2. 在foreach遍历途中,不能删除元素,否则会引发异常。

(关于迭代方法,我会在之后总结。)

break,continue语句

我们知道C语言中break语句是跳出内层循环(或switch),continue是跳过内层循环剩余部分。如果想跳出外层循环该怎么办呢?

  1. 定义flag变量,每次循环结束后判断,当其改变时跳出循环。
  2. 使用goto语句

但由于goto语句会使程序流程不直观,导致可读性很差,所以一直不被推荐使用,而flag也要多定义一个变量比较麻烦。在java中,增加了break+标号的用法。即:在循环体前面增加相应标号,然后使用break+对应标号跳出对应循环。用法如下:

int i=0;
loop: while(true){
	switch(i){
		case 0:
			i++;
			break;
		case 1:
			break loop;
	}
}

continue语句同理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值