package com.stduy;
import java.util.Scanner;
//从功能上分,总共分为三种,载人汽车,载货汽车,既载人又载货。
//对应Bus,Truck,PickUp
public class Initail {
private static int choice;
static Scanner input = new Scanner(System.in);
private static Car[] cars= new Car[]{
new Bus("巴士车",500,10),
new Truck("卡车",300,5),
new PickUp("皮卡车", 600, 6, 7)
};
public static void main(String[] args) {
System.out.println("欢迎使用租车系统");
//Java不需要先声明,和C不同。
// 原因是:类加载编译时就把程序的入口初始化了,执行时是JAVA虚拟机所识别的特定字节码,
// C却是处理器可直接执行的二进制指令,编译的原理不一样,语言独特的特性与运行环境不一样。
IsNeed();//判断是否要租车
if(choice==1){
DisplayList(); //显示可租车清单
int num=RentNum();//获取租车的种类数
RentList[] rentLists=new RentList[num];//填写出租信息表
rentLists=RentForm(num);
Pay(rentLists,cars);//生成账单
}
}
public static void IsNeed() {
System.out.println("您是否要租车:1是 0否");
choice = input.nextInt();
if (choice == 0) {
System.out.println("感谢使用,再见");
} else if (choice != 1) {
System.out.println("输入错误,请重新输入");
}
}
//关键字instanceof,测试一个对象是否为一个类的实例
public static void DisplayList(){
System.out.println("您可租车的型号和价格表");
for(int i = 0; i<cars.length; i++){
if(cars[i] instanceof Bus){
Bus car=(Bus)cars[i];//强制类型转换
System.out.println((i + 1) + " " + car.name+" "+car.rent+"元/天"+" "+"核载"+car.person+"人");
}
else if(cars[i] instanceof Truck){
Truck car=(Truck)cars[i];
System.out.println((i + 1) + " " + car.name+" "+car.rent+"元/天"+" "+"核载"+car.goods+"吨");
}
else if(cars[i] instanceof PickUp){
PickUp car=(PickUp)cars[i];
System.out.println((i + 1) + " " + car.name+" "+car.rent+"元/天"+" "+"核载"+car.person+"人"+" "+"核载"+car.goods+"吨");
}
}
}
//以下为输入部分
//获取租车数量
private static int RentNum(){
System.out.println("请输入您要总共租车的种类数:");
int RentNum=input.nextInt();
return RentNum;
}
//租车信息表
private static RentList[] RentForm (int num){
//租车信息对象数组
RentList[] rentLists=new RentList[num];
for(int i=0;i<num;i++){
//型号
System.out.println("请输入租的第"+(i+1)+"类车的信息");
System.out.print("型号:");
int Model=input.nextInt();
//该型号的数量
System.out.print("数量:");
int Num=input.nextInt();
//该型号租的天数
System.out.print("天数:");
int Day=input.nextInt();
//将信息存入对象数组
rentLists[i]=new RentList();//这步不能掉
rentLists[i].setModel(Model);
rentLists[i].setNum(Num);
rentLists[i].setDay(Day);
}
return rentLists;
}
//生成账单
private static void Pay(RentList[] rentLists,Car[] cars){
//打印清单
System.out.println("************结算清单*************");
System.out.println("型号 数量 租用天数");
double SumMoney=0;
for(int i=0;i<rentLists.length;i++){
//用get方法获得数据,更好的封装RentList类
int Model=rentLists[i].getModel();
int Num=rentLists[i].getNum();
int Day=rentLists[i].getDay();
double Rent=cars[i].getRent();
SumMoney+=Num*Day*Rent;
System.out.println(Model+" "+Num+" "+Day);
}
System.out.println("您总共要支付"+SumMoney+"元");
}
//这里也可以通过重写toString方法输出
//toString方法为Object类中的方法,返回对象的哈希码,即地址
//不重写toString方法,则直接输入对象是输出该对象的地址
}//父类,车
package com.stduy;
//车
public class Car {
protected String name;//车型,protect方便继承
protected double rent;//租金
public Car(String name,double rent){//用构造方法初始化
this.name=name;
this.rent=rent;
}
public String getName() {
return name;
}
public double getRent() {
return rent;
}
public void setName(String name) {
this.name = name;
}
public void setRent(double rent) {
this.rent = rent;
}
}//载人车
package com.stduy;
//Bus,载人汽车
public class Bus extends Car {
//子类的构造过程当中必须调用其父类的构造方法
//无参时隐式执行super(),子类如果没有显式调用,父类又没有无参的构造方法则编译出错
//java里一个类可以有多个构造方法
//super关键字必须放在第一行
protected int person;//载人数
//构造方法
public Bus(String name, double rent,int person) {
super(name, rent);
this.person=person;
}
public int getPerson() {
return person;
}
public void setPerson(int person) {
this.person = person;
}
}//载货车
package com.stduy;
//货车
public class Truck extends Car{
protected double goods;//货物
//构造方法
public Truck(String name, double rent, double goods) {
super(name, rent);
this.goods=goods;
}
public double getGoods() {
return goods;
}
public void setGoods(double goods) {
this.goods = goods;
}
}//既载货又载人
package com.stduy;
//皮卡,既能载货又能载人
public class PickUp extends Car {
protected int person;//载人数
protected double goods;//货物
//构造方法
public PickUp(String name, double rent,int person,double goods) {
super(name, rent);
this.person=person;
this.goods=goods;
}
public int getPerson() {
return person;
}
public double getGoods() {
return goods;
}
public void setPerson(int person) {
this.person = person;
}
public void setGoods(double goods) {
this.goods = goods;
}
}//租车信息表
package com.stduy;
//租车信息表
public class RentList {
private int Model;//型号
private int Num;//要租该型号的数量
private int Day;//要租该型号的天数
public int getModel() {
return Model;
}
public int getNum() {
return Num;
}
public int getDay() {
return Day;
}
public void setModel(int model) {
Model = model;
}
public void setNum(int num) {
Num = num;
}
public void setDay(int day) {
Day = day;
}
}膜拜大佬,大佬学习多久了
为啥我自己就写不出来呢??难过
大神厉害!我自己按照你的这个写了一遍,发现了一个bug;如果只租两种或一种车,结果就会出现错误。建议把double Rent = cars[i].getRent();改成double Rent = cars[Model-1].getRent();
你好,想问个问题,你的Pay方法中,rentList 和 cars的型号没有判断是否匹配,如果用户不按照顺序选择车的类型,车的租金应该会匹配有误吧
写掉了要算的总核载量和总核载人数,不过大同小异,就那里加几行

附一下运行结果