Java基础语法与C语言的区别
Java和C语言在语法上很多地方是相通的,本篇笔记重在讨论两者的区别。以便快速掌握Java语法的关键点,进入到更深层次的面向对象的学习。
一、类与对象的概念
Java是纯面向对象语言:在Java中,所有的代码都必须封装在类中。一个Java程序至少有一个类,并且程序的执行从main方法开始,main方法也必须定义在类中。创建对象时,必须使用new关键字显式地实例化类。
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person("Alice", 25); // 使用new关键字创建对象
System.out.println("Name: " + person.name + ", Age: " + person.age);
}
}
C是面向过程的语言:C语言允许全局函数的存在,它更侧重于过程的实现。结构体变量可以直接声明和使用,不需要像Java那样通过new来实例化。
#include
// 定义结构体
typedef struct {
char name[20];
int age;
} Person;
int main() {
Person person = {"Bob", 30}; // 直接声明结构体变量
printf("Name: %s, Age: %d\n", person.name, person.age);
return 0;
}
二、数据类型对比
基本类型:
Java的boolean独立存在:在Java中,boolean类型只有true和false两个值,不能用0和1来表示。
boolean flag = true;
if (flag) {
System.out.println("The flag is true");
}
C中通常用int模拟布尔逻辑:在C语言中,没有专门的boolean类型,通常使用int类型来模拟布尔值,0表示false,非0表示true。
#include
int main() {
int flag = 1;
if (flag) {
printf("The flag is true\n");
}
return 0;
}
字符串处理:
Java的String类不可变:在Java中,String类是不可变的,对String对象的修改实际上是创建了一个新的String对象。可以使用StringBuilder或StringBuffer来进行字符串的修改,其中StringBuffer是线程安全的。
String str = "Hello";
str = str + " World"; // 创建新的String对象
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 修改字符串
System.out.println(sb.toString());
C使用字符数组和指针操作:在C语言中,字符串通常用字符数组来表示,并且需要手动管理内存。可以使用指针来操作字符数组。
#include
#include
int main() {
char str[20] = "Hello";
strcat(str, " World"); // 拼接字符串
printf("%s\n", str);
return 0;
}
数组特性:
Java数组是对象:Java中的数组是对象,通过new关键字动态分配内存,并且数组有一个length属性来表示数组的长度。
int[] arr = new int[5]; // 动态分配数组
arr[0] = 10;
System.out.println("Array length: " + arr.length);
C数组是静态连续内存块:C语言中的数组是静态连续的内存块,需要预先确定数组的大小。
#include
int main() {
int arr[5] = {1, 2, 3, 4, 5}; // 预先确定大小
printf("Array length: %zu\n", sizeof(arr) / sizeof(arr[0]));
return 0;
}
三、运算符与控制流
运算符优先级:大部分运算符的优先级在Java和C中是一致的,但Java新增了instanceof运算符,用于检查一个对象是否是某个类的实例。
class Animal {}
class Dog extends Animal {}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
if (dog instanceof Animal) {
System.out.println("dog is an instance of Animal");
}
}
}
输入输出方式:
Java通过Scanner类或System.out.println实现:Java的输入输出通过Scanner类获取用户输入,通过System.out.println输出信息,并且Java的I/O类更抽象,如FileReader和BufferedReader用于文件读取。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter your name: ");
String name = scanner.nextLine();
System.out.println("Hello, " + name);
try (java.io.FileReader fr = new java.io.FileReader("test.txt");
java.io.BufferedReader br = new java.io.BufferedReader(fr)) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (java.io.IOException e) {
e.printStackTrace();
}
}
}
C使用printf和scanf:C语言通过printf输出信息,通过scanf获取用户输入。
#include
int main() {
char name[20];
printf("Enter your name: ");
scanf("%s", name);
printf("Hello, %s\n", name);
return 0;
}
四、内存管理差异
Java通过垃圾回收(GC)自动管理内存:Java程序运行时,垃圾回收器会自动检测不再使用的对象,并释放其占用的内存,减轻了程序员的负担,减少了内存泄漏的风险。
class MyClass {
// 类的成员和方法
}
public class Main {
public static void main(String[] args) {
MyClass obj = new MyClass();
obj = null; // 使对象不再被引用,等待垃圾回收
System.gc(); // 建议垃圾回收器运行(不一定立即执行)
}
}
C需手动分配/释放(malloc/free):在C语言中,使用malloc函数分配内存,使用free函数释放内存,如果忘记释放内存,可能会导致内存泄漏。
#include
#include
int main() {
int *ptr = (int *)malloc(5 * sizeof(int)); // 分配内存
if (ptr == NULL) {
perror("malloc");
return 1;
}
// 使用内存
free(ptr); // 释放内存
return 0;
}
这些就是一些简单的Java和C语言的区别,其他语法大差不差,可以在后续的学习中积累。希望能够尽快进入真正的Java学习!