Java 面向对象实战:简易微头条系统学习笔记
Java面向对象实战:简易微头条系统学习笔记
一、项目概述
本次实战基于Java面向对象三大特性之封装,结合ArrayList动态集合、键盘录入Scanner、日期格式化SimpleDateFormat,完成微头条简易后台系统,实现:用户注册、登录、新闻发布、查看新闻四大核心功能,一共拆分3个Java类:User.java(用户实体)、News.java(新闻实体)、Main.java(程序菜单业务)。
运行逻辑:先注册账号→登录账号→登录后才可发布新闻→随时查看全部新闻,未登录禁止发新闻。
二、三大实体类代码解析
1.User.java 用户类(封装用户信息,封装核心:成员变量私有化,get/set对外访问)
设计思路
- 私有成员变量:
username(用户名)、password(密码),private修饰,外部不能直接访问,实现数据安全(封装特性) - 两套构造方法:无参构造+有参构造,无参为框架预留,有参快速创建用户对象并赋值
- 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 新闻类(封装新闻,自动生成发布时间)
设计思路
- 私有属性:标题
title、内容content、发布时间publishTime - 有参构造:创建新闻时只传标题+内容,发布时间自动获取当前系统时间,通过
SimpleDateFormat格式化yyyy-MM-dd HH:mm:ss年月日时分秒格式 - 提供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 主程序(菜单+业务逻辑,程序入口)
核心知识点
static静态集合:ArrayList<User> userList存全部注册用户、ArrayList<News> newsList存全部新闻,全局共享数据,程序运行全程保存数据currentUser静态变量:记录当前登录用户,null=未登录,用来做发布新闻权限校验Scanner键盘输入,scanner.nextLine()吸收换行符,避免nextInt()遗留回车吞输入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注册:输入用户名
wang、密码1234,提示注册成功,用户存入userList集合 - 选项3查看新闻:无任何新闻,控制台打印
暂无新闻! - 选项4发布新闻:未登录状态,直接拦截→
请先登录!(权限控制生效) - 选项2登录:输入注册好的wang/1234,登录成功,
currentUser赋值为当前用户 - 再次选4发布新闻:录入标题内容,新闻自动携带系统时间存入
newsList - 选3查看新闻:展示已发布新闻标题+格式化发布时间
- 选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()吃掉换行。
五、拓展优化方向(后续学习改进)
- 密码长度校验(不能小于6位)、用户名非空校验
- 发布新闻内容非空校验
- 新增退出登录功能(将currentUser置为null)
- 新闻删除、修改功能
浙公网安备 33010602011771号