Java 面向对象实战:简易微头条系统学习笔记

Java面向对象实战:简易微头条系统学习笔记

一、项目概述

本次实战基于Java面向对象三大特性之封装,结合ArrayList动态集合、键盘录入Scanner、日期格式化SimpleDateFormat,完成微头条简易后台系统,实现:用户注册、登录、新闻发布、查看新闻四大核心功能,一共拆分3个Java类:User.java(用户实体)、News.java(新闻实体)、Main.java(程序菜单业务)。

运行逻辑:先注册账号→登录账号→登录后才可发布新闻→随时查看全部新闻,未登录禁止发新闻。

二、三大实体类代码解析

1.User.java 用户类(封装用户信息,封装核心:成员变量私有化,get/set对外访问)

设计思路

  1. 私有成员变量:username(用户名)、password(密码),private修饰,外部不能直接访问,实现数据安全(封装特性)
  2. 两套构造方法:无参构造+有参构造,无参为框架预留,有参快速创建用户对象并赋值
  3. get/set方法:私有属性对外唯一访问入口,get获取值、set修改值
public class User {
    //1.私有成员变量:封装,禁止外部直接修改
    private String username;
    private String password;

    //无参构造
    public User() {}
    //有参构造:创建对象直接赋值用户名密码
    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    //getter:获取属性
    public String getUsername() { return username; }
    //setter:修改属性
    public void setUsername(String username) { this.username = username; }

    public String getPassword() { return password; }
    public void setPassword(String password) { this.password = password; }
}

2.News.java 新闻类(封装新闻,自动生成发布时间)

设计思路

  1. 私有属性:标题title、内容content、发布时间publishTime
  2. 有参构造:创建新闻时只传标题+内容,发布时间自动获取当前系统时间,通过SimpleDateFormat格式化yyyy-MM-dd HH:mm:ss年月日时分秒格式
  3. 提供get方法:菜单中查看新闻时,取出标题和发布时间
import java.text.SimpleDateFormat;
import java.util.Date;

public class News {
    private String title;       //新闻标题
    private String content;     //新闻内容
    private String publishTime; //发布时间

    //构造:创建新闻只需要标题和内容,时间自动生成
    public News(String title, String content) {
        this.title = title;
        this.content = content;
        //格式化当前系统时间
        this.publishTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
    }

    //查看新闻需要获取标题、发布时间
    public String getTitle() { return title; }
    public String getPublishTime() { return publishTime; }
}

3.Main.java 主程序(菜单+业务逻辑,程序入口)

核心知识点

  1. static静态集合:ArrayList<User> userList存全部注册用户、ArrayList<News> newsList存全部新闻,全局共享数据,程序运行全程保存数据
  2. currentUser静态变量:记录当前登录用户,null=未登录,用来做发布新闻权限校验
  3. Scanner键盘输入,scanner.nextLine()吸收换行符,避免nextInt()遗留回车吞输入
  4. while(true)死循环实现菜单常驻,输入5结束程序;switch匹配菜单选项,拆分register注册、login登录、publishNews发新闻、showNewsList查看新闻四个业务方法
import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    //全局集合:存储所有注册用户、所有新闻
    static ArrayList<User> userList = new ArrayList<>();
    static ArrayList<News> newsList = new ArrayList<>();
    static User currentUser = null; //记录当前登录用户,null=未登录
    static Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        while (true) {
            //打印主菜单
            System.out.println("\n====== 微头条主菜单 ======");
            System.out.println("1. 注册");
            System.out.println("2. 登录");
            System.out.println("3. 查看新闻列表");
            System.out.println("4. 发布新闻");
            System.out.println("5. 退出");
            System.out.print("请选择:");
            int choice = scanner.nextInt();
            scanner.nextLine();//吸收回车换行

            switch (choice) {
                case 1: register(); break;
                case 2: login(); break;
                case 3: showNewsList(); break;
                case 4: publishNews(); break;
                case 5:
                    System.out.println("再见!");
                    scanner.close();
                    return;//结束程序
                default:
                    System.out.println("无效选项!");
            }
        }
    }

    //1.注册:校验用户名不能重复,不重复则存入用户集合
    static void register() {
        System.out.print("用户名:");
        String name = scanner.nextLine();
        //遍历集合查重
        for (User u : userList) {
            if (u.getUsername().equals(name)) {
                System.out.println("用户名已存在!");
                return;
            }
        }
        System.out.print("密码:");
        String pwd = scanner.nextLine();
        userList.add(new User(name,pwd));
        System.out.println("注册成功!");
    }

    //2.登录:账号密码匹配则赋值currentUser,标记登录状态
    static void login() {
        System.out.print("用户名:");
        String name = scanner.nextLine();
        System.out.print("密码:");
        String pwd = scanner.nextLine();
        for (User u : userList) {
            if(u.getUsername().equals(name) && u.getPassword().equals(pwd)){
                currentUser = u;
                System.out.println("登录成功!");
                return;
            }
        }
        System.out.println("用户名或密码错误!");
    }

    //3.发布新闻:权限校验,未登录直接拦截,登录后录入标题内容存入新闻集合
    static void publishNews() {
        if(currentUser == null){
            System.out.println("请先登录!");
            return;
        }
        System.out.print("新闻标题:");
        String title = scanner.nextLine();
        System.out.print("新闻内容:");
        String content = scanner.nextLine();
        newsList.add(new News(title,content));
        System.out.println("新闻发布成功!");
    }

    //4.查看新闻:无新闻提示暂无,有新闻循环遍历打印标题+发布时间
    static void showNewsList() {
        if(newsList.size() == 0){
            System.out.println("暂无新闻!");
            return;
        }
        System.out.println("=====全部新闻=====");
        for (News n : newsList) {
            System.out.println("标题:"+n.getTitle()+" | 发布时间:"+n.getPublishTime());
        }
    }
}

三、运行演示&功能验证(对应截图运行结果)

操作步骤

  1. 选项1注册:输入用户名wang、密码1234,提示注册成功,用户存入userList集合
  2. 选项3查看新闻:无任何新闻,控制台打印暂无新闻!
  3. 选项4发布新闻:未登录状态,直接拦截→请先登录!(权限控制生效)
  4. 选项2登录:输入注册好的wang/1234,登录成功,currentUser赋值为当前用户
  5. 再次选4发布新闻:录入标题内容,新闻自动携带系统时间存入newsList
  6. 选3查看新闻:展示已发布新闻标题+格式化发布时间
  7. 选5:程序退出

关键运行效果总结

  • 未登录禁止发新闻,权限控制完成
  • 用户名不能重复注册,数据校验完成
  • 新闻发布自动生成时分秒时间,无需手动填写

四、本次学到的Java知识点总结

1.面向对象-封装

  • 成员变量private私有化,拒绝外部随意篡改数据,通过get/set可控访问,是Java封装最常用落地写法
  • 构造方法作用:创建对象时快速给属性赋值,无参构造是很多底层框架必备

2.集合ArrayList

  • 动态数组,长度可变,用来批量存储同类对象(用户、新闻),替代固定长度数组,实现数据增删
  • 增强for循环for(类型 变量:集合)快速遍历集合所有元素,用来查重、遍历展示数据

3.日期工具

SimpleDateFormat+Date:获取系统当前时间,自定义日期格式,自动生成新闻发布时间

4.流程控制

  • while(true)菜单循环、switch分支匹配菜单、方法拆分业务(单一职责:一个方法只做一件事,注册/登录/发新闻分开)
  • 登录标记变量currentUser做权限判断,是项目里登录鉴权的简易雏形

5.Scanner细节坑点

nextInt()只接收数字,会把回车换行留在缓冲区,后续nextLine()直接读取空字符串,必须紧跟scanner.nextLine()吃掉换行。

五、拓展优化方向(后续学习改进)

  1. 密码长度校验(不能小于6位)、用户名非空校验
  2. 发布新闻内容非空校验
  3. 新增退出登录功能(将currentUser置为null)
  4. 新闻删除、修改功能
posted @ 2026-06-03 11:16  05春  阅读(11)  评论(0)    收藏  举报