微头条控制台版 - 项目学习笔记

一、项目架构

text
微头条控制台版
├── User.java // 用户基类(普通用户)
├── Admin.java // 管理员类(继承 User)
├── News.java // 新闻类
└── Main.java // 主程序(注册/登录/菜单多态)
文件职责
文件 职责
User.java 用户名、密码封装 + 普通用户菜单
Admin.java 继承 User,重写菜单(增加删除权限)
News.java 新闻实体(标题、内容、作者、发布时间等)
Main.java 主循环、注册、登录、多态调度

二、核心代码详解

1️⃣ User.java(用户基类)

java
public class User {
private String username;
private String password;

public User(String username, String password) {
this.username = username;
this.password = password;
}

public String getUsername() { return username; }
public String getPassword() { return password; }

// 普通用户的菜单
public void showMenu() {
System.out.println("\n======= 普通用户菜单 ========");
System.out.println("1. 发布新闻");
System.out.println("2. 查看新闻列表");
System.out.println("3. 查看新闻详情");
System.out.println("4. 退出登录");
}
}

2️⃣ Admin.java(管理员类)

java
public class Admin extends User {
public Admin(String username, String password) {
super(username, password);
}

@Override
public void showMenu() {
System.out.println("\n===== 管理员菜单 =====");
System.out.println("1. 发布新闻");
System.out.println("2. 查看新闻列表");
System.out.println("3. 查看新闻详情");
System.out.println("4. 删除任意新闻"); // 特有功能
System.out.println("5. 退出登录");
}
}

3️⃣ Main.java(主程序核心)

静态集合(模拟数据库)
java
static ArrayList userList = new ArrayList<>(); // 用户库
static ArrayList newsList = new ArrayList<>(); // 新闻库
static User currentUser = null; // 当前登录用户
static Scanner scanner = new Scanner(System.in);
注册功能(支持角色选择)
java
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();

System.out.print("请选择角色(1.普通用户 2.管理员):");
int role = scanner.nextInt();
scanner.nextLine();

User user;
if (role == 2) {
user = new Admin(name, pwd);
} else {
user = new User(name, pwd);
}
userList.add(user);
System.out.println("注册成功!");
}
登录功能
java
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("登录成功!欢迎," + name);
return;
}
}
System.out.println("用户名或密码错误!");
}
多态菜单循环(关键设计)
java
while (true) {
currentUser.showMenu(); // ✅ 多态调用:自动执行子类重写方法

System.out.print("请输入您的选择:");
int choice = scanner.nextInt();
scanner.nextLine();

if (choice == 0) { // 统一退出
currentUser = null;
System.out.println("已退出登录\n");
return;
}

switch (choice) {
case 1: publishNews(); break;
case 2: showNewsList(); break;
case 3: showNewsDetail(); break;
case 4:
// ✅ 向下转型:判断是否有删除权限
if (currentUser instanceof Admin) {
deleteNews();
} else {
System.out.println("您没有权限执行此操作!\n");
}
break;
default: System.out.println("无效选择\n");
}
}

三、多态的两种体现

多态类型 代码示例 说明
向上转型 User u = new Admin(...) 注册时管理员对象赋值给父类引用
方法重写 currentUser.showMenu() 运行时根据实际对象执行普通用户或管理员菜单
向下转型 if (currentUser instanceof Admin) 判断是否有删除权限
四、运行效果示例
text
========== 微头条主菜单 =========

  1. 注册
  2. 登录
  3. 查看新闻列表
  4. 发布新闻
  5. 退出

请选择:1
用户名:张三
密码:123456
请选择角色(1.普通用户 2.管理员):2
注册成功!

请选择:2
用户名:张三
密码:123456
登录成功!欢迎,张三

===== 管理员菜单 =====

  1. 发布新闻
  2. 查看新闻列表
  3. 查看新闻详情
  4. 删除任意新闻
  5. 退出登录

五、关键技术点总结

✅ ArrayList 模拟数据库
✅ 继承与方法重写(showMenu)
✅ 多态调度:父类引用调用子类方法
✅ 向下转型与 instanceof 判断权限
✅ Scanner 输入处理(注意 nextInt 后的换行消费)
✅ 菜单循环与退出机制

六、扩展建议

为 News 类增加 id、标题、内容、作者、发布时间

增加新闻详情查看功能(根据 id 查找)

增加新闻删除功能(仅管理员)

增加文件存储(序列化/JSON)替代 ArrayList

增加异常处理(输入非数字等)