3. Java 基础¶
3.1. 目标¶
编写包含字段、成员方法并调用导入代码的 Java 类
使用 if 语句、for 循环或 while 循环等编程结构开发 Java 代码
跟踪变量并理解作用域
区分基本类型(primitive types)与引用类型(reference types)
在 Eclipse 中运行 Java 程序
复习面向对象编程
探索枚举(Enum)类型
探索 switch 语句
解读 UML 类图
建议阅读:Frank M. Carrano 与 Timothy Henry 所著《Data Structures and Abstractions with Java》第 4 版中的附录 B(Java 基础)和附录 C(类)。
3.2. 互动:Java 基础¶
3.2.1. 需要熟悉的 Java 基础知识¶
基本类型、对象或引用类型、包装类、类型转换
赋值语句
表达式、运算顺序 ++、--
if、if-else、嵌套条件及 switch 等条件语句
循环语句,如 while 和 for 循环
String 方法
import 语句
编写和使用自己的方法、作用域
枚举类型
类、字段、成员方法
附加参考:
Oracle Java Tutorial3.3. Java 方法¶
在下面的讨论中,我们将引用如下的 Bank 类:
Bank 类
import java.util.Scanner;
import java.text.DecimalFormat;
public class Bank {
static long accountID;
static String accountHolder;
static double accountBalance;
static String PIN;
static final double withdrawalTransactionCharge = 0.50; // $0.50 charge for
// each transaction
private static DecimalFormat df = new DecimalFormat("#.##");
public enum Choice{
DEPOSIT, WITHDRAW, DISPLAY, EXIT
}
public Bank() {
init();
}
public static void init() {
accountHolder = "J. Doe";
accountBalance = 500.00;
accountID = 555444333;
PIN = "1234";
}
public static void withdraw(double amount) {
if ((amount + withdrawalTransactionCharge) < accountBalance) {
accountBalance = accountBalance - amount
- withdrawalTransactionCharge;
System.out.println("withdrawing $" + df.format(amount));
}
else {
System.out.println(
"low account balance, cannot complete withdrawal transaction");
}
displayAccountBalance();
}
public static void deposit(double amount) {
accountBalance = accountBalance + amount;
System.out.println("depositing $" + df.format(amount));
displayAccountBalance();
}
public static void displayMenu() {
StringBuilder buffer = new StringBuilder();
buffer.append("*****Welcome to ABC Bank*****");
buffer.append("\n");
buffer.append("\n");
buffer.append("1: Withdraw $20.00");
buffer.append("\n");
buffer.append("2: Deposit $20.00");
buffer.append("\n");
buffer.append("3: Display Balance");
buffer.append("\n");
buffer.append("\n");
buffer.append(
"Please enter your choice of 1, 2, or 3, and press the Enter key");
buffer.append("\n");
System.out.println(buffer.toString());
}
public static void displayAccountBalance() {
StringBuilder buffer = new StringBuilder();
buffer.append("-----Account Details----- ");
buffer.append("\n");
buffer.append("Account ID: ");
buffer.append(accountID);
buffer.append("\n");
buffer.append("Holder: ");
buffer.append(accountHolder);
buffer.append("\n");
buffer.append("Balance: $");
buffer.append(df.format(accountBalance));
buffer.append("\n");
buffer.append("-------------------------");
buffer.append("\n");
buffer.append("-------------------------");
buffer.append("\n");
buffer.append("\n");
System.out.println( buffer.toString());
}// end of displayAccountDetails Method
public static void main(String[] args) {
init(); // Initializes this account
displayMenu();
String response = new Scanner(System.in).nextLine(); // Read user input
if (response.equals("1")) {
withdraw(20.00);
}
else if (response.equals("2")) {
deposit(20.00);
}
else if (response.equals("3")) {
displayAccountBalance();
}
else {
System.out.println("You entered an invalid choice.");
}
System.out.println("Thank you for banking with us, goodbye!");
}
}
3.3.1. 互动:Java 方法¶
视频更正!
可以把 double 看作 float(而不是 long),参见 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
3.4. 检查点 1¶
3.5. 互动:Java 变量¶
3.5.1. 小数格式¶
java.text.DecimalFormat 类提供了格式化实数输出的功能。例如在示例 Bank.java 中, df 字段是这样声明的:
private static DecimalFormat df = new DecimalFormat("0.00");
因此在整个类中,都可以使用 DecimalFormat 对象将数字格式化为字符串。例如:
System.out.println("withdrawing $" + df.format(amount));
或者
buffer.append(df.format(accountBalance));
请注意,也可以使用下面的格式化方式,但它不会补充前导或末尾的 0:
private static DecimalFormat df = new DecimalFormat("#.##");
有关小数格式化的更多细节,请参考: https://docs.oracle.com/javase/tutorial/i18n/format/decimalFormat.html。
3.6. 检查点 2¶
3.7. 互动:Java 控制流¶
跟随视频,动手练习与探索
- 下载视频中的 java 文件(见下文),到你自己的 Eclipse 中运行和探索。你可以下载本示例的独立 *.java 文件。要运行独立的 *.java 文件,你需要:
新建一个 Eclipse 项目,然后
在项目中创建一个名为 "example" 的包(类顶部声明的包名必须与文件在 Eclipse 项目中所在的包一致),最后
将独立的 *.java 文件下载并导入到已创建的包中。
3.8. 检查点 3¶
3.9. 互动:Java 作用域与相等性¶
3.10. 检查点 4¶
3.11. Java 对象与枚举¶
3.11.1. Java 枚举¶
枚举(Enum)类型提供了一种类型,可以为其赋予一组预定义的常量值。与 String 相比,使用枚举类型提供了一组有界的常量值;与整数相比,它提供了一组更具描述性、更容易阅读的值。例如,不用数字 1 到 7 表示一周的每一天,我们可以这样声明:
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY
}
枚举类型可以放在自己的文件中,也可以嵌套在另一个类里面。当你编译时就能确定所有可能的取值范围时,就应该使用枚举类型,例如一年的月份、罗盘方向、菜单选项或游戏中的位置。枚举类型可以提高类型安全性,尤其是当方法的参数是枚举类型时。枚举类型可以用 == 运算符和 switch 语句进行比较。
有关枚举类型的更多细节,请参考: https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html。
我们将把枚举类型与 switch 语句(下文会讨论)结合使用,来试验 Bank.java。
3.11.2. switch 语句¶
switch 语句可以根据变量的多个可能取值来控制执行流程。它们通常与枚举类型一起使用,但也可以用于某些基本类型(如 int 和 char),还可以用于 String 和某些包装类(Wrapper class),如 Integer 和 Character。
可以用 switch 语句替代一系列 if 语句或嵌套的 if-else 语句。例如,在 Bank.java 代码中……
if (response.equals("1")) {
withdraw(20.00);
}
else if (response.equals("2")) {
deposit(20.00);
}
else if (response.equals("3")) {
displayAccountBalance();
}
else {
System.out.println("You entered an invalid choice.");
}
可以替换为:
switch (response) {
case "1":
withdraw(20.00);
break;
case "2":
deposit(20.00);
break;
case "3":
displayAccountBalance();
break;
default:
System.out.println("You entered an invalid choice.");
}
请注意,在这个示例中,每个 case 都包含一条 break 语句。如果没有 break 语句,switch 语句中后续的代码行也会被执行。
给定如下枚举类型:
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY
}
一个 switch 语句示例可以是:
switch(today) {
case SATURDAY:
System.out.println("Stores are crowded today");
break;
case MONDAY:
case TUESDAY:
System.out.println("Stores are stocked up today");
break;
case WEDNESDAY:
System.out.println("It's double coupon day");
default:
System.out.println("Happy shopping!");
}
请注意,当 today 是 MONDAY 时,会继续执行 TUESDAY 分支的代码。当 today 是 WEDNESDAY 时,会打印 It’s double coupon day ,并继续执行到 default 分支,也打印默认消息。
有关 switch 语句的更多细节,请参考: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html。
