目录
1. Java 核心机制、与C/C++的差异
1.1 Java的核心机制
- JVM(Java虚拟机):跨平台的核心,读取并处理经编译过的字节码文件(*.class)
- 代码安全:沙箱机制、字节码校验
- 垃圾回收(GC):系统级线程自动管理内存,无需程序员手动释放
- JDK vs JRE vs JVM:
- JVM = 虚拟机核心
- JRE = JVM + 核心类库(JRE 运行程序时起到加载、校验、执行代码的作用)
- JDK = JRE + 开发工具(javac, java, jar等,开发者需安装)
1.2 Java与C/C++的差异
- 无指针直接操作,自动内存管理
- 不支持宏、多重继承(类)、全局变量和GOTO
- 数据长度固定(跨平台优势)
2. 面向对象程序设计(OOP)核心思想
2.1. 面向过程 vs 面向对象
- 面向过程:分析解决问题的步骤,用函数逐步实现(映射现实问题的步骤)
- 面向对象:将现实世界实体抽象成对象,描述其属性、行为及联系(映射现实世界的实体)
2.2. 类与对象
- 对象(Object):现实世界的实体,具有状态(属性)和行为(方法)
- 类(Class):具有相同属性和行为的对象的集合与抽象,是对象的模板
class Person {
int age; // 属性
String name;
void sayHello() { ... } // 行为
}
Person one = new Person(); // 实例化对象
2.3. 面向对象三大特征
- 封装:信息隐藏,将状态信息设为private,通过get/set方法访问,保证安全性
- 继承:子类自动共享父类数据和方法(extends),提高代码复用性和可维护性
- 多态:父类引用指向子类对象,同一消息(方法调用)根据接收者不同产生不同效果
3. Java程序基础结构与输入输出
3.1. 第一个Java程序
package ch01; // 包声明
import java.util.*; // 导入
public class HelloWorld { // 类声明
public static void main(String[] args) { // 主方法(入口)
System.out.println("Hello World");
}
}
- 类定义是 Java 程序的主体
- 文件名(扩展名为 .java)应与 public 类名同名
- 一个 .java 文件中最多只能有一个 public 类
- main() 方法是 Java 应用程序的入口,首部写法固定
- 一个可独立运行的 Java 应用程序通常有且只有一个主类,该主类包含 main() 方法,作为程序入口,语法上,多个类都可以定义 main(),运行时通过 java 类名 指定入口类
3.2. 编译与运行流程
- 编写源文件(HelloWorld.java) ->
- 编译(javac HelloWorld.java) ->
- 生成字节码(HelloWorld.class) ->
- 运行(java HelloWorld,由JVM解释执行)
3.3 文本 I/O
文本 I/O 是 Java 中最基础的输入输出方式,通过 System.out 进行输出,通过 Scanner 类进行输入。它适用于控制台程序、调试输出和简单的用户交互场景
- 标准输出接口
| 接口名称 | 功能说明 | 特点 | 适用场景 |
| System.out.print() | 输出内容但不换行 | 连续输出时内容在同一行 | 拼接输出、进度提示 |
| System.out.println() | 输出内容并自动换行 | 每次输出后光标移至下一行 | 常规信息输出、日志打印 |
| System.out.printf() | 格式化输出,支持占位符 | 类似 C 语言 printf,可控制格式 | 对齐输出、数值格式化、模板输出 |
代码示例
// print() 示例:不换行输出
System.out.print("Hello, ");
System.out.print("World!"); // 输出: Hello, World!
// println() 示例:自动换行
System.out.println("第一行");
System.out.println("第二行"); // 两行分别输出
// printf() 示例:格式化输出
String name = "Alice";
int age = 25;
double score = 98.5;
System.out.printf("姓名: %s, 年龄: %d, 成绩: %.1f%n", name, age, score);
// 输出: 姓名: Alice, 年龄: 25, 成绩: 98.5
- 常用格式说明符
| 说明符 | 含义 | 示例 |
|---|---|---|
%s | 字符串 | System.out.printf("%s", "Java"); |
%d | 整数 | System.out.printf("%d", 100); |
%f | 浮点数 | System.out.printf("%f", 3.14); |
%.2f | 保留两位小数 | System.out.printf("%.2f", 3.14159); |
%n | 换行 | System.out.printf("Hello%n"); |
- 文本输入:java.util.Scanner
Scanner 是类,通常包装 System.in 读取控制台输入
| 法名称 | 功能说明 | 返回值类型 | 注意事项 / 示例 |
|---|---|---|---|
new Scanner(System.in) | 创建绑定标准输入的 Scanner 实例 | Scanner | 通常只创建一次,避免重复创建 |
nextInt() | 读取下一个整数 | int | 若输入非整数或超出 int 范围,抛出 InputMismatchException。范围:-2³¹ ~ 2³¹-1 |
nextLong() | 读取下一个长整数 | long | 范围:-2⁶³ ~ 2⁶³-1。适合题目中 10^18 级别的整数,不要用 nextDouble() 转 long |
nextDouble() | 读取下一个双精度浮点数 | double | 支持小数点格式,注意区域设置(如某些地区用逗号作小数点)。存在精度问题,不适合精确大整数 |
nextFloat() | 读取下一个单精度浮点数 | float | 精度较低,范围较小,一般不推荐用于精确计算 |
nextBoolean() | 读取下一个布尔值 | boolean | 输入 true 或 false(不区分大小写)。若标记不是布尔值会抛 InputMismatchException |
nextByte() | 读取下一个字节整数 | byte | 范围:-128 ~ 127 |
nextShort() | 读取下一个短整数 | short | 范围:-32768 ~ 32767 |
next() | 读取下一个单词(以空白分隔) | String | 自动跳过前导空白字符(包括空格、制表符、换行符等),然后读取下一个“单词”,直到遇到下一个空白字符才停止。输入结束会抛 NoSuchElementException |
nextLine() | 读取整行内容(包括空格) | String | 返回行尾之前的字符串,不包括换行符。与 nextInt() 等混用时注意换行符残留问题(见下方常见问题) |
nextBigInteger() | 读取下一个大整数 | BigInteger | 需导入 java.math.BigInteger,可处理任意精度整数 |
nextBigDecimal() | 读取下一个大十进制数 | BigDecimal | 需导入 java.math.BigDecimal,适合高精度小数计算 |
hasNext() | 判断是否还有下一个标记 | boolean | 常用于循环读取,如 while (in.hasNext()) |
hasNextInt() | 判断下一个标记是否为 int | boolean | 用于输入验证,防止异常。类似还有 hasNextLong()、hasNextDouble()、hasNextBoolean() 等 |
hasNextLine() | 判断是否还有下一行 | boolean | 常用于按行读取,如 while (in.hasNextLine()) |
useDelimiter(String pattern) | 设置分隔符模式 | Scanner | 默认分隔符是空白。可自定义,如 in.useDelimiter(",") 以逗号分隔 |
delimiter() | 返回当前分隔符模式 | Pattern | 返回 java.util.regex.Pattern 对象 |
skip(String pattern) | 跳过匹配指定模式的输入 | Scanner | 若输入不匹配会抛 NoSuchElementException |
findInLine(String pattern) | 在当前行中查找指定模式 | String | 若找到返回匹配字符串,否则返回 null。会移动指针 |
findWithinHorizon(String pattern, int horizon) | 在指定范围内查找模式 | String | horizon 为搜索字符数,0 表示整个输入 |
reset() | 重置 Scanner 状态 | Scanner | 清除自定义分隔符等设置 |
close() | 关闭 Scanner,释放资源 | void | 关闭后不可再使用;关闭 System.in 的 Scanner 会影响后续输入,通常不关闭 |
locale() | 返回此 Scanner 的区域设置 | Locale | 影响数字格式,如小数点符号 |
radix() | 返回此 Scanner 的默认基数 | int | 默认是 10 |
toString() | 返回 Scanner 的字符串表示 | String | 调试用 |
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取整数
System.out.print("请输入年龄: ");
int age = scanner.nextInt();
// 读取浮点数
System.out.print("请输入身高(m): ");
double height = scanner.nextDouble();
// 消费 nextDouble() 后残留的换行符
scanner.nextLine();
// 读取整行字符串
System.out.print("请输入姓名: ");
String name = scanner.nextLine();
// 输出结果
System.out.printf("姓名: %s, 年龄: %d, 身高: %.2f m%n", name, age, height);
// 关闭资源
scanner.close();
}
}
- nextInt()、nextDouble() 等方法不会消费行末的换行符,后续调用 nextLine() 会读到空字符串,需手动调用一次 scanner.nextLine() 消费
- 生产环境中建议使用 hasNextInt() 等方法进行输入校验,避免程序崩溃
- 不要对绑定 System.in 的 Scanner 调用 close(),否则会导致 System.in 关闭,后续无法再读取输入
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class InputDemo {
// main() 是 Java 应用程序的入口,写法固定
public static void main(String[] args) {
// 在 try 外声明变量,保证 try-catch 之后仍能使用
String s = "";
int n = 0;
double d = 0;
try {
// 装饰器模式:System.in(字节流) -> InputStreamReader(字节转字符) -> BufferedReader(缓冲)
// BufferedReader 提供 readLine(),方便按行读取输入
BufferedReader in = new BufferedReader(
new InputStreamReader(System.in)
);
// 提示并读取一行字符串
System.out.print("Please input an int: ");
s = in.readLine(); // readLine() 返回 String,输入结束返回 null
n = Integer.parseInt(s); // 字符串转 int,格式错误会抛 NumberFormatException
System.out.print("Please input a double: ");
s = in.readLine();
d = Double.parseDouble(s); // 字符串转 double,格式错误会抛 NumberFormatException
// 输出结果
System.out.println("n = " + n);
System.out.println("d = " + d);
} catch (IOException e) {
// IOException 是受检异常,必须捕获或声明抛出
// 常见于 readLine() 读取失败
System.out.println("IO 异常:" + e.getMessage());
} catch (NumberFormatException e) {
// NumberFormatException 是运行时异常
// 当输入的字符串无法转换为数字时抛出
System.out.println("数字格式异常:" + e.getMessage());
}
}
}
3.4. 图形界面 I/O
- 使用文本框对象(JTextField)获取用户输入的数据
- 使用标签对象(JLabel)或文本框对象输出数据
- 使用命令按钮(JButton)来执行命令
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class AppGraphInOut extends JFrame {
// 组件作为成员变量
JTextField in = new JTextField(10); // 输入文本框
JButton btn = new JButton("求平方"); // 命令按钮
JLabel out = new JLabel("用于显示结果的标签"); // 输出标签
public AppGraphInOut() {
setTitle("图形界面输入输出示例");
setLayout(new FlowLayout()); // 设置流式布局
// 向窗体中添加组件
add(in);
add(btn);
add(out);
// 为按钮注册动作监听器,处理点击事件
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
// 从文本框获取输入,并转换为 double
double x = Double.parseDouble(in.getText());
double square = x * x;
// 用标签输出结果
out.setText("平方结果:" + square);
} catch (NumberFormatException ex) {
// 输入不是合法数字时的处理
out.setText("请输入合法数字");
}
}
});
// 设置窗口属性
setSize(400, 150);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null); // 窗口居中
setVisible(true);
}
public static void main(String[] args) {
// 建议在事件分发线程中创建 GUI
SwingUtilities.invokeLater(() -> new AppGraphInOut());
}
}
3.5. 代码规范与开发环境
- 规范:注释(//单行注释,/* */多行注释,/** */文档注释)、合理命名、适当缩进、块风格

- 主流IDE:IntelliJ IDEA(目前主流)、Eclipse、NetBeans、VS Code

248

被折叠的 条评论
为什么被折叠?



