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

目录

1. Java 核心机制、与C/C++的差异

2. 面向对象程序设计(OOP)核心思想

2.3. 面向对象三大特征

3. Java程序基础结构与输入输出

3.1. 第一个Java程序

3.2. 编译与运行流程

3.3 文本 I/O

3.4. 图形界面 I/O

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()判断下一个标记是否为 intboolean用于输入验证,防止异常。类似还有 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)在指定范围内查找模式Stringhorizon 为搜索字符数,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
大气污染是影响公众健康与生态环境的重要问题,精准的空气质量时空预测与污染源贡献度量化是精准治污的关键支撑。针对现有研究多源融合不充分、时空关联刻画不足、预测与源解析割裂三方面缺陷,本文设计实现了城市空气质量时空预测与污染源贡献度分析系统,融合监测、气象、工业排放与交通四类数据,构建基于时空注意力的LSTM(STAM-LSTM)预测模型与基于正定矩阵因子分解(PMF)的源解析模型,形成数据融合-特征工程-预测-源解析-可视化闭环。 系统实现四类数据时空对齐与融合,构建时序与空间邻域特征,以普通克里金插值生成1km网格浓度场;STAM-LSTM引入时空注意力自适应学习站点间污染传输时变权重,以72小时输入预测未来24小时逐小时PM2.5浓度;PMF识别交通、工业、燃煤、扬尘与二次生成五个源因子,量化各源全年贡献度并分析时空演变。 实验表明:STAM-LSTM预测RMSE 24.6、MAE 17.8、R² 0.88,相对LSTM基线(30.2)提升18.5%;普通克里金插值误差8.9,优于反距离加权(11.4);源解析显示交通源28.4%、工业源23.1%、燃煤源19.6%为主要贡献源,冬季燃煤源升至27.3%、早高峰交通源达34.8%,下风向工业源贡献高出上风向8~12个百分点;减排情景显示交通源减排20%可使年均PM2.5下降5.7%,与源贡献度排序一致。 系统按五模块14组件实现,功能测试16项用例全部通过,为大气污染预警、源管控与减排政策制定提供了决策依据。 【课程报告内容】 摘要 第1章 绪论 第2章 相关技术与理论 第3章 系统需求分析 第4章 系统总体设计 第5章 系统详细设计与实现 第6章 系统测试与分析 第7章 总结与展望 参考文献 附件-实现指南
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值