Java程序设计

主讲教师: 郑如滨 副教授 / 集美大学

教学进度:
  • 预报名
  • 进行中
  • 已结束

学时安排:56学时

学分:3.5分

主要讲解Java程序设计。课程不仅包含讲授理论的视频,还包含在线编程练习。从理论与实践两个方面带领学生进入Java面向对象编程世界。课程每章均设有章节测验,并提供完整课件的下载,方便自学。课程中的丰富资源可为教师开展SPOC教学提供有力支撑。本课程制作精良、内容丰富,为福建省精品线上一流课程。
  • 10692373

    累计页面浏览量

  • 20304

    累计选课人数

  • 23785

    累计互动次数

09-01 17:37 郑如滨 集美大学 在Java程序设计课程中提问:

思考:随机生成大量不同的id

有一个Student类,其属性(Integer id, String name)。现在想编写一个程序,随机生成10万个学生,这些学生的id范围是1-50万。要求生成的学生的id不能相同。 1. 你觉的使用什么集合类来存储学生?为什么? 2. 给出你的代码。

  • 12-16 12:00 李志雄

    1.使用 HashSet<Student>
    原因:
    (1)自动去重(需重写 Student 的 equals 和 hashCode,基于 id)
    (2)插入和查找效率高(O(1))
    (3)不需要保持顺序

    2. 代码实现
    import java.util.*;

    class Student {
    private Integer id;
    private String name;

    public Student(Integer id, String name) {
    this.id = id;
    this.name = name;
    }

    @Override
    public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Student student = (Student) o;
    return Objects.equals(id, student.id);
    }

    @Override
    public int hashCode() {
    return Objects.hash(id);
    }
    }

    public class Main {
    public static void main(String[] args) {
    Set<Student> students = new HashSet<>();
    Random random = new Random();

    while (students.size() < 100000) {
    int id = random.nextInt(500000) + 1;
    students.add(new Student(id, "Student_" + id));
    }

    System.out.println("生成数量: " + students.size());
    }
    }
  • 查看全部(8条)

08-06 16:22 郑如滨 集美大学 在Java程序设计课程中提问:

思考:静态嵌套类的使用

阅读如下代码,回答以下三个问题: 1. 代码中ArrayAlg的静态嵌套类Pair的作用是什么? 2. 你觉得在这里将其定义为静态嵌套类有什么好处? 3. 如果将public static class Pair改成public class Pair,怎样修改源代码才能使其运行?并说

  • 12-16 11:52 李志雄

    1.静态嵌套类是定义在另一个类内部的类,它可以不依赖于外部类实例化,并且可以访问外部类的静态成员。
    2.独立于外部类实例
  • 查看全部(9条)

08-06 15:23 郑如滨 集美大学 在Java程序设计课程中提问:

思考:final关键字的使用

1.尝试编写一个类MyString继承子String类。能否成功?查看String类源代码,试分析原因。 2.查看Math类的源代码,其PI、E属性为什么要声明为final?要达到什么效果? 3.什么时候才需要使用final来修饰方法? 4.想要编写一个工具类MyUtil,里面只包

  • 12-16 11:49 李志雄

    1. 不能成功。
    查看String类的源代码可知,String类被final关键字修饰:
    public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
    // ... 类内容
    }
    final修饰类的含义是 “该类不允许被继承”。因此,任何尝试继承String类的代码(如class MyString extends String)都会编译报错,这是 Java 语言对String类的设计限制,目的是保证String对象的不可变性(final类无法被重写方法,避免子类破坏其不可变特性)。
    2. Math 类的PI、E属性为什么声明为final?要达到什么效果?
    Math类的PI(圆周率)和E(自然常数)声明为final的原因是:
    这两个属性是数学中固定不变的常量(PI≈3.14159,E≈2.71828),一旦定义后不允许被修改。
    final修饰基本数据类型的属性时,会使其成为 “常量”,值在初始化后无法被重新赋值,可避免被意外篡改(如Math.PI = 3这样的错误操作会编译报错)。
    效果:保证PI和E的值在程序运行过程中始终保持不变,符合数学定义的严谨性,同时避免因误修改导致的逻辑错误。
    3. 什么时候需要用final修饰方法?
    final修饰方法的核心目的是禁止子类重写该方法,通常在以下场景使用:
    保护核心逻辑不被篡改:当方法实现了类的核心功能(如安全校验、算法核心步骤),不希望子类修改其逻辑时,用final修饰。例如:String类的equals()方法(保证字符串相等性判断逻辑统一)。
    提高性能:早期 JVM 会对final方法进行静态绑定(编译时确定调用关系),避免动态绑定的开销(现代 JVM 优化后该作用弱化,但仍有语义价值)。
    明确设计意图:通过final声明 “该方法不允许被重写”,向其他开发者传递设计约束,避免不必要的重写导致逻辑混乱。
    4. 编写工具类MyUtil(仅含 static 方法,不允许继承和创建对象)
    要满足 “不允许继承” 和 “不允许创建对象”,需:
    用final修饰类(禁止继承);
    定义private构造方法(禁止外部用new创建对象)。
    代码实现:
    /**
    * 工具类:仅包含static方法,不允许继承和创建对象
    */
    public final class MyUtil {
    // 私有构造方法:禁止外部用new创建对象
    private MyUtil() {
    // 可选:抛出异常,防止通过反射创建对象(增强安全性)
    throw new AssertionError("工具类不允许实例化");
    }

    // 示例static方法:计算两数之和
    public static int add(int a, int b) {
    return a + b;
    }

    // 示例static方法:判断是否为偶数
    public static boolean isEven(int num) {
    return num % 2 == 0;
    }
    }
    说明:
    final修饰类 → 无法被其他类继承(如class SubUtil extends MyUtil会编译报错)。
    private构造方法 → 外部无法调用new MyUtil()创建对象,确保工具类仅通过类名调用静态方法(如MyUtil.add(1, 2))。
    构造方法中抛出异常 → 防止通过反射强行调用私有构造方法创建对象(增强安全性)。
  • 查看全部(8条)

08-02 10:04 郑如滨 集美大学 在Java程序设计课程中提问:

思考:购物车案例中的代码有何可以改进的地方?

在你看来,购物车案例中的代码有什么可以改进的地方?可以从类的设计、命名,属性、方法的设计与命名入手。 注意:进行面向对象设计时应考虑具体的系统功能需求。

  • 12-16 11:48 李志雄

    错误处理和异常管理
    输入验证
    使用更合适的命名约定
    优化数据结构和算法
    增加注释和文档
    安全性改进
  • 查看全部(5条)

08-02 09:31 郑如滨 集美大学 在Java程序设计课程中提问:

思考:什么时候使用static?

1. 定义类的时候,什么样的方法和属性应该声明为static,什么样的方法和属性不声明为static? 2. Person类的name、age、getAge等是否应该声明为static? 3. 为什么String的valueOf方法声明为static,而substring方法不声明为st

  • 12-16 11:48 李志雄

    1. static使用规则:

    声明static:类共享属性、不依赖对象的工具方法;

    不声明static:对象独有属性、依赖实例的方法。

    2. Person类:name、age、getAge()均不声明static(属于对象独有数据/依赖实例)。

    3. String方法:

    valueOf:static(工具方法,不依赖String实例);

    substring:非static(依赖当前String对象的字符序列)。
  • 查看全部(10条)

07-29 16:16 郑如滨 集美大学 在Java程序设计课程中提问:

思考:对象的初始化

1.构造方法有什么用?一般在构造方法中编写什么代码? 2.如果一个类有多个构造方法,创建对象时怎么确定调用哪个? 3.任何一个类都有无参数构造方法吗?一个类不编写构造方法可以吗? 4.新建对象,初始化块先执行还是构造方法先执行? 5.为什么有构造方法可以进行初始化工作,还需要

  • 12-16 11:47 李志雄

    1. 构造方法的作用及通常编写的代码
    作用:构造方法是类中用于初始化对象的特殊方法,在创建对象(new 类名())时自动调用,确保对象在使用前处于一个合理的初始状态。
    通常编写的代码:
    对成员变量进行初始化(如设置默认值、通过参数赋值);
    执行对象创建时必需的准备工作(如初始化资源、连接数据库等)。
    例如:Circle类的构造方法初始化radius,User类的构造方法初始化name和age。
    2. 多个构造方法时,如何确定调用哪个?
    通过传入的参数列表(参数的类型、数量、顺序) 匹配对应的构造方法。
    若调用new 类名(),则匹配无参数构造方法;
    若调用new 类名(参数1, 参数2),则匹配参数类型、数量、顺序完全一致的构造方法。
    例如:
    class Person {
    Person() {} // 无参构造
    Person(String name) {} // 单参数构造
    Person(String name, int age) {} // 双参数构造
    }

    // 调用时:
    new Person(); // 匹配无参构造
    new Person("张三"); // 匹配单参数构造
    new Person("李四", 20); // 匹配双参数构造
    3. 任何类都有无参数构造方法吗?一个类不编写构造方法可以吗?
    不是任何类都有无参数构造方法:当类中没有手动定义任何构造方法时,Java 会自动生成一个默认的无参数构造方法(隐式存在);但如果手动定义了构造方法(无论是否有参数),Java 就不会再生成默认无参构造,此时若未手动定义无参构造,则类中不存在无参构造。
    一个类可以不编写构造方法:此时 Java 会自动生成默认无参构造,确保对象能被正常创建(new 类名())。
    4. 新建对象时,初始化块与构造方法的执行顺序
    初始化块先执行,构造方法后执行。初始化块是类中独立于构造方法的代码块,用于提取所有构造方法的共同初始化逻辑,每次创建对象时,会先执行初始化块,再执行对应的构造方法。
    例如:
    class Test {
    { System.out.println("初始化块执行"); } // 初始化块
    Test() { System.out.println("构造方法执行"); }
    }

    // 执行new Test()的输出:
    // 初始化块执行
    // 构造方法执行
    5. 已有构造方法为何还需要初始化块?
    初始化块的核心作用是提取多个构造方法的重复初始化逻辑,减少代码冗余。
    当一个类有多个构造方法,且所有构造方法都需要执行相同的初始化操作(如日志打印、通用变量赋值)时,将这些操作放在初始化块中,无需在每个构造方法中重复编写;
    初始化块的执行时机早于构造方法,适合执行一些 “对象创建前必须完成的基础准备工作”。
    例如:
    class Student {
    // 所有构造方法都需要打印日志,放在初始化块中
    { System.out.println("创建Student对象..."); }

    Student() {} // 无参构造
    Student(String name) {} // 有参构造
    }
  • 查看全部(7条)

07-15 11:01 郑如滨 集美大学 在Java程序设计课程中提问:

思考:引用数据类型与基本数据类型的区别是什么?

分析如下代码,并回答如下4个问题: String str1 = new String("123"); String str2 = new String("123"); System.out.println(str1==str2);//1.输出什么?为什么? System.out.

  • 12-16 11:47 李志雄

    引用数据类型与基本数据类型的区别:存储方式:基本数据类型直接存储值,引用数据类型存储的是内存地址。内存分配:基本数据类型在栈上分配内存,引用数据类型在堆上分配内存。值的复制:基本数据类型复制的是值,引用数据类型复制的是引用。作用域:基本数据类型的变量作用域受限于函数或代码块,引用数据类型的变量作用域可以跨越多个函数或代码块。生命周期:基本数据类型的变量生命周期在函数执行期间,引用数据类型的变量生命周期由引用计数决定。可变性:基本数据类型是不可变的,引用数据类型可以改变其指向的对象。
  • 查看全部(9条)

07-12 08:40 郑如滨 集美大学 在Java程序设计课程中提问:

思考:循环的使用

1.一般来说什么时候使用for什么时候使用while?试举例说明 2.for循环与while循环可以相互转换吗?试举例说明 3.while(true){.........}与for(;;){.....}都是死循环,计算机会不断执行循环体中的东西。这样的代码有意义吗?试举例说明

  • 12-16 11:46 李志雄

    1.for 循环:适用于循环次数已知或可提前确定的场景(如遍历固定长度的集合、执行固定次数的操作)。其语法本身集成了循环变量的初始化、条件判断和更新,结构更紧凑。
    while 循环:适用于循环次数未知,仅依赖某个条件是否成立的场景(如等待用户输入特定值、处理动态生成的数据直到满足退出条件)。
    for 循环示例:遍历一个长度为 5 的数组(已知循环次数为 5)
    int[] arr = {1, 2, 3, 4, 5};
    for (int i = 0; i < arr.length; i++) { // 初始化、条件、更新一体化
    System.out.println(arr[i]);
    }
    while 循环示例:等待用户输入 "quit" 才退出(循环次数未知,依赖用户输入)
    Scanner scanner = new Scanner(System.in);
    String input = "";
    while (!input.equals("quit")) { // 仅依赖条件判断
    System.out.print("请输入(输入quit退出):");
    input = scanner.nextLine();
    }
    2.可以相互转换。两者的核心都是 “条件判断 + 循环体执行”,区别仅在于语法结构,逻辑上可等价转换。
    for 循环转 while 循环:原 for 循环(计算 1-10 的和):
    int sum = 0;
    for (int i = 1; i <= 10; i++) {
    sum += i;
    }
    等价的 while 循环:
    int sum = 0;
    int i = 1; // 初始化移到外部
    while (i <= 10) { // 条件判断
    sum += i;
    i++; // 更新操作移到循环体内部
    }
    while 循环转 for 循环:原 while 循环(读取输入直到为 0):
    Scanner scanner = new Scanner(System.in);
    int num = scanner.nextInt();
    while (num != 0) {
    System.out.println("输入的数:" + num);
    num = scanner.nextInt();
    }
    等价的 for 循环(初始化和更新可写在对应位置,条件为核心判断):
    Scanner scanner = new Scanner(System.in);
    for (int num = scanner.nextInt(); num != 0; num = scanner.nextInt()) {
    System.out.println("输入的数:" + num);
    }
    3.有意义。死循环并非 “无意义的无限执行”,而是通过循环体内部的break 或 return主动控制退出时机,适用于需要 “持续运行直到特定条件触发退出” 的场景。
    举例:
    服务器端口监听:服务器需要持续监听客户端连接,直到手动关闭服务(通过外部信号触发 break)
    ServerSocket serverSocket = new ServerSocket(8080);
    while (true) { // 持续运行
    Socket clientSocket = serverSocket.accept(); // 阻塞等待客户端连接
    // 处理客户端请求...
    if (需要关闭服务) { // 如接收到关闭命令
    break; // 主动退出死循环
    }
    }
    菜单交互系统:程序持续显示菜单,直到用户选择 “退出” 选项
    Scanner scanner = new Scanner(System.in);
    for (;;) { // 死循环
    System.out.println("1. 查看信息 2. 修改信息 3. 退出");
    int choice = scanner.nextInt();
    if (choice == 3) {
    break; // 用户选择退出,终止循环
    }
    // 处理其他选项...
    }
  • 查看全部(10条)

07-09 15:20 郑如滨 集美大学 在Java程序设计课程中提问:

思考:java HelloWorld命令的含义

在命令行下输入java HelloWorld执行程序。 1.这里的HelloWorld指的是文件名吗?如果不是,那是什么? 2.java程序可以跨平台运行的原因是什么?可以跨平台运行的是.java文件还是.class文件? 3.该命令执行后,到底是JRE、JDK、JVM还是Eclipse负

  • 12-16 11:46 李志雄

    1. HelloWorld 不是文件名,而是类名

    Java 是面向对象语言,程序的执行入口是  public static void main(String[] args)  方法,且该方法必须定义在一个公开(public)的类中。

    - 命令  java HelloWorld  的核心是告诉 JVM:“去执行名为  HelloWorld  的公开类中的  main  方法”。
    - 对应的文件名通常需与公开类名一致(如  HelloWorld.java ),这是 Java 的规范(便于编译器查找),但命令执行时不依赖文件名,只依赖类名。

    2. Java 跨平台的核心是 JVM,可跨平台的是  .class  文件

    1. 跨平台原因:Java 引入了“一次编译,到处运行”的机制,核心在于 Java 虚拟机(JVM)。
    - 不同操作系统(Windows、Linux、Mac)会提供对应的 JVM 版本,JVM 负责将统一的字节码翻译成当前系统能识别的机器指令,屏蔽了底层系统差异。
    2. 可跨平台的文件:是  .class  文件(字节码文件),而非  .java  文件(源文件)。
    -  .java  是开发者编写的源代码,必须通过编译器( javac )编译成  .class  字节码文件,JVM 只能识别并执行  .class  文件。

    3. 负责找到并载入文件的是 JRE 中的 JVM

    - JDK:包含编译器( javac )、开发工具等,用于编写和编译代码,不负责程序的运行。
    - Eclipse:是集成开发环境(IDE),仅在开发阶段提供代码编写、编译、调试的可视化工具,命令行执行程序时与它无关。
    - JRE:Java 运行时环境,包含 JVM 和运行程序所需的核心类库。执行  java HelloWorld  时,JRE 中的 JVM 会:
    1. 在当前目录(或类路径  classpath  指定的路径)中查找  HelloWorld.class  文件;
    2. 将该字节码文件载入内存,解析并执行其中的  main  方法。
  • 查看全部(13条)

07-09 14:59 郑如滨 集美大学 在Java程序设计课程中提问:

思考:怎么学习Java?

看了前面课程对Java的介绍,你觉得? 1. Java学习主要包含哪几部分? 2. 学习Java只是看看视频、做做客观题就行了吗?还需要做些什么? 3. 你学习Java是为了做什么?(企业级应用、手机APP、桌面应用、其他)

  • 12-16 11:46 李志雄

    学习Java基础语法。
    理解面向对象编程(OOP)概念。
    掌握Java集合框架。
    学习异常处理和I/O操作。
    熟悉Java多线程。
    掌握Java网络编程。
    学习Java Swing或JavaFX进行GUI开发。
    熟悉Java数据库连接(JDBC)。
    学习Java设计模式。
    实践项目,如开发小型应用或参与开源项目。
    学习并使用Java框架(如Spring、Hibernate等)。
    持续阅读官方文档和参考书籍。
    参加在线课程或培训。
    加入Java社区,如Stack Overflow、GitHub等。
    定期复习和总结所学知识。
  • 查看全部(11条)

常见问题

  • 1.我该如何学习这门课程?

    (1)首先您要注册一个学银在线的账号。

    (2)您需要有一定的上网条件,能够流畅的观看教学视频。在观看的过程中,您可以选择在PC端登陆我们的网页, 也可以选择下载我们的app学习通,通过手机客户端来学习。

    (3)您一旦报名选择了课程,我们的课程主讲老师或课程团队会通过通知的形式给您发送课程有关的消息,同时会抄送您的邮箱,请您及时查收。

  • 2.我在学习过程中遇到问题了,怎么办?

    您可以通过以下几种方式获取帮助:

    (1)在课程群聊中发布求助信息,说不定和你一起学习这门课的小伙伴就能够解决你的问题呢;

    (2)在课程讨论区留言,课程团队看到后将会及时回复。

    (3)联系我们的客服,或者随时给我们发邮件,邮箱地址:xueyinkf@chaoxing.com。

  • 3.我是新手,能否给我一些学习建议?

    (1)我们的课程采用MOOC的方式授课,因此您可以自由安排您的学习时间、学习地点。但我们仍旧希望您每周能都有固定的时间持续进行本课程的学习,根据人的记忆曲线显示这种规律的学习方式能够最大限度的提升您的学习质量。

    (2)学习的过程比较容易,为了检验您的学习成果,我们的课程团队会在课程章节结束后布置测验或作业,希望您尽可能的按时独立完成。如果有没有掌握的知识点,您可以继续回看复习课程。

    (3)希望您能够积极参与课程的讨论,与各位学习者一起煮酒论英雄。在讨论的过程中,不光可以对课程所学内容温习内化,还能互相碰撞出思想的火花,相信您一定会有额外的收获。

  • 4.课程会不会很难、很枯燥?

    (1)我们的课程都是老师经过精心设计拍摄制作而成,并且由于是MOOC的方式,所以课程拆分成了不同的知识点,学习起来一点也不费劲。

    (2)我们的课程多采取理论结合实际的授课方式,课程中也有许多案例的呈现,相信会给学习者带来诸多方面的启发。我们也将力求做到深入浅出,支持学习者将研究发现转化为实践,改进自身教学。