今天我们基于面向对象集合知识,实现一个简单的「电影信息管理系统」,涵盖电影上架、下架、查询、修改、封杀明星关联电影等核心功能。


目录

一、项目介绍

1. 功能清单

2. 技术要点

二、开发环境准备

1. 基础环境

2. Lombok 配置

三、核心代码解析

第一步:定义电影实体类(Movie.java)

第二步:编写业务处理类(MovieService.java)

1. 全局变量与入口方法(start ())

2. 核心业务方法拆解

(1)上架电影(addMovie ())

(2)查询电影(queryMovie () + queryMovieByName ())

(3)封杀明星(deleteStar ())

(4)其他核心方法

第三步:编写测试类(Test.java)

四、运行演示

1. 启动系统

2. 核心操作示例

(1)上架电影

(2)展示全部电影

(3)封杀明星

(4)退出系统

五、核心知识点总结


一、项目介绍

1. 功能清单

这个控制台版电影管理系统支持 7 大核心操作

  • 上架电影:录入电影名称、主演、价格、评分,存入系统
  • 下架电影:根据电影名称删除指定电影
  • 查询电影:根据名称精准查询单部电影信息
  • 封杀明星:删除所有包含该明星主演的电影
  • 展示全部电影:列出系统中所有已上架的电影
  • 修改电影:更新指定电影的名称、主演、价格、评分
  • 退出系统:安全退出程序

2. 技术要点

  • 核心容器:ArrayList 存储电影数据(模拟数据库)
  • 面向对象:封装Movie实体类,用MovieService封装业务逻辑
  • 输入交互:Scanner 实现控制台输入
  • 简化开发:Lombok 注解(@Data/@NoArgsConstructor/@AllArgsConstructor)自动生成 get/set/ 构造方法

二、开发环境准备

1. 基础环境

  • JDK:21
  • IDE:IntelliJ IDEA

2. Lombok 配置

因为Movie类用到了 Lombok 注解,所以需要先配置:lombok配置相关文章


三、核心代码解析

第一步:定义电影实体类(Movie.java

实体类用于封装电影数据,每个电影对象对应一部电影的信息,通过 Lombok 注解简化代码:

package com.itheima.demo8test;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 电影实体类:封装电影的核心属性
 * @Data:自动生成get/set/toString/equals/hashCode方法
 * @NoArgsConstructor:自动生成无参构造器
 * @AllArgsConstructor:自动生成全参构造器
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Movie {
    private String name;    // 电影名称
    private double score;   // 电影评分
    private String actor;   // 主演
    private double price;   // 电影价格
}

第二步:编写业务处理类(MovieService.java

这是系统的核心类,封装所有电影相关的业务逻辑:

1. 全局变量与入口方法(start ()
package com.itheima.demo8test;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class MovieService {
    // 存储所有上架的电影(模拟数据库),static保证全局唯一
    private static List<Movie> movies = new ArrayList<>();
    // 控制台输入对象,static避免重复创建
    private static Scanner sc = new Scanner(System.in);

    /**
     * 系统入口方法:循环展示菜单,处理用户输入的命令
     */
    public void start() {
        while (true) { // 死循环,直到用户输入5退出
            // 打印操作菜单
            System.out.println("====电影信息操作系统===");
            System.out.println("1、上架");
            System.out.println("2、下架某个电影");
            System.out.println("3、查询某个电影");
            System.out.println("4、封杀某个明星");
            System.out.println("5、退出");
            System.out.println("6、展示全部电影");
            System.out.println("7、修改某个电影");
            System.out.println("请您输入操作命令:");
            
            // 获取用户输入的命令
            String command = sc.next();
            // 分支处理不同命令
            switch (command) {
                case "1": addMovie(); break;       // 上架电影
                case "2": deleteMovie(); break;    // 下架电影
                case "3": queryMovie(); break;     // 查询电影
                case "4": deleteStar(); break;     // 封杀明星
                case "5": System.out.println("退出成功!"); return; // 退出循环
                case "6": queryAllMovies(); break; // 展示全部
                case "7": updateMovie(); break;    // 修改电影
                default: System.out.println("命令有毛病!"); // 非法命令提示
            }
        }
    }
}
2. 核心业务方法拆解
(1)上架电影(addMovie ()
/**
 * 上架电影:录入电影信息,创建Movie对象并添加到集合
 */
private void addMovie() {
    System.out.println("===========上架电影============");
    // 1. 创建空的Movie对象
    Movie movie = new Movie();

    // 2. 控制台录入电影信息,赋值给Movie对象
    System.out.println("请您输入电影名称:");
    movie.setName(sc.next());
    System.out.println("请您输入主演:");
    movie.setActor(sc.next());
    System.out.println("请您输入电影价格:");
    movie.setPrice(sc.nextDouble());
    System.out.println("请您输入电影评分:");
    movie.setScore(sc.nextDouble());

    // 3. 将电影对象添加到集合(上架成功)
    movies.add(movie);
    System.out.println("上架成功!");
}
(2)查询电影(queryMovie () + queryMovieByName ()
/**
 * 控制台查询电影:调用工具方法,展示结果
 */
private void queryMovie() {
    System.out.println("===========查询电影============");
    System.out.println("请您输入电影名称:");
    String name = sc.next();
    // 调用工具方法查询电影对象
    Movie movie = queryMovieByName(name);
    if (movie != null) {
        // 找到电影,打印信息
        System.out.println(movie.getName() + "  " + movie.getActor() + "  " + movie.getPrice() + "  " + movie.getScore());
    } else {
        // 未找到,提示信息
        System.out.println("没有找到这个电影!");
    }
}

/**
 * 工具方法:根据电影名称查询电影对象(封装复用)
 */
public Movie queryMovieByName(String name) {
    for (Movie m : movies) {
        // 精准匹配电影名称
        if (m.getName().equals(name)) {
            return m; // 找到后直接返回对象
        }
    }
    return null; // 未找到返回null
}
(3)封杀明星(deleteStar ()
/**
 * 封杀明星:删除所有该明星主演的电影
 */
private void deleteStar() {
    System.out.println("===========封杀明星============");
    System.out.println("请您输入要封杀的明星:");
    String star = sc.next();

    // 遍历集合,删除包含该明星的电影
    for (int i = 0; i < movies.size(); i++) {
        Movie movie = movies.get(i);
        // 模糊匹配主演(比如“吴某”能匹配“吴某、刘某”)
        if (movie.getActor().contains(star)) {
            movies.remove(movie); // 删除该电影
            i--; // 关键!删除元素后,集合长度减1,索引退一步避免漏查
        }
    }
    System.out.println("封杀成功!");
    // 封杀后展示剩余电影
    queryAllMovies();
}
(4)其他核心方法
// 展示全部电影:增强for循环遍历集合,打印每部电影信息
private void queryAllMovies() {
    System.out.println("===========展示全部电影============");
    for (Movie m : movies) {
        System.out.println(m.getName() + "  " + m.getActor() + "  " + m.getPrice() + "  " + m.getScore());
    }
}

// 下架电影:根据名称删除指定电影
private void deleteMovie() {
    System.out.println("===========下架电影============");
    System.out.println("请您输入要下架的电影名称:");
    String name = sc.next();
    for (int i = 0; i < movies.size(); i++) {
        Movie movie = movies.get(i);
        if (movie.getName().equals(name)) {
            movies.remove(movie);
            System.out.println("下架成功!");
        }
    }
}

// 修改电影:找到指定电影,更新其属性
private void updateMovie() {
    System.out.println("===========修改电影============");
    System.out.println("请您输入要修改的电影名称:");
    String name = sc.next();
    for (int i = 0; i < movies.size(); i++) {
        Movie movie = movies.get(i);
        if (movie.getName().equals(name)) {
            // 录入新信息,覆盖原有属性
            System.out.println("请您输入新的电影名称:");
            movie.setName(sc.next());
            System.out.println("请您输入新的主演:");
            movie.setActor(sc.next());
            System.out.println("请您输入新的电影价格:");
            movie.setPrice(sc.nextDouble());
            System.out.println("请您输入新的电影评分:");
            System.out.println("修改成功!");
        }
    }
}

第三步:编写测试类(Test.java

系统入口类,创建MovieService对象并启动系统:

package com.itheima.demo8test;

public class Test {
    public static void main(String[] args) {
        // 1. 创建电影业务处理对象
        MovieService movieService = new MovieService();
        // 2. 启动电影管理系统
        movieService.start();
    }
}

四、运行演示

1. 启动系统

运行Test.javamain方法,控制台输出菜单:

====电影信息操作系统===
1、上架
2、下架某个电影
3、查询某个电影
4、封杀某个明星
5、退出
6、展示全部电影
7、修改某个电影
请您输入操作命令:

2. 核心操作示例

(1)上架电影

输入1,按提示录入信息:

===========上架电影============
请您输入电影名称:
流浪地球2
请您输入主演:
吴某、刘某
请您输入电影价格:
45.9
请您输入电影评分:
9.4
上架成功!
(2)展示全部电影

输入6,查看已上架的电影:

===========展示全部电影============
流浪地球2  吴某、刘某  45.9  9.4
(3)封杀明星

输入4,封杀 “吴某”:

===========封杀明星============
请您输入要封杀的明星:
吴某
封杀成功!
===========展示全部电影============
(无输出,因为包含吴某的电影已被删除)
(4)退出系统

输入5,退出程序:

退出成功!

五、核心知识点总结

  1. 面向对象封装:用Movie类封装电影属性,通过 get/set 方法访问数据;
  2. 集合操作ArrayList的增(add)、删(remove)、查(get / 遍历);
  3. 流程控制while循环实现菜单持久化,switch分支处理命令,for循环遍历集合;
  4. 方法封装:每个功能独立成方法(比如addMovie()),代码复用且易维护;
  5. Scanner 输入:实现控制台和用户的交互;
  6. Lombok 使用:简化实体类代码,提升开发效率。

Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐