总体而言,Java 的面向过程部分和 C/C++ 比较类似,容易上手。

整体框架

Java 是一个面向对象语言,秉持“万物皆对象”的理念。
主程序在一个和本文件名相同的public类中运行,例如:

  1. class Test {
  2. public static void main(String[] args) {
  3. // 程序的代码
  4. }
  5. }

注释

在 Java 中,// 和 /**/都可以用来注释,和 C++ 一致。

  1. class Test {
  2. public static void main(String[] args) {
  3. //这是注释
  4. /*
  5. 这也是注释
  6. */
  7. }
  8. }

基本数据类型

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 一样,表示不可被更改,用于定义常量。

  1. final double PI = 3.1415926535;

数组

  1. // 其语法格式为 数据类型[] 变量名 = new 数据类型[数组大小]
  2. // 有十个元素的整数类型数组
  3. int[] arr = new int[10];
  4. //开一个二维数组
  5. int [][]arr2 = new int[100][100];

Java 中的数组是 引用数据类型(你可以将数组视作一个封装好的类)。

字符串

C 中用 char 数组来表示字符串,但是这玩意太捞了,所以 C++ 引入了 String 类来进行字符串的处理。Java 也有 String 类,可以进行各式各样方便的操作。

  1. // 最为简单的构造一个字符串变量的方法如下
  2. String a = "Hello";
  3. // 还可以使用字符数组构造一个字符串变量
  4. char[] stringArray = { 'H', 'e', 'l', 'l', 'o' };
  5. 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 的传递方式都是值传递,虽然这个值传递可能有点难于理解。

基本数据类型

这玩意跟 C/C++ 一样,直接用就完事了。

引用数据类型

严格讲,Java 都是值传递,但是和我们理解的不同,他不是把这个对象拷贝一份,而是拷贝一份这个对象的“引用”。打个不恰当的比方,相当于 C/C++ 里面的传指针。
用人话来解释,new 出来的对象是一台电视,而我们前面所用的变量只是一个遥控器,它通过 = 号来和电视建立关系。传递的时候,Java 原封不动的复制一个相同的遥控器,但是指向的还是一台电视。
记住这个遥控器的比喻,这在下面讲述泛型的时候十分有助于理解。