总体而言,Java 的面向过程部分和 C/C++ 比较类似,容易上手。
整体框架
Java 是一个面向对象语言,秉持“万物皆对象”的理念。
主程序在一个和本文件名相同的public类中运行,例如:
class Test {
public static void main(String[] args) {
// 程序的代码
}
}
注释
在 Java 中,// 和 /**/都可以用来注释,和 C++ 一致。
class Test {
public static void main(String[] args) {
//这是注释
/*
这也是注释
*/
}
}
基本数据类型
Java 中的数据类型分基本类型和引用类型两种。引用类型就是各式各样的类,基本数据类型为以下八种:
类型名 | 意义 |
---|---|
boolean | 布尔值,表示真假 |
byte | 字节类型 |
short | 短整型,2 byte |
int | 整型,4 byte |
long | 长整型,8 byte |
float | 双精度浮点数,4 byte |
double | 双精度浮点数,8 byte |
char | 字符类型,1 byte |
运算符
目前还没碰到和 C/C++ 不一样的部分,加减乘除,取模,三元,异或啥的都能用。
final 关键字
和 C/C++ 里面的 const 一样,表示不可被更改,用于定义常量。
final double PI = 3.1415926535;
数组
// 其语法格式为 数据类型[] 变量名 = new 数据类型[数组大小]
// 有十个元素的整数类型数组
int[] arr = new int[10];
//开一个二维数组
int [][]arr2 = new int[100][100];
Java 中的数组是 引用数据类型(你可以将数组视作一个封装好的类)。
字符串
C 中用 char 数组来表示字符串,但是这玩意太捞了,所以 C++ 引入了 String 类来进行字符串的处理。Java 也有 String 类,可以进行各式各样方便的操作。
// 最为简单的构造一个字符串变量的方法如下
String a = "Hello";
// 还可以使用字符数组构造一个字符串变量
char[] stringArray = { 'H', 'e', 'l', 'l', 'o' };
String s = new String(stringArray);
和 C++ 中的 String 一样,Java 的String 也可以进行加等操作。注意,比较的时候要用 equals方法(==只是判断是否指向一个对象,这是 C++ 和 Java 的一个不同点)。
Java 里面的 String 一旦赋值,便不能像 C++ 里面的 String 一样随机修改,可以视作一个“半常量”,所以我们有时候还会使用 StringBuffer 等其他类来进行字符串处理。
输入输出
输入
使用 Scanner 类进行处理,没有 scanf 那么方便,更像 cin ,凑合用吧。
import java.util.Scanner;
class Test {
public static void main(String[] args) {
Scanner input = new Scanner(System.in); // System.in 是输入流,类似C中的stdin
int a = input.nextInt();//读一个int
double b = input.nextDouble();//读一个double
String c = input.nextLine();//读一整行
String d = input.next();//读一个字符串(到空格结束)
}
}
对了,Scanner还有一个函数用来设置分隔符,如果读入的数据是用逗号啥的分隔开,就可以考虑下这个函数了。
//两个斜杠好像是转义用的
s.useDelimiter("\\,");
输出
跟输入不一样,Java 在输出上面提供了一堆东西,还蛮好用的
class Test {
public static void main(String[] args) {
int a = 12;
char b = 'A';
double s = 3.14;
String str = "Hello world";
System.out.printf("%f\n", s);
System.out.printf("%d\n", a);
System.out.printf("%c\n", b);
System.out.printf("%s\n", str);
System.out.print(str);
System.out.println(s);
}
}
printf 和 C 里面的一致,不过占位符没那么多了(例如 float 和 double 都用%f)。另外,String 类是可以用 %s 来输出的。
print 和 Python 里面的 print 比较像,都是啥扔进去都能输出(好像数组啥的也行);println 类似,不过println输出完毕之后会换行。
条件判断
和 C/C++ 完全一致,不再赘述。
对了,Java 隐式的类型转换没有 C/C++ 方便了,这意味着 x!=0 不可以简写成 x 了,必须写完整。
class Test {
public static void main(String[] args) {
int x = 3;
/*
//这么写会报错,因为 x 是 int 而非boolean 类型
if (x) System.out.print(x);
*/
//要这么写
if (x != 0) System.out.print(x);
}
}
循环
普通 for,while,break 之类的都和 C 一致,不再赘述。下面主要讲两个特殊的东西:
for循环的简写形式
类似于 Python 的 for 写法或者 C++ 的 foreach 写法,适合用于简单遍历:
class Test {
public static void main(String[] args) {
int []a = new int[3];
a[0] = 0;
a[1] = 1;
a[2] = 2;
/*
//普通for
for (int i = 0; i < a.length; ++i) System.out.println(a[i]);
*/
//简化
for (int x : a) System.out.println(x);
}
}
带标签的 break 和 continue
Java 的编写者把 goto 给删掉了,作为补偿,他们提供了带标签的 break 和 continue ,用于处理一些以往必须得用 goto 的场合,并尽量维护程序的逻辑性。
我没咋用过,就不管了,需要用的话建议自行百度。
函数
和 C/C++ 的异同
Java 的函数由于面向对象的关系,所以用起来和 C/C++ 的面向过程语法相比还是显得有点懵逼。
当然,如果只是在和 main 同一个类里面写函数,那和以往写 C/C++ 还是比较类似的,基本语法也类似。
关于更高级的部分,将会在面向对象部分详细讲述。
函数值传递
Java 的传递方式都是值传递,虽然这个值传递可能有点难于理解。
基本数据类型
引用数据类型
严格讲,Java 都是值传递,但是和我们理解的不同,他不是把这个对象拷贝一份,而是拷贝一份这个对象的“引用”。打个不恰当的比方,相当于 C/C++ 里面的传指针。
用人话来解释,new 出来的对象是一台电视,而我们前面所用的变量只是一个遥控器,它通过 = 号来和电视建立关系。传递的时候,Java 原封不动的复制一个相同的遥控器,但是指向的还是一台电视。
记住这个遥控器的比喻,这在下面讲述泛型的时候十分有助于理解。