Java学习1 之 【核心机制、程序基础结构、I/O】

目录

[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. 面向对象三大特征

  1. **封装:**信息隐藏,将状态信息设为private,通过get/set方法访问,保证安全性
  2. **继承:**子类自动共享父类数据和方法(extends),提高代码复用性和可维护性
  3. **多态:**父类引用指向子类对象,同一消息(方法调用)根据接收者不同产生不同效果

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. 编译与运行流程

  1. 编写源文件(HelloWorld.java) ->
  2. 编译(javac HelloWorld.java) ->
  3. 生成字节码(HelloWorld.class) ->
  4. 运行(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 输入 truefalse(不区分大小写)。若标记不是布尔值会抛 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.inScanner 会影响后续输入,通常不关闭
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
相关推荐
青山木1 小时前
RocketMQ 入门到原理(六):可靠性全景
java·后端·中间件·架构·rocketmq
青山木1 小时前
RocketMQ 入门到原理(五):特殊消息类型
java·后端·中间件·架构·rocketmq
她的男孩1 小时前
数据库改了配置,说好的 30 秒自动刷新根本没跑:那条 @Scheduled 是注释状态
java·后端·架构
君顾11 小时前
西安24小时自助健身房系统软件开发实战:需求分析与技术落地指南
java·开发语言·健身房
starzy19902 小时前
Flink Session Window 详解及代码实现:从用户会话切割到窗口合并机制
java·flink
gb42152872 小时前
FastExcel和EasyExcel的区别
java
我不会起名字3222 小时前
一天一道力扣Hot100(37):深度优先算法--括号生成
java·数据结构·c++·后端·python·算法·go
大圣编蚕2 小时前
Java 运算符详解:赋值类运算符
java