Post

Java基础语法

本文将使用我之前学过的另外一门面向对象编程语言 (C#) 作为对照, 以便于理解和联想记忆.

控制台输入输出语句

 JavaC#
换行输出System.out.println(...);Console.WriteLine(...);
不换行输出System.out.print(...);Console.Write(...);
读取下一行scanner.nextLine();Console.ReadLine();

注: Java 中读取一行使用的scanner是一个Scanner类对象, 需要使用import java.util.Scanner;引入, 再使用Scanner scanner = new Scanner(System.in);创建.

变量与数据类型

可变性与不可变性

在 Java 中, 一个数据类型可能是可变的, 可能是不可变的. 如果一个变量是可变的数据类型, 那么其内存地址中存储的 “变量实体” 会发生变化, 否则不发生变化.

套用用 C++的说法, Java 的每一个变量都是指针, 更严谨地说, 是引用. 所以知道一个数据类型是可变的还是不可变的至关重要. 当我们修改变量的值时, 对于可变的数据类型, 其变量实体的值将随之改变, 对于不可变的数据类型, 会产生一个等于修改后的变量值的变量实体, 然后让这个引用指向新的变量实体.

综上所述, 一个数据类型的可变和不可变和一个变量是否可变无关. 它只描述了数据实体的可变性. 而引用的不可变性需要使用final关键字来声明.

在开发中, 使用不可变的数据类型更安全, 但是如果出于特殊情况迫不得已使用不可变的数据类型, 可以使用防御式拷贝:

1
2
3
4
5
6
7
8
// Suppose that A is a mutable datatype.
// Suppose that A(A another) is a copying constructor.
A foo(A param) {
    A param_c = new A(param);   // Defensive copy for parameter(s)
    A rev;                      // The return value
    /* Some Operations */
    return new A(rev);          // Defensive copy for return value
}

数值型

类别JavaC#范围
8 位整数bytesbyte$-128$ ~ $127$
8 位无符号整数-byte$0$ ~ $255$
16 位整数shortshort$-32\,768$ ~ $32\,767$
16 位无符号整数-ushort$0$ ~ $65\,535$
32 位整数intint$-2\,147\,483\,648$ ~ $2\,147\,483\,647$
32 位无符号整数-uint$0$ ~ $4\,294\,967\,295$
64 位整数longlong$2^{63}$ ~ $2^{63} - 1$
64 位无符号整数-ulong$0$ ~ $2^{64} - 1$
32 位单精度浮点数doublefloat7 位有效数字
64 位双精度浮点数doubledouble15 位有效数字
大十进制整数BigDecimal-$-10^{2\,147\,483\,647}$ ~ $10^{2\,147\,483\,647}$
十进制数-decimal$\pm 1.0 \times 10^{-28}$ ~ $\pm 7.922\,8 \times 10^{28}$
大整数BigInteger 无限大 (显然, 实际上不可能无限大)

文本型

类型JavaC#
字符charchar
字符串Stringstring

集合型

C#和 Java 均提供了集合类. 使用 C#集合类需要用using System.CollectionsSystem.Collections.Generic, 使用 Java 集合类需要import java.util.[集合类]. 从这里我们也能看出 Java 和 C#的一个区别: Java 使用包, 而 C#使用命名空间.

在 Java 中, 几乎所有的集合类都是可变的, 尤其是直接使用类型名称的集合类. 当然, 也有不可变的集合类, 它们的名字中大多都表明了其不可变性.

This post is licensed under CC BY 4.0 by the author.