抽象类、内部类、接口
一、抽象类
1. 为什么需要抽象类
尽管在当前阶段,即使没有抽象类也可以实现大部分功能,但在特定场景下,使用抽象类能够更好地组织代码,提高代码的可维护性和复用性。
1.1 代码解释
- 从代码层面考虑,当多个子类需要重写父类的同一个或几个方法时,如果这些方法的实现逻辑在父类中没有实际意义,可以考虑将这些方法定义为没有方法体的方法。
- 有两种方式可以实现上述需求:
- native方法: 子类可以选择不重写这些方法(编译时不会报错),但在运行时可能会出现错误。此外,可以通过引入第三方语言开发的接口调用native方法,或者所有子类都重写native方法。
- abstract方法: 如果一个类中包含抽象方法,那么这个类必须声明为抽象类。同样地,如果一个类中包含抽象方法且还包含子类,在编译时会报错。解决办法是将类声明为抽象类,或者所有子类都重写父类的抽象方法。
通过抽象方法的引入,我们可以引出抽象类的概念。
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
public abstract class Teacher {
private int id;
private String name;
private int age;
public void introduce() {
System.out.println(this.toString());//继承关系下 this: ?类对象
}
//在讲解?法的组成部分的时候
//?个?法?法体可以不?带的
//每个?类都重写了?类的?法 发现?类提供的代码逻辑 没有任何意义的
//需求: ?类?法不需要提供?法体。
//?个类中 出现了没有?法体?法
//1. native的?法
//2. 抽象?法 abstract
// public native Object teach();
//调?teach?法 不会报错
//1.1 加载第三?语?提供teach功能的接?
//1.2 ?类全部重写teach?法
//1.3 对于native的?法 在编译期间 ?类不重写 ?类不会报错
//抽象?法: 没有?法体。 就是规则。针对于?类,要求?类全部重写?类??提供的抽象?
法
//有可能会报错: ?个类中出现了抽象?法 这个类肯定是个抽象类
public abstract Object teach();
//满???替换原则
//1. ?类出现的任意?个地?都可以使??类替换
//2. ?类不要重写?类的?法
//3. 如果要重写 尽可能使?抽象类以及接?。
}
1.2 程序设计解释
//从程序设计/开发规范(习惯)?度进?解释
//抽象类: 对类的抽象。----> ?类 -----> 抽象类肯定也是作为?类使?。
//?个类作为?类使? 这个类?般就是?个抽象类。AbstractXXX / BaseXXX
//?不?都可以。
//?个普通类依然可以作为?类使?。?类服务于?类。
//在继承关系下 ?般不会创建?类对象
//?前是?个普通类作为?类 可以创建普通类对象 没有意义。 抽象类 更加体现这?点设计思
想。
2. 语法
抽象类和抽象方法的语法如下所示:
public abstract class 类名{
}
简单来说,Java中的抽象就是声明接口(方法签名)而不实现具体的功能。
3. 组成部分
@Setter
@Getter
public abstract class MyAbstractClass { //?般都是作为?类
//1. 抽象类中不?定有抽象?法
//2. ?个类中 有抽象?法 这个类必须是?个抽象类
//组成部分
private String name;
private static void demo() {
}
//抽象?法: 没有?法体的?法-----> 必须要实现----> ?类实现
//abstract可以与哪些修饰符综合使?? public protected 默认
public abstract void demo1();
protected abstract void demo2();
abstract void demo3();
//构造?法
public MyAbstractClass(String name) {
this.name = name;
}
}
4. 作用
作为父类使用,定义所有子类都应具备的行为。功能上与普通类相似,主要区别在于包含了抽象方法。
public class Child extends MyAbstractClass {
//?类继承抽象类 报错?
//1. 对于?类?? 可以将?类也改为抽象类
//2. 对于?类?? 必须重写抽象类??所有的抽象?法
//3. 对于调??法 ?需关注?类的?法功能 直接看?类即可
@Override
public void demo1() {
}
@Override
protected void demo2() {
}
@Override
void demo3() {
}
}
5. 总结
利用抽象的概念,可以在开发项目中构建具有良好扩展性的架构,优化程序设计。抽象类和抽象方法是软件开发过程中的设计层面概念,通常由设计人员设计,而程序员则负责继承这些抽象类并覆盖抽象方法,实现具体功能。抽象类是抽象方法的容器,如果一个类中包含抽象方法,该类必须声明为抽象类。即使没有抽象方法,只要一个类不应该有具体对象,也应该声明为抽象类。抽象类不能直接实例化,只能用于继承。抽象类的子类应该提供对所有抽象方法的具体实现。如果子类没有实现所有抽象方法,该子类仍然为抽象类,只能用于继承,不能实例化,但可以有构造函数,用于帮助子类快速初始化共有的属性。
二、内部类
内部类是在一个类的内部创建的另一个类。理解内部类有助于我们更好地阅读和理解底层源码。
1. 成员内部类
与成员变量和方法处于同一级别,在类的内部但在方法的外部。
1.1 静态内部类
public class User {
public int num = 100;
public void a() {
System.out.println("a.....");
}
//成员内部类
//1. ?静态内部类 (不允许维护static修饰的成员)
public class AClass {
public String str = "hello";
public void demo1() {
System.out.println("demo1...........");
}
public AClass() {
}
}
}
public static void main(String[] args) {
//获得AClass?? str demo1()
//User user = new User();
//System.out.println(user.num);
//user.a();
//User.AClass aClass = user.new AClass();
User.AClass aClass = new User().new AClass();
System.out.println(aClass.str);
aClass.demo1();
}
1.2 静态内部类
public class User {
public int num = 100;
public void a() {
System.out.println("a.....");
}
public static String name = "admin";
//成员内部类
//2.静态内部类 static 组成部分推荐使?static
public static class BClass {
public int num3 = 1000;
public static int num4 = 4000;
public static void demo2() {
System.out.println("demo2...........");
}
public void demo3() {
System.out.println("demo3...........");
}
public BClass() {
}
}
private static void demo2() {
//调?BClass类??的属性+?法
System.out.println(User.name);
System.out.println(User.BClass.num4);
User.BClass.demo2();
User.BClass bClass = new User.BClass();
bClass.demo3();
System.out.println(bClass.num3);
}
2. 局部内部类
在方法体内部编写的类。
public class User {
public int num = 100;
public int a() {
System.out.println("a.....");
//2 局部内部类 只能服务于本?法
class CClass {
private int a = 100;
public int test() {
System.out.println("test.....级别?较?的逻辑");
return a += 100;
}
}
return new CClass().test();
}
}
3. 匿名内部类
任何类都可以创建匿名内部类,相当于类的子类。语法如下:
类名 引用/对象 = new 类名(){};
private static void demo4() {
//User user1 = new User();
User user2 = new User(){
public int aaa = 100;
@Override
public void b() {
System.out.println("匿名内部类....重写b.....");
}
};//匿名内部类===> ?类
user2.b();
}
三、接口
1. 接口语法
1.1 接口概念
在生活中,最常见的接口例子就是USB接口。许多设备带有预定义的接口,用户使用特定的产品进行连接。接口就是规则,就像电脑上的USB接口一样,许多厂商根据这些规则提供具体的产品(具体实现)。类似的例子还包括电脑与鼠标/键盘的连接、手机与充电线的连接、灯泡与灯头的连接、主板与内存条的连接等。这些例子都体现了接口提供的可扩展性。
在程序中,接口的概念与生活中的接口相似。程序中的接口用于定义规则,根据不同的需求提供不同的实现。可以将接口视为生活中店铺的“招牌”,看到“招牌”就能知道店铺销售的商品。因此,程序中的接口主要用于封装行为。
1.2 面向接口编程
接口是设计层面的概念,通常由设计师设计,将定义与实现分离。程序员实现接口,实现具体方法。面向接口编程并不独立于面向对象编程,而是面向对象编程体系的一部分,体现了面向对象编程的思想精髓之一。面向接口编程意味着在面向对象的系统中,所有类或模块之间的交互都是通过接口完成的。
1.3 接口语法
[访问权限修饰符] interface 接?名 {
公开静态常量列表;
公开抽象?法列表;
}
在开发中:
接?的命名?式只有2种
XXXDao/DAO.java XXXDaoImpl.java
xxxService.java xxxServiceImpl.java
1.4 接口组成部分
目前我们使用的是JDK11。
//jdk1.8+ 接?声明为函数式接? 使?标记注解 @FunctionalInterface
//@FunctionalInterface //有且只有1个抽象?法
public interface MyInterface {
//组成部分----> 都是public
//1.常量 public static final 默认 final修饰的变量都是常量
//接?作为常量类使?---->维护模块中很多不可变的数据
//1.1 常量名称全部?写
//1.2 必须赋值
//1.3 值不允许被更改
String NAME = "admin";
int USER_PASS = 1234;
//2.?法 接??抽象类还要抽象 jdk1.8之前 接???的?法全部都是抽象?法 public abstract 默认
//2.1 抽象?法 对于程序猿来说 使?量最多还是仅仅抽象?法 (封装?为)
void demo1();
int max(int num1, int num2);
//2.2 功能?法---->有?法体的?法 jdk1.8+ public default
default void demo2() {
System.out.println("MyInterface。。。。。demo2.。。。。");
}
//2.3 静态?法 jdk1.8+
static String staticMethod() {
System.out.println("MyInterface。。。。。staticMethod.。。。。");
return "static";
}
//2.4 私有的静态?法 jdk1.9+ 服务于其它public static的?法
private static void privateStaticMethod() {
System.out.println("MyInterface。。。。。。privateStaticMetho
d。。。。");
}
//2.5 接?没有构造?法----->不能直接实例化 其实也可以 创建了 匿名内部类
}
1.5 使用接口
1.5.1 接口继承接口(extends)
接口与接口之间属于多继承关系。一个接口可以继承多个接口,使用extends关键字实现。
public interface AInterface extends BInterface,CInterface,....{
}
public interface AInterface {
void a();
}
interface CInterface {
void c();
}
interface BInterface extends AInterface, CInterface {//?接?与?接?的关系
void b();
}
1.5.2 类实现接口(implements)
类与接口之间属于多实现关系。一个类可以实现多个接口,使用implements关键字实现。Java语言是面向对象的,最终还需要与类结合使用。接口是比抽象类更高层次的抽象概念,因此和抽象类一样,接口不能用于实例化对象,只能作为继承树的顶层结构被子类实现。
类实现接口的概念,实际上与类继承类类似,但存在关键差异:“一个类仅能继承一个类,即单继承,而一个类却能够同时实现多个接口”,只需用逗号分隔即可。实现类需重写所有接口中的抽象方法,若未实现,则该类也应声明为抽象类。
public class 类名 extends Object implements AInter,BInter{
}
注意: 一个普通类实现接口时可能会遇到错误。
public interface UserInterface {
//常量
String PASS = "1234";
String NAME = "admin";
//?法
boolean login(String name, String pass);
void register();
default void defaultMethod() {
System.out.println("UserInterface.....
public....defaultMethod......");
}
static void staticMethod() {
System.out.println("UserInterface.....public....
staticMethod......");
}
private void privateMethod() {
System.out.println("UserInterface.....private....
privateMethod......");
}
}
//类实现接?称为接?的实现类
//接?就像 "招牌"
//只要类实现接? 就代表这个类中具有这些功能
//因此?个接?可以有多个实现类,有多套实现
public class UserInterfaceImpl implements UserInterface{
//?个普通类 实现接?的时候 这个类可能会报错
//解决?式:
// 1. 将这个类改为抽象类
// 2. 普通类重写/实现接???的所有的抽象?法
}
作业
1. 结合多态实现乐器演奏功能
乐器(Instrument)分为钢琴(Piano)、小提琴(Violin),不同乐器的演奏(play)方式各异。
编写一个测试类InstrumentTest,具体要求如下:
- 编写方法testPlay,用于测试各种乐器的演奏。根据乐器类型,执行相应的演奏方法。
- 在main方法中进行测试。
public class Instrument {
private String name;
public Instrument() {
}
public Instrument(String name) {
this.name = name;
}
public void play(){
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Piano extends Instrument{
public Piano() {
}
public Piano(String name) {
super(name);
}
@Override
public void play() {
System.out.println(this.getName()+"正在弹奏~~~");
}
}
public class Violin extends Instrument{
public Violin() {
}
public Violin(String name) {
super(name);
}
@Override
public void play() {
System.out.println(this.getName()+"正在弹奏~~~~~");
}
}
public class MainWork {
public static void main(String[] args) {
testPlay();
}
public static void testPlay(){
Instrument instrument= new Piano("钢琴一号");
Instrument instrument1= new Violin("小提琴一号");
instrument.play();
instrument1.play();
}
}
2. 地下城勇士游戏怪物模块设计
现有两种怪物:哥布林和猫妖,它们共享一些基本属性,如名称、生命值、攻击力和防御力。
哥布林的独特属性包括狂暴度,其特有能力有攻击(使用头部攻击)和移动(缓慢移动)。
猫妖的能力包括攻击(使用爪子攻击)和移动(跳跃移动)。
测试类需创建两只哥布林和两只猫妖,将其存入数组中统一管理,并循环调用每只怪物的攻击和移动方法,利用多态思想实现。
public class Monster {
private String name;
private int bloodNum;
private int attackPower;
private int defensecapability;
public Monster() {
}
public Monster(String name, int bloodNum, int attackPower, int defensecapability) {
this.name = name;
this.bloodNum = bloodNum;
this.attackPower = attackPower;
this.defensecapability = defensecapability;
}
public void attack() {
System.out.println("怪物都会攻击.....");
}
public void move() {
System.out.println("怪物都会移动.....");
}
public void show() {
System.out.println("怪物信息:");
System.out.println("怪物名称:" + this.name);
System.out.println("怪物血量:" + this.bloodNum);
System.out.println("怪物攻击力:" + this.attackPower);
System.out.println("怪物防御力:" + this.defensecapability);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getBloodNum() {
return bloodNum;
}
public void setBloodNum(int bloodNum) {
this.bloodNum = bloodNum;
}
public int getAttackPower() {
return attackPower;
}
public void setAttackPower(int attackPower) {
this.attackPower = attackPower;
}
public int getDefensecapability() {
return defensecapability;
}
public void setDefensecapability(int defensecapability) {
this.defensecapability = defensecapability;
}
}
public class Goblin extends Monster{
private int frenzyDegree;
public Goblin() {
}
public Goblin(String name, int bloodNum, int attackPower, int defensecapability, int frenzyDegree) {
super(name, bloodNum, attackPower, defensecapability);
this.frenzyDegree = frenzyDegree;
}
@Override
public void attack() {
System.out.println(this.getName()+"正在攻击,注意格挡......");
}
@Override
public void move() {
System.out.println(this.getName()+"正在急速靠近,注意距离.....");
}
@Override
public void show() {
super.show();
System.out.println("怪物暴怒度:"+this.frenzyDegree);
}
public double getFrenzyDegree() {
return frenzyDegree;
}
public void setFrenzyDegree(int frenzyDegree) {
this.frenzyDegree = frenzyDegree;
}
}
public class CatMonster extends Monster{
public CatMonster() {
}
public CatMonster(String name, int bloodNum, int attackPower, int defensecapability) {
super(name, bloodNum, attackPower, defensecapability);
}
@Override
public void move() {
System.out.println(this.getName()+"正在尽速靠近,注意闪避....");
}
@Override
public void attack() {
System.out.println(this.getName()+"正在攻击注意距离......");
}
@Override
public void show() {
super.show();
}
}
public class TestDemo {
private Monster[] monsters;
public TestDemo() {
}
public TestDemo(Monster[] monsters) {
this.monsters = monsters;
}
public void test(){
Scanner scanner= new Scanner(System.in);
System.out.println("游戏加载中.....");
for(int i=0;i<monsters.length;i++){
if(i<2) {
monsters[i].setAttackPower((int)(Math.random() * 101 + 100));
monsters[i].setName("哥布林"+(i+1));
monsters[i].setBloodNum((int)(Math.random()*1001+1000));
monsters[i].setDefensecapability((int)(Math.random()*101+100));
Goblin goblin=(Goblin)monsters[i];
goblin.setFrenzyDegree((int)(Math.random()*10+1));
}else{
monsters[i].setAttackPower((int)(Math.random() * 101 + 100));
monsters[i].setName("猫妖"+(i+1));
monsters[i].setBloodNum((int)(Math.random()*1001+1000));
monsters[i].setDefensecapability((int)(Math.random()*101+100));
}
}
System.out.println("加载完毕");
for(int k=0;k<monsters.length;k++){
monsters[k].show();
System.out.println();
}
System.out.println("是否开始游戏?y/n:");
String str=scanner.next();
if("y".equals(str)){
for(int j=0;j<monsters.length;j++){
while (monsters[j].getBloodNum() > 0) {
monsters[j].move();
monsters[j].attack();
System.out.println("你收到了攻击,并作出了反击!");
monsters[j].setBloodNum((monsters[j].getBloodNum()-(int)(Math.random() * 500 + 100-monsters[j].getDefensecapability())));
if (monsters[j].getBloodNum()>0) {
System.out.println(monsters[j].getName() + "血量还剩" + monsters[j].getBloodNum());
}
}
System.out.println("怪物已经死亡...");
if(j==monsters.length-1)
break;
System.out.println("是否进行下一场游戏?y/n:");
str=scanner.next();
if("n".equals(str)) {
System.out.println("你中途退出游戏,所以你输了,即将结束游戏.....");
break;
};
System.out.println("下一只怪物即将来袭.....");
}
if(monsters[monsters.length-1].getBloodNum()<0)
System.out.println("怪物全部死亡!恭喜你赢得了比赛!");
}
}
}
public class MainWork {
public static void main(String[] args) {
Monster[] monsters={new Goblin(),new Goblin(),new CatMonster(),new CatMonster()};
new TestDemo(monsters).test();
}
}
3. 画图软件图案绘制模块设计
画图软件支持绘制线条、矩形和圆形。每个图案都有坐标X轴、Y轴及颜色等公共属性,以及一个抽象的绘制方法。
线条的独有属性为终点X轴坐标和终点Y轴坐标;矩形的独有属性为长度和宽度;圆形的独有属性为半径。
编写测试类验证每个图案的绘制功能,为了便于管理,使用数组对象存储这些图案对象,每种图案创建一个实例并保存到数组中,循环调用绘制方法。
要求使用抽象方法实现多态。
public abstract class Graphic {
private double coordinateX;
private double coordinateY;
private String graphilColor;
public abstract void painting();
public Graphic(double coordinateX, double coordinateY, String graphilColor) {
this.coordinateX = coordinateX;
this.coordinateY = coordinateY;
this.graphilColor = graphilColor;
}
public double getCoordinateX() {
return coordinateX;
}
public void setCoordinateX(double coordinateX) {
this.coordinateX = coordinateX;
}
public double getCoordinateY() {
return coordinateY;
}
public void setCoordinateY(double coordinateY) {
this.coordinateY = coordinateY;
}
public String getGraphilColor() {
return graphilColor;
}
public void setGraphilColor(String graphilColor) {
this.graphilColor = graphilColor;
}
}
public class Circle extends Graphic{
private double radius;
@Override
public void painting() {
System.out.println("画圆形模块从坐标("+super.getCoordinateX()+","+super.getCoordinateY()+")以"+
this.radius+"为半径画了一个"+super.getGraphilColor()+"的原型");
}
public Circle(double coordinateX, double coordinateY, String graphilColor, double radius) {
super(coordinateX, coordinateY, graphilColor);
this.radius = radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
}
public class Line extends Graphic{
private double finCoordinateX;
private double finCoordinateY;
@Override
public void painting() {
System.out.println("线条画图模块从坐标("+super.getCoordinateX()+","+super.getCoordinateY()+")到坐标("+
this.finCoordinateY+","+this.finCoordinateY+")画了一条"+super.getGraphilColor()+"的线条");
}
public Line(double coordinateX, double coordinateY, String graphilColor, double finCoordinateX, double finCoordinateY) {
super(coordinateX, coordinateY, graphilColor);
this.finCoordinateX = finCoordinateX;
this.finCoordinateY = finCoordinateY;
}
public double getFinCoordinateX() {
return finCoordinateX;
}
public void setFinCoordinateX(double finCoordinateX) {
this.finCoordinateX = finCoordinateX;
}
public double getFinCoordinateY() {
return finCoordinateY;
}
public void setFinCoordinateY(double finCoordinateY) {
this.finCoordinateY = finCoordinateY;
}
}
public class Rectangle extends Graphic{
private int length;
private int width;
@Override
public void painting() {
System.out.println("画矩形模块从坐标("+super.getCoordinateX()+","+super.getCoordinateY()+")画了一个长为"+
this.length+"宽为"+this.width+"的"+super.getGraphilColor()+"的矩形");
}
public Rectangle(double coordinateX, double coordinateY, String graphilColor, int length, int width) {
super(coordinateX, coordinateY, graphilColor);
this.length = length;
this.width = width;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
}
public class MainWork {
public static void main(String[] args) {
test();
}
private static void test() {
Graphic[] graphic=new Graphic[3];
graphic[0]=new Line(1,2,"绿色",5,6);
graphic[1]=new Rectangle(2,4,"黄色",8,3);
graphic[2]=new Circle(2,5,"红色",6);
for (int i = 0; i < graphic.length; i++) {
graphic[i].painting();
}
}
}
4. 模拟腾讯QQ系统使用接口构建
为确保系统的易维护性和可扩展性,整个系统基于一个主程序作为框架,所有功能均以插件形式加载至主程序,主程序启动时会加载插件,并显示加载过程的信息,同时支持插件的卸载。
模拟添加QQ空间、QQ音乐、QQ游戏三个功能插件,并编写测试类验证插件加载过程。
public interface Plugins {
void star();
void stop();
String getName();
}
public class QQGamePlugin implements Plugins{
@Override
public void star() {
System.out.println("QQ游戏插件正在运行中......");
}
@Override
public void stop() {
System.out.println("QQ游戏插件已停止运行!");
}
@Override
public String getName() {
return "QQ游戏";
}
}
public class QQMusicPlugin implements Plugins{
@Override
public void star() {
System.out.println("QQ音乐插件正在运行中.....");
}
@Override
public void stop() {
System.out.println("QQ音乐插件已停止!");
}
@Override
public String getName() {
return "QQ音乐";
}
}
public class QQZonePlugin implements Plugins{
@Override
public void star() {
System.out.println("QQ空间插件正在运行中....");
}
@Override
public void stop() {
System.out.println("QQ空间插件已停止运行!");
}
@Override
public String getName() {
return "QQ空间";
}
}
public class QQMainProgram {
private Plugins[] plugins=new Plugins[10];
private static int count=0;
public void loadPlugin(Plugins plug){
if(count<plugins.length){
System.out.println("正在加载"+plug.getName()+"插件");
plugins[count++]=plug;
System.out.println(plug.getName()+"插件加载成功");
//plug.star();
}
else{
System.out.println("插件库已满,无发进行加载插件!");
}
}
public void unloadPlugin(String str){
for (int i = 0; i < count; i++) {
if(plugins[i].getName().equals(str)){
System.out.println("正在卸载插件"+str);
plugins[i].stop();
for(int j=i;j<count-1;j++){
plugins[j]=plugins[j+1];
}
count--;
System.out.println(str+"卸载成功!");
}
}
}
public void showPlugins(){
System.out.println("*****当前已加载的插件*****");
if(count==0){
System.out.println("当前无已加载的插件!");
}else{
for (int i = 0; i < count; i++) {
System.out.println("\t\t"+plugins[i].getName());
}
}
System.out.println("***********************");
}
public void runAllPlugins(){
if(count==0){
System.out.println("当前已无插件可运行!");
}else{
for (int i = 0; i < count; i++) {
plugins[i].star();
}
}
}
}
public class Test {
public static void main(String[] args) {
QQMainProgram qqMainProgram =new QQMainProgram();
Plugins qqZone=new QQZonePlugin();
Plugins qqMusic =new QQMusicPlugin();
Plugins qqGamePlugin = new QQGamePlugin();
qqMainProgram.loadPlugin(qqZone);
qqMainProgram.loadPlugin(qqMusic);
qqMainProgram.loadPlugin(qqGamePlugin);
qqMainProgram.showPlugins();
System.out.println("正在启动所有插件");
qqMainProgram.runAllPlugins();
qqMainProgram.unloadPlugin("QQ游戏");
qqMainProgram.showPlugins();
System.out.println("测试结束!");
}
}
5. 图形类的设计
描述图形、矩形、圆形三个类,每个类都包含计算面积和周长的方法。
在计算类中定义一个方法,接受所有图形对象,并输出每个图形的周长和面积。
计算类还需定义一个方法,返回任意图形对象。
public interface Graphic {
double circumference();
double area();
}
public class Circle implements Graphic {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double circumference() {
return 2*Math.PI*radius;
}
@Override
public double area() {
return Math.pow(radius,2)*Math.PI;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
}
public class Rectangle implements Graphic {
private int length;
private int width;
public Rectangle(int length, int width) {
this.length = length;
this.width = width;
}
@Override
public double circumference() {
return 2*(this.length+this.width);
}
@Override
public double area() {
return this.length*this.width;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
}
public class Calculation {
public Calculation() {
}
public void calAreaCir(Graphic graphic){
System.out.println("该图形的面积是:"+graphic.area());
System.out.println("该图形的周长是:"+graphic.circumference());
}
public Graphic gra(String str){
if("矩形".equals(str)){
return new Rectangle((int)(Math.random()*10+1),(int)(Math.random()*5+1));
}
else if ("圆形".equals(str)){
return new Circle(Math.random()*8+1);
}
System.out.println("输入错误!(圆形/矩形)");
return null;
}
}
public class MainWork {
public static void main(String[] args) {
test();
}
private static void test() {
Scanner scanner=new Scanner(System.in);
Graphic graphic=new Circle(6.4);
Graphic graphic1= new Rectangle(5,8);
Calculation calculation=new Calculation();
System.out.println("半径为6.4的圆形的面积和周长如下:");
calculation.calAreaCir(graphic);
System.out.println("长为5,宽为8的矩形的面积和周长如下:");
calculation.calAreaCir(graphic1);
System.out.println("输入你想创建的图形(圆形/矩形):");
String str=scanner.next();
if ("圆形".equals(str)) {
Circle circle=(Circle) calculation.gra(str);
System.out.println("创建了一个半径为"+circle.getRadius()+"的圆形");
}
else if("矩形".equals(str)){
Rectangle rectangle=(Rectangle) calculation.gra(str);
System.out.println("创建了一个长为"+rectangle.getLength()+"宽为"+rectangle.getWidth()+"的矩形");
}
}
}
6. 学生类的设计
描述一个学生类,具有id和name两个属性,所有学生都能学习,但部分学生在学习的同时还能赚钱。
普通学生:学习,不赚钱。
赚钱的学生:学习,还会赚钱。
public interface Student {
void study();
default void makeMoney(){
System.out.println("该学生不会赚钱");
}
}
public class StudentAbs {
private String name;
private int id;
public StudentAbs() {
}
public StudentAbs(String name, int id) {
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
public class OrdinaryStudent extends StudentAbs implements Student{
public OrdinaryStudent() {
}
public OrdinaryStudent(String name, int id) {
super(name, id);
}
@Override
public void study() {
System.out.println("普通学生"+super.getName()+"在努力学习......");
}
}
public class SmartStudent extends StudentAbs implements Student{
public SmartStudent() {
}
public SmartStudent(String name, int id) {
super(name, id);
}
@Override
public void study() {
System.out.println(super.getName()+"在努力学习");
}
@Override
public void makeMoney() {
System.out.println("该生不仅会学习还会赚钱");
}
}
public class MainWork {
public static void main(String[] args) {
OrdinaryStudent ordinaryStudent= new OrdinaryStudent("产同同",202501);
Student student=ordinaryStudent;
student.study();
student.makeMoney();
student=new SmartStudent("产思意",202502);
student.study();
student.makeMoney();
}
}
7. 迷你共享单车项目的实现
//个人实现(未严格遵循面向对象原则,仅供参考)
public class ShareBike {
private int bikeId;
private String bikeName;
private int status;
private Date borrowTime;
public ShareBike() {
}
public ShareBike(int bikeId, String bikeName, int status, Date borrowTime) {
this.bikeId = bikeId;
this.bikeName = bikeName;
this.status = status;
this.borrowTime = borrowTime;
}
public int getBikeId() {
return bikeId;
}
public void setBikeId(int bikeId) {
this.bikeId = bikeId;
}
public String getBikeName() {
return bikeName;
}
public void setBikeName(String bikeName) {
this.bikeName = bikeName;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getBorrowTime() {
if(borrowTime!=null) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formattedDate = dateFormat.format(borrowTime);
//System.out.println(formattedDate);
return formattedDate;
}else{
return null;
}
}
public void setBorrowTime(Date borrowTime) {
this.borrowTime = borrowTime;
}
}
public class ShareBikeCompany {
private int bikeCompanyId;
private String bikeCompanyName;
private ShareBike[] sharedBikes;
private int bikeSum=0;
private int sharedCount;
public ShareBikeCompany() {
}
public ShareBikeCompany(int bikeCompanyId, String bikeCompanyName, ShareBike[] sharedBikes, int bikeSum, int sharedCount) {
this.bikeCompanyId = bikeCompanyId;
this.bikeCompanyName = bikeCompanyName;
this.sharedBikes = sharedBikes;
this.bikeSum = bikeSum;
this.sharedCount = sharedCount;
}
public int getBikeCompanyId() {
return bikeCompanyId;
}
public void setBikeCompanyId(int bikeCompanyId) {
this.bikeCompanyId = bikeCompanyId;
}
public String getBikeCompanyName() {
return bikeCompanyName;
}
public void setBikeCompanyName(String bikeCompanyName) {
this.bikeCompanyName = bikeCompanyName;
}
public ShareBike[] getSharedBikes() {
return sharedBikes;
}
public void setSharedBikes(ShareBike[] sharedBikes) {
this.sharedBikes = sharedBikes;
}
public int getBikeSum() {
return bikeSum;
}
public void setBikeSum(int bikeSum) {
this.bikeSum = bikeSum;
}
public int getSharedCount() {
return sharedCount;
}
public void setSharedCount(int sharedCount) {
this.sharedCount = sharedCount;
}
}
public class RunDemo {
private ShareBikeCompany[] shareBikeCompanies=new ShareBikeCompany[3];
private ShareBike[] shareBikes1=new ShareBike[3];
private ShareBike[] shareBikes2=new ShareBike[3];
private ShareBike[] shareBikes3=new ShareBike[3];
Scanner scanner=new Scanner(System.in);
public RunDemo() {
}
public void run(){
this.initialization();
String str;
do{
System.out.println("\t\t欢迎使用共享单车系统");
System.out.println("**************************************");
System.out.println("\t\t\t1.投放单车");
System.out.println("\t\t\t2.查看单车");
System.out.println("\t\t\t3.删除单车");
System.out.println("\t\t\t4.借出单车");
System.out.println("\t\t\t5.归还单车");
System.out.println("\t\t\t6.单车排行榜");
System.out.println("\t\t\t7.退 出");
System.out.println("**************************************");
System.out.println("选择您要进行的操作:");
int num=scanner.nextInt();
switch (num){
case 1:
eployBikes();
break;
case 2:
showAllBikes();
break;
case 3:
removeBikes();
break;
case 4:
borrowBikes();
break;
case 5:
backBikes();
break;
case 6:
rankBikes();
break;
default:
return;
}
System.out.println("是否继续y/n:");
str=scanner.next();
}while ("y".equals(str));
//this.showAllBikes();
}
private void rankBikes() {
ShareBikeCompany[] shareBikeCompanies1=Arrays.copyOf(shareBikeCompanies,shareBikeCompanies.length);
Arrays.sort(shareBikeCompanies1, new Comparator<ShareBikeCompany>() {
@Override
public int compare(ShareBikeCompany o1, ShareBikeCompany o2) {
return o2.getSharedCount()-o1.getSharedCount();
}
});
for (int i = 0; i < shareBikeCompanies1.length; i++) {
System.out.println(shareBikeCompanies1[i].getBikeCompanyName()+"共借出"+shareBikeCompanies1[i].getSharedCount()+"次");
}
}
private void backBikes() {
int comNum = getComNum();
System.out.println("请输入想要借出的单车编号:");
int biekNum=scanner.nextInt();
ShareBike[] shareBikes=shareBikeCompanies[comNum-1].getSharedBikes();
for (int i = 0; i < shareBikeCompanies[comNum-1].getBikeSum(); i++) {
if(shareBikes[i].getBikeId()==biekNum&&shareBikes[i].getStatus()==1){
String dateString = shareBikes[i].getBorrowTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
date = sdf.parse(dateString);
//System.out.println(date); // 输出转换后的Date对象
} catch (ParseException e) {
e.printStackTrace(); // 打印异常信息,例如日期格式不正确等。
}
// 将毫秒转换为秒
long seconds = date.getTime() / 1000;
Date date2=new Date();
long seconds1= date2.getTime()/1000;
long secondsRe= seconds1-seconds;
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formattedDate = dateFormat.format(date2);
shareBikes[i].setStatus(0);
shareBikes[i].setBorrowTime(null);
System.out.println("还车成功,还车时间:"+formattedDate);
System.out.println("此次花费:"+secondsRe*0.001);
return;
}else if(shareBikes[i].getStatus()==0){
System.out.println("此单车处于可借状态,无需还出,请重新输入!");
return;
}
}
System.out.println("单车编号不对!请重新输入!");
}
private void borrowBikes() {
int comNum = getComNum();
System.out.println("请输入想要借出的单车编号:");
int biekNum=scanner.nextInt();
ShareBike[] shareBikes=shareBikeCompanies[comNum-1].getSharedBikes();
for (int i = 0; i < shareBikeCompanies[comNum-1].getBikeSum(); i++) {
if(shareBikes[i].getStatus()==0&&shareBikes[i].getBikeId()==biekNum){
shareBikes[i].setStatus(1);
shareBikes[i].setBorrowTime(new Date());
shareBikeCompanies[comNum-1].setSharedCount(shareBikeCompanies[comNum-1].getSharedCount()+1);
return;
}
}
System.out.println("查无此单车,重新借出!");
}
private void removeBikes() {
int comNum = getComNum();
System.out.println("请输入想要删除的单车编号:");
int bikeNum= scanner.nextInt();
ShareBike[] shareBike=shareBikeCompanies[comNum-1].getSharedBikes();
for (int i = 0; i < shareBikeCompanies[comNum-1].getBikeSum(); i++) {
if(shareBike[i].getBikeId()==bikeNum){
if(shareBike[i].getStatus()==0){
for (int j = i; j < (shareBikeCompanies[comNum-1].getBikeSum() - 1); j++) {
shareBike[j] = shareBike[j + 1];
}
shareBike[shareBikeCompanies[comNum-1].getBikeSum()-1]=null;
//shareBikeCompanies[comNum].setSharedBikes(shareBike);
shareBikeCompanies[comNum-1].setBikeSum(shareBikeCompanies[comNum-1].getBikeSum()-1);
System.out.println("编号:" + bikeNum + "单车移除成功");
return;
}else{
System.out.println("此编号单车处于借出状态无法进行移除,请先归还单车!");
return;
}
}
}
System.out.println("查无此单车,请重新进行操作!");
}
private int getComNum() {
System.out.println("请输入单车公司编号:");
System.out.println("1.美团");
System.out.println("2.哈啰");
System.out.println("3.青桔");
int comNum=scanner.nextInt();
return comNum;
}
public ShareBikeCompany[] getShareBikeCompanies() {
return shareBikeCompanies;
}
public void initialization() {
for (int i = 0; i < shareBikeCompanies.length; i++) {
shareBikeCompanies[i]=new ShareBikeCompany();
shareBikeCompanies[i].setBikeCompanyId(i+1);
//shareBikeCompanies[i].setBikeSum(3);
shareBikeCompanies[i].setSharedCount(0);
if(i==0){
shareBikeCompanies[i].setBikeCompanyName("美团");
for (int j = 0; j < shareBikes1.length; j++) {
shareBikes1[j]=new ShareBike();
shareBikes1[j].setBikeId(j+1);
shareBikes1[j].setBikeName("美团单车"+j);
shareBikes1[j].setStatus(0);
shareBikes1[j].setBorrowTime(null);
shareBikeCompanies[i].setBikeSum(shareBikeCompanies[i].getBikeSum()+1);
}
shareBikeCompanies[i].setSharedBikes(shareBikes1);
}else if(i==1){
shareBikeCompanies[i].setBikeCompanyName("哈啰");
for (int j = 0; j < shareBikes2.length; j++) {
shareBikes2[j]=new ShareBike();
shareBikes2[j].setBikeId(j+1);
shareBikes2[j].setBikeName("哈啰单车"+j);
shareBikes2[j].setStatus(0);
shareBikeCompanies[i].setBikeSum(shareBikeCompanies[i].getBikeSum()+1);
}
shareBikeCompanies[i].setSharedBikes(shareBikes2);
}else{
shareBikeCompanies[i].setBikeCompanyName("青桔");
for (int j = 0; j < shareBikes3.length; j++) {
shareBikes3[j]=new ShareBike();
shareBikes3[j].setBikeId(j+1);
shareBikes3[j].setBikeName("青桔单车"+j);
shareBikes3[j].setStatus(0);
shareBikeCompanies[i].setBikeSum(shareBikeCompanies[i].getBikeSum()+1);
}
shareBikeCompanies[i].setSharedBikes(shareBikes3);
}
}
}
public void showAllBikes(){
for (int i = 0; i < shareBikeCompanies.length; i++) {
System.out.println("序号\t品牌\t数量\t借出次数");
System.out.print(shareBikeCompanies[i].getBikeCompanyId()+"\t");
System.out.print(shareBikeCompanies[i].getBikeCompanyName()+"\t");
System.out.print(shareBikeCompanies[i].getBikeSum()+"\t");
System.out.println(shareBikeCompanies[i].getSharedCount());
System.out.println("单车编号\t单车名称\t单车状态\t借出时间");
ShareBike[] shareBikes=shareBikeCompanies[i].getSharedBikes();
for (int j = 0; j < shareBikeCompanies[i].getBikeSum(); j++) {
System.out.print(shareBikes[j].getBikeId()+"\t\t");
System.out.print(shareBikes[j].getBikeName()+"\t");
if(shareBikes[j].getStatus()==0) {
System.out.print( "可借\t");
}else{
System.out.print("借出\t");
}
System.out.println(shareBikes[j].getBorrowTime());
}
}
}
public void eployBikes(){
System.out.println("------->1.投放单车");
System.out.println("""
1.美团单车
2.哈啰单车
3.青桔单车
""");
System.out.println("请选择要投放的单车品牌:");
int ll=scanner.nextInt();
System.out.println("请输入要投放的数量");
int ln =scanner.nextInt();
if(ll==1) {
if ((shareBikeCompanies[ll - 1].getBikeSum() + ln) > shareBikeCompanies[ll - 1].getSharedBikes().length) {
System.out.println("空间不足,已经参照配置进行扩容");
shareBikes1= Arrays.copyOf(shareBikes1,shareBikes1.length+ln);
//System.out.println(shareBikeCompanies[ll-1].getBikeSum());
shareBikeCompanies[ll-1].setSharedBikes(shareBikes1);
for(int i=shareBikeCompanies[ll-1].getBikeSum();i<(shareBikeCompanies[ll-1].getBikeSum()+ln);i++){
shareBikes1[i]=new ShareBike();
shareBikes1[i].setBikeId(i+1);
shareBikes1[i].setBikeName("美团单车"+i);
shareBikes1[i].setStatus(0);
}
shareBikeCompanies[ll-1].setBikeSum(shareBikeCompanies[ll-1].getBikeSum()+ln);
}else{
for(int i=shareBikeCompanies[ll-1].getBikeSum();i<(shareBikeCompanies[ll-1].getBikeSum()+ln);i++){
shareBikes1[i]=new ShareBike();
shareBikes1[i].setBikeId(i+1);
shareBikes1[i].setBikeName("美团单车"+i);
shareBikes1[i].setStatus(0);
}
System.out.println("投放"+ln+"辆美团单车成功");
shareBikeCompanies[ll-1].setBikeSum(shareBikeCompanies[ll-1].getBikeSum()+ln);
}
}else if(ll==2){
if ((shareBikeCompanies[ll - 1].getBikeSum() + ln) > shareBikeCompanies[ll - 1].getSharedBikes().length) {
System.out.println("空间不足,已经参照配置进行扩容");
shareBikes2= Arrays.copyOf(shareBikes2,shareBikes2.length+ln);
shareBikeCompanies[ll-1].setSharedBikes(shareBikes2);
for(int i=shareBikeCompanies[ll-1].getBikeSum();i<(shareBikeCompanies[ll-1].getBikeSum()+ln);i++){
shareBikes2[i]=new ShareBike();
shareBikes2[i].setBikeId(i+1);
shareBikes2[i].setBikeName("哈啰单车"+i);
shareBikes2[i].setStatus(0);
}
shareBikeCompanies[ll-1].setBikeSum(shareBikeCompanies[ll-1].getBikeSum()+ln);
}else {
for (int i = shareBikeCompanies[ll - 1].getBikeSum(); i < (shareBikeCompanies[ll-1].getBikeSum()+ln); i++) {
shareBikes2[i] = new ShareBike();
shareBikes2[i].setBikeId(i + 1);
shareBikes2[i].setBikeName("哈啰单车" + i);
shareBikes2[i].setStatus(0);
}
shareBikeCompanies[ll-1].setBikeSum(shareBikeCompanies[ll-1].getBikeSum()+ln);
}
System.out.println("投放"+ln+"辆哈啰单车成功");
}else{
if ((shareBikeCompanies[ll - 1].getBikeSum() + ln) > shareBikeCompanies[ll - 1].getSharedBikes().length) {
System.out.println("空间不足,已经参照配置进行扩容");
shareBikes3= Arrays.copyOf(shareBikes3,shareBikes3.length+ln);
shareBikeCompanies[ll-1].setSharedBikes(shareBikes3);
for(int i=shareBikeCompanies[ll-1].getBikeSum();i<(shareBikeCompanies[ll-1].getBikeSum()+ln);i++){
shareBikes3[i]=new ShareBike();
shareBikes3[i].setBikeId(i+1);
shareBikes3[i].setBikeName("青桔单车"+i);
shareBikes3[i].setStatus(0);
}
shareBikeCompanies[ll-1].setBikeSum(shareBikeCompanies[ll-1].getBikeSum()+ln);
}else {
for (int i = shareBikeCompanies[ll - 1].getBikeSum(); i < (shareBikeCompanies[ll-1].getBikeSum()+ln); i++) {
shareBikes3[i] = new ShareBike();
shareBikes3[i].setBikeId(i + 1);
shareBikes3[i].setBikeName("青桔单车" + i);
shareBikes3[i].setStatus(0);
}
shareBikeCompanies[ll-1].setBikeSum(shareBikeCompanies[ll-1].getBikeSum()+ln);
}
System.out.println("投放"+ln+"辆哈啰单车成功");
}
}
}
public class MainSystem {
public static void main(String[] args) {
new RunDemo().run();
}
}
//参考更规范的面向对象实现,有助于提升面向对象编程能力
public class ShareBike {
private int bikeId;
private String bikeName;
private int status;
private Date borrowTime;
public ShareBike() {
}
public ShareBike(int bikeId, String bikeName, int status, Date borrowTime) {
this.bikeId = bikeId;
this.bikeName = bikeName;
this.status = status;
this.borrowTime = borrowTime;
}
}
public interface ShareBikeBehavior {
void addBikes(int num);
void viewBikes();
void removeBikes(int num);
void borrowBikes(int num);
void backBikes(int num);
}
public class ShareBikeCompany implements ShareBikeBehavior{
private int bikeCompanyId;
private String bikeCompanyName;
private ShareBike[] sharedBikes;
private int bikeSum;
private int sharedCount;
public ShareBikeCompany(int bikeCompanyId, String bikeCompanyName, ShareBike[] sharedBikes, int bikeSum, int sharedCount) {
this.bikeCompanyId = bikeCompanyId;
this.bikeCompanyName = bikeCompanyName;
this.sharedBikes = sharedBikes;
this.bikeSum = bikeSum;
this.sharedCount = sharedCount;
}
public ShareBikeCompany() {
}
@Override
public void addBikes(int num) {
if (bikeSum + num> sharedBikes.length) {
System.out.println("空间不足,已经参照配置进行扩容");
sharedBikes = Arrays.copyOf(sharedBikes, sharedBikes.length + num);
//System.out.println(shareBikeCompanies[ll-1].getBikeSum());
//shareBikeCompanies[ll-1].setSharedBikes(shareBikes1);
for (int i = bikeSum; i < bikeSum + num; i++) {
sharedBikes[i] = new ShareBike();
sharedBikes[i].setBikeId(i + 1);
sharedBikes[i].setBikeName("美团单车" + i);
sharedBikes[i].setStatus(0);
}
System.out.println("投放"+num+"辆美团单车成功");
bikeSum += num;
}else{
for(int i=bikeSum;i<bikeSum+num;i++){
sharedBikes[i]=new ShareBike();
sharedBikes[i].setBikeId(i+1);
sharedBikes[i].setBikeName("美团单车"+i);
sharedBikes[i].setStatus(0);
}
System.out.println("投放"+num+"辆美团单车成功");
bikeSum+=num;
}
}
@Override
public void viewBikes() {
}
@Override
public void removeBikes(int num) {
//ShareBike[] shareBike=shareBikeCompanies[comNum-1].getSharedBikes();
for (int i = 0; i < bikeSum; i++) {
if(sharedBikes[i].getBikeId()==num){
if(sharedBikes[i].getStatus()==0){
for (int j = i; j < bikeSum - 1; j++) {
sharedBikes[j] = sharedBikes[j + 1];
}
sharedBikes[bikeSum-1]=null;
//shareBikeCompanies[comNum].setSharedBikes(shareBike);
bikeSum-=1;
System.out.println("编号:" + num + "单车移除成功");
return;
}else{
System.out.println("此编号单车处于借出状态无法进行移除,请先归还单车!");
return;
}
}
}
System.out.println("查无此单车,请重新进行操作!");
}
@Override
public void borrowBikes(int num) {
for (int i = 0; i < bikeSum; i++) {
if(sharedBikes[i].getStatus()==0&&sharedBikes[i].getBikeId()==num){
sharedBikes[i].setStatus(1);
sharedBikes[i].setBorrowTime(new Date());
sharedCount+=1;
return;
}
}
System.out.println("查无此单车,重新借出!");
}
@Override
public void backBikes(int num) {
for (int i = 0; i < bikeSum; i++) {
if(sharedBikes[i].getBikeId()==num&&sharedBikes[i].getStatus()==1){
String dateString = sharedBikes[i].getBorrowTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
date = sdf.parse(dateString);
//System.out.println(date); // 输出转换后的Date对象
} catch (ParseException e) {
e.printStackTrace(); // 打印异常信息,例如日期格式不正确等。
}
// 将毫秒转换为秒
long seconds = date.getTime() / 1000;
Date date2=new Date();
long seconds1= date2.getTime()/1000;
long secondsRe= seconds1-seconds;
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formattedDate = dateFormat.format(date2);
sharedBikes[i].setStatus(0);
sharedBikes[i].setBorrowTime(null);
System.out.println("还车成功,还车时间:"+formattedDate);
System.out.println("此次花费:"+secondsRe*0.001);
return;
}else if(sharedBikes[i].getStatus()==0){
System.out.println("此单车处于可借状态,无需还出,请重新输入!");
return;
}
}
System.out.println("单车编号不对!请重新输入!");
}
public int getBikeCompanyId() {
return bikeCompanyId;
}
public void setBikeCompanyId(int bikeCompanyId) {
this.bikeCompanyId = bikeCompanyId;
}
public String getBikeCompanyName() {
return bikeCompanyName;
}
public void setBikeCompanyName(String bikeCompanyName) {
this.bikeCompanyName = bikeCompanyName;
}
public ShareBike[] getSharedBikes() {
return sharedBikes;
}
public void setSharedBikes(ShareBike[] sharedBikes) {
this.sharedBikes = sharedBikes;
}
public int getBikeSum() {
return bikeSum;
}
public void setBikeSum(int bikeSum) {
this.bikeSum = bikeSum;
}
public int getSharedCount() {
return sharedCount;
}
public void setSharedCount(int sharedCount) {
this.sharedCount = sharedCount;
}
}
public class QjBikeCompany extends ShareBikeCompany{
public QjBikeCompany(int bikeCompanyId, String bikeCompanyName, ShareBike[] sharedBikes, int bikeSum, int sharedCount) {
super(bikeCompanyId, bikeCompanyName, sharedBikes, bikeSum, sharedCount);
}
public QjBikeCompany() {
}
}
public class MtBikeCompany extends ShareBikeCompany{
public MtBikeCompany(int bikeCompanyId, String bikeCompanyName, ShareBike[] sharedBikes, int bikeSum, int sharedCount) {
super(bikeCompanyId, bikeCompanyName, sharedBikes, bikeSum, sharedCount);
}
public MtBikeCompany() {
}
}
public class HaloBikeCompany extends ShareBikeCompany{
public HaloBikeCompany(int bikeCompanyId, String bikeCompanyName, ShareBike[] sharedBikes, int bikeSum, int sharedCount) {
super(bikeCompanyId, bikeCompanyName, sharedBikes, bikeSum, sharedCount);
}
public HaloBikeCompany() {
}
}
public class ShareBikeMag {
private ShareBikeCompany[] shareBikeCompanies;
Scanner scanner=new Scanner(System.in);
public void run(){
initial();
String str;
do {
System.out.println("\t\t欢迎使用共享单车系统");
System.out.println("**************************************");
System.out.println("\t\t\t1.投放单车");
System.out.println("\t\t\t2.查看单车");
System.out.println("\t\t\t3.删除单车");
System.out.println("\t\t\t4.借出单车");
System.out.println("\t\t\t5.归还单车");
System.out.println("\t\t\t6.单车排行榜");
System.out.println("\t\t\t7.退 出");
System.out.println("**************************************");
System.out.println("选择您要进行的操作:");
int num=scanner.nextInt();
switch (num){
case 1:
addBikes();
break;
case 2:
viewBikes();
break;
case 3:
removeBikes();
break;
case 4:
borrowBikes();
break;
case 5:
backBikes();
break;
case 6:
rankBikes();
break;
default:
return;
}
System.out.println("是否继续y/n:");
str=scanner.next();
} while ("y".equals(str));
}
private void rankBikes() {
ShareBikeCompany[] shareBikeCompanies1=Arrays.copyOf(shareBikeCompanies,shareBikeCompanies.length);
Arrays.sort(shareBikeCompanies1, new Comparator<ShareBikeCompany>() {
@Override
public int compare(ShareBikeCompany o1, ShareBikeCompany o2) {
return o2.getSharedCount()-o1.getSharedCount();
}
});
for (int i = 0; i < shareBikeCompanies1.length; i++) {
System.out.println(shareBikeCompanies1[i].getBikeCompanyName()+"共借出"+shareBikeCompanies1[i].getSharedCount()+"次");
}
}
private void backBikes() {
int comNum = getComNum();
System.out.println("请输入想要归还的单车编号:");
int bikeNum= scanner.nextInt();
shareBikeCompanies[comNum-1].backBikes(bikeNum);
}
private void borrowBikes() {
int comNum = getComNum();
System.out.println("请输入想要借出的单车编号:");
int bikeNum= scanner.nextInt();
shareBikeCompanies[comNum-1].borrowBikes(bikeNum);
}
private void removeBikes() {
int comNum = getComNum();
System.out.println("请输入想要删除的单车编号:");
int bikeNum= scanner.nextInt();
shareBikeCompanies[comNum-1].removeBikes(bikeNum);
}
private void addBikes() {
int comN = getComNum();
System.out.println("请输入要投放的数量");
int bikeNum =scanner.nextInt();
shareBikeCompanies[comN-1].addBikes(bikeNum);
}
private int getComNum() {
System.out.println("------->投放单车");
System.out.println("""
1.美团单车
2.哈啰单车
3.青桔单车
""");
System.out.println("请选择要投放的单车品牌:");
int ll=scanner.nextInt();
return ll;
}
public void viewBikes() {
for (int i = 0; i < shareBikeCompanies.length; i++) {
System.out.println("序号\t品牌\t数量\t借出次数");
System.out.print(shareBikeCompanies[i].getBikeCompanyId()+"\t");
System.out.print(shareBikeCompanies[i].getBikeCompanyName()+"\t");
System.out.print(shareBikeCompanies[i].getBikeSum()+"\t");
System.out.println(shareBikeCompanies[i].getSharedCount());
System.out.println("单车编号\t单车名称\t单车状态\t借出时间");
ShareBike[] shareBikes=shareBikeCompanies[i].getSharedBikes();
for (int j = 0; j < shareBikeCompanies[i].getBikeSum(); j++) {
System.out.print(shareBikes[j].getBikeId()+"\t\t");
System.out.print(shareBikes[j].getBikeName()+"\t");
if(shareBikes[j].getStatus()==0) {
System.out.print( "可借\t");
}else{
System.out.print("借出\t");
}
System.out.println(shareBikes[j].getBorrowTime());
}
}
}
private void initial() {
shareBikeCompanies =new ShareBikeCompany[3];
shareBikeCompanies[0]=new MtBikeCompany(1,"美团",new ShareBike[3],0,0);
shareBikeCompanies[1]=new MtBikeCompany(1,"哈啰",new ShareBike[3],0,0);
shareBikeCompanies[2]=new MtBikeCompany(1,"青桔",new ShareBike[3],0,0);
for (int i = 0; i < shareBikeCompanies.length; i++) {
//shareBikeCompanies[i]=new smjava.homework1117myself.ShareBikeCompany();
//shareBikeCompanies[i].setBikeCompanyId(i+1);
//shareBikeCompanies[i].setBikeSum(3);
//shareBikeCompanies[i].setSharedCount(0);
ShareBike[] shareBike=shareBikeCompanies[i].getSharedBikes();
if(i==0){
//shareBikeCompanies[i].setBikeCompanyName("美团");
for (int j = 0; j < shareBike.length; j++) {
shareBike[j]=new ShareBike();
shareBike[j].setBikeId(j+1);
shareBike[j].setBikeName("美团单车"+j);
shareBike[j].setStatus(0);
shareBike[j].setBorrowTime(null);
shareBikeCompanies[i].setBikeSum(shareBikeCompanies[i].getBikeSum()+1);
}
//shareBikeCompanies[i].setSharedBikes(shareBikes1);
}else if(i==1){
shareBikeCompanies[i].setBikeCompanyName("哈啰");
for (int j = 0; j < shareBike.length; j++) {
shareBike[j]=new ShareBike();
shareBike[j].setBikeId(j+1);
shareBike[j].setBikeName("哈啰单车"+j);
shareBike[j].setStatus(0);
shareBikeCompanies[i].setBikeSum(shareBikeCompanies[i].getBikeSum()+1);
}
//shareBikeCompanies[i].setSharedBikes(shareBike);
}else{
shareBikeCompanies[i].setBikeCompanyName("青桔");
for (int j = 0; j < shareBike.length; j++) {
shareBike[j]=new ShareBike();
shareBike[j].setBikeId(j+1);
shareBike[j].setBikeName("青桔单车"+j);
shareBike[j].setStatus(0);
shareBikeCompanies[i].setBikeSum(shareBikeCompanies[i].getBikeSum()+1);
}
shareBikeCompanies[i].setSharedBikes(shareBike);
}
}
}
}
public class TestDemo {
public static void main(String[] args) {
new ShareBikeMag().run();
}
}

雷达卡


京公网安备 11010802022788号







