Java基础语法
本文将使用我之前学过的另外一门面向对象编程语言 (C#) 作为对照, 以便于理解和联想记忆.
控制台输入输出语句
Java | C# | |
---|---|---|
换行输出 | 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
}
数值型
类别 | Java | C# | 范围 |
---|---|---|---|
8 位整数 | byte | sbyte | $-128$ ~ $127$ |
8 位无符号整数 | - | byte | $0$ ~ $255$ |
16 位整数 | short | short | $-32\,768$ ~ $32\,767$ |
16 位无符号整数 | - | ushort | $0$ ~ $65\,535$ |
32 位整数 | int | int | $-2\,147\,483\,648$ ~ $2\,147\,483\,647$ |
32 位无符号整数 | - | uint | $0$ ~ $4\,294\,967\,295$ |
64 位整数 | long | long | $2^{63}$ ~ $2^{63} - 1$ |
64 位无符号整数 | - | ulong | $0$ ~ $2^{64} - 1$ |
32 位单精度浮点数 | double | float | 7 位有效数字 |
64 位双精度浮点数 | double | double | 15 位有效数字 |
大十进制整数 | 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 | 无限大 (显然, 实际上不可能无限大) |
文本型
类型 | Java | C# |
---|---|---|
字符 | char | char |
字符串 | String | string |
集合型
C#和 Java 均提供了集合类. 使用 C#集合类需要用using System.Collections
或System.Collections.Generic
, 使用 Java 集合类需要import java.util.[集合类]
. 从这里我们也能看出 Java 和 C#的一个区别: Java 使用包, 而 C#使用命名空间.
在 Java 中, 几乎所有的集合类都是可变的, 尤其是直接使用类型名称的集合类. 当然, 也有不可变的集合类, 它们的名字中大多都表明了其不可变性.