目录
[1. Java 核心机制、与C/C++的差异](#1. Java 核心机制、与C/C++的差异)
[2. 面向对象程序设计(OOP)核心思想](#2. 面向对象程序设计(OOP)核心思想)
[2.3. 面向对象三大特征](#2.3. 面向对象三大特征)
[3. Java程序基础结构与输入输出](#3. Java程序基础结构与输入输出)
[3.1. 第一个Java程序](#3.1. 第一个Java程序)
[3.2. 编译与运行流程](#3.2. 编译与运行流程)
[3.3 文本 I/O](#3.3 文本 I/O)
[3.4. 图形界面 I/O](#3.4. 图形界面 I/O)
[3.5. 代码规范与开发环境](#3.5. 代码规范与开发环境)
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