前言
最近学习把java SE的内容全部过了一遍,大致的内容和其他编程语言没有很大的区别,但在细节上确实有很多的关键点值得一提,比如java不支持多继承,但是可以通过内部类来实现相同效果。
通过案例把这几天学的东西融会贯通一下,还是和上次一样先展示案例效果,源码的下载链接
tip:这次代码量比上回稍微多了一些,源码我以上传并设置成免费的,大家可以下载下来 !
一、实现效果
1、登录界面以及注册功能演示
如下图所示,当用户需要注册时会遇到一个验证码功能,此功能会随机生成包含大小写字母和数字的六位验证码,当用户输入正确后才能继续进行注册功能!(不区分大小写)
用户类型分为管理员和普通用户,注册管理员账户时需要输入管理员注册码666666才可以成功注册。
2、普通用户登录
普通用户登录后会显示五项功能:
1、热映影片:
显示管理员已设置排片时间和影厅号的电影,用户可以通过此功能查看排片电影详情、购买电影票、申请退票。
2、即将上映
显示系统中所有未排片的电影
3、个人信息
显示用户的个人信息,用户也可以通过此功能修改这些信息
4、票夹
显示用户购买的电影票(包括电影开场时间、影厅号)
5、退出系统
返回上级操作界面
普通用户登录后欢迎界面如下图所示:
(1)热映影片
效果如下图所示,用户可以通过此功能查看所有管理员已排片的电影信息、购买电影票。当用户输入1指令进入热映影片界面时,会简单列出当前的存在的排片信息。用户继续输入指令1时,会提示用户输入指定的电影名字来查看电影详情。
用户在热映影片界面输入指令2,可以购买电影票并自由选择座位。被预定的座位会显示随机emoji表情,如果用户误选已被预选的座位,系统也会给出提示并让用户重新选择.
(2)即将上映
效果如下,用户可以通过此功能查看所有管理员还未排片的电影简介。
(3)个人信息
个人信息功能如下图所示,用户可以通过此功能查看并修改个人信息。
如下图所示,用户在修改信息后,系统相关设置会更新。
(4)票夹
票夹功能如下图所示,用户可以通过此功能查看所有已购电影票。
3、管理员登录
管理员登录后会显示四项功能:
1、电影管理:
电影管理功能包含:
1、浏览电影
管理员可以通过此功能查看所有已上架的电影
2、电影上架
管理员可以使用此功能添加电影(上架电影,普通用户会在 <即将上映> 界面看到该电影的信息)
3、电影下架
管理员通过指定电影名字删除已上架电影的信息
4、修改电影
管理员通过此功能修改电影的信息,能修改电影名、电影导演、电影主演、电影简介等信息
5、排片设置
管理员可以通过此功能设置电影的排片信息,设置电影播放的影厅号、开始的时间、电影票售价等信息
2、用户管理
显示系统中所有未排片的电影
3、个人信息
显示管理员的个人信息,管理也可以通过此功能修改这些信息(包括登录名、密码、网名昵称等等)
4、退出
返回上级操作界面
管理员登录后欢迎界面如下图所示:
(1)电影管理
电影管理包含浏览电影、电影上架、电影下架、修改电影、排片设置等功能,管理员通过选择电影管理下的子功能设置相关电影信息。
(2)用户管理
管理员可以用户管理设置用户相关信息。
(3)个人信息
管理员个人信息展示界面和普通用户一样(调用的是同一个方法),图片略。
二、功能源码
1、接收用户的合法输入
如下代码所示,当需用户重复输入指定指令时,可以采用死循环的方法。
public class Demo {
//放在类中方法外,设置为成员变量,可以全局使用sc变量
Scanner sc = new Scanner(System.in);
public void fun(){
//定义在死循环外,防止重复创建对象
String choise;
while (true){
//变量赋值放在死循环中,以便重复接受用户的输入
choise = sc.next();
switch (choise){
case "1":
showUserList();
break;
......
case "3":
System.out.println("已退出!");
//return;直接结束方法!
return;
default:
//只要用户输入的不是需要的指令就提示输入不规范
System.out.println("您的输入不规范!");
break;
}
}
}
}
2、控制台格式化输出
如下代
//控制台格式化打印
System.out.printf("字符串", 形参列表...);
//在IDEA中的快捷使用方法是 (返回值为String的方法).souf 或 (变量).souf
//或者直接输入souf回车
用法示例:
int a = 10;
System.out.printf("a的值是%d", number);
控制台打印:
a的值是10
以上示例中字符串里的%d是占位符,类似的还有:
1、%s:字符串占位符,用于插入字符串类型的值。它可以用来替换任何类型的对象,
包括字符串、数字等,因为所有对象都可以调用toString()方法转换为字符串。
2、%d:整数占位符,用于插入整数类型的值。适用于int、long等整数类型。
3、%f:浮点占位符,用于插入浮点类型的值。适用于float、double等浮点数类型。
4、%b:布尔值占位符,用于插入布尔值类型的值。
常用的就%s、%d、%f三种,只记这三种就行。网上还搜到%tY表示四位数的年份、
%tB表示英文月份等不常用的。
===============================================================================
控制台格式化打印的进阶技巧:
double pi = 3.141592653589793;
System.out.printf("浮点数(保留两位小数):%.2f%n", pi);
输出:浮点数(保留两位小数):3.14
[ps:这里的%n不是占位符,这里表示换行的意思,printf默认不加换行。你也可以输入转义字符\r\n]
-------------------------------------------------------------------------------
设置:宽度为10,右对齐,保留两位小数
System.out.printf("宽度为10,右对齐,保留两位小数:%10.2f%n", pi);
输出:宽度为10,右对齐,保留两位小数: 3.14
-------------------------------------------------------------------------------
设置:宽度为10,右对齐,保留两位小数,用0填充
System.out.printf("宽度为10,右对齐,0填充,保留两位小数:%010.2f%n", pi);
输出:宽度为10,右对齐,0填充,保留两位小数:0000003.14
-------------------------------------------------------------------------------
总结:%[index$][标识]*[最小宽度][.精度]转换符
更多占位符相关知识,请查看博主旷野历程的这篇文章:JAVA字符串占位符使用
java中涉及到使用占位符的,还有String.format()方法、PrintStream类与PrintWriter类中的printf()方法、MessageFormat类等方法
3、创建工具类
专门创建工具类来存放一些功能,可以在书写功能类时避免混淆、减少重复代码。工具类一般使用Utils或Tools后缀。
//防止继承,设置为final
public final class movieUtils {
//禁止用户通过new实例来调用,将无参构造器标记为private
private movieUtils(){}
//打印分割线
public static void printPartingLineLite() {
System.out.println("\r\n-------------------------------------------------------------------");
}
//方法重载,打印不同类型的分割线
public static void printPartingLineLite(String serviceName) {
System.out.printf("\r\n------------------------------%s------------------------------\r\n", serviceName);
}
public static void printPartingLine() {
System.out.println("\r\n============================================================");
}
public static void printPartingLine(String serviceName) {
System.out.printf("\r\n============================%s=============================\r\n", serviceName);
}
//设置电影简介的打印格式,到一定长度就换行
public static String printDesc(String Desc) {
StringBuilder str = new StringBuilder(Desc);
for (int i = 0; i < str.length(); i++) {
if (i == 0) continue;
if ((i % 42) == 0)
str.insert(i, "\r\n\t ");
}
return str.toString();
}
//创建随机六位字母数字组成的验证码
private static boolean verificationCode() {
Random rd = new Random();
String str = "0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
StringBuilder st = new StringBuilder();
int temp;
for (int i = 0; i < 6; i++) {
temp = rd.nextInt(str.length());
st.append(str.toCharArray()[temp]);
}
System.out.println("验证码:" + st.toString());
System.out.println("请输入验证码:");
String code = sc.next();
if ((st.toString()).equalsIgnoreCase(code)) {
return false;
}
System.out.println("验证码输入错误");
return true;
}
private static void verification() {
boolean check = true;
while (check) {
check = verificationCode();
}
}
....略
4、多个类之间数据传递
在构建整个系统时,数据传递无疑是一个核心环节。本文采用了类的构造函数来传递参数,这种方式确保了在Java中执行非静态类的方法时,类的构造函数能够被适时调用,从而初始化对象并传递必要的数据。
public class A {
public static void main(String[] args) {
// main方法程序的入口
// 运行欢迎程序,打印系统初始界面
new B().hello();
}
}
class B {
ArrayList<Student> list;
B() {
SystemData data = new SystemData();
this.list = data.list;
}
void hello() {
//这里的this就是B类的地址值,将其作为实参传递给C类
new C(this);
}
}
class C {
ArrayList<Student> list;
public C(B b) {
//通过B类地址值获取B类的成员变量list,并将其赋给C类中的成员变量list
this.list = b.list;
}
}
class SystemData {
// 数据初始化类(存储所有数据、整个管理系统运行时赋予系统初始数据)
ArrayList<Student> list;
public SystemData() {
this.list = new ArrayList<>();
list.add(new Student());
}
}
class Student {
// JavaBean类
private String name;
private int age;
//get、set、构造器略
}
三、总结
实现这种控制台的简易系统并不困难,但是就是繁琐、大量的死循环、重复的功能的调用。但通过上手练习,能够有效的贯通这段时间学习的基础语法知识,实现一些看似复杂但很简单的功能。