借鉴了很多幕友的代码,自己试着写写(下午加晚上) 算是总结
1.首先创建抽象父类Car 供子类继承,共同属性id,name和price 属性设置抽象方法setProperties();
public abstract class Car {
public int id;//序号
public String name;//车名
public int price;//租金
//抽象方法,设置属性
public abstract void setProperties(int newId, String newNmame, int newPrice);
}
2.两个接口:载货 ILoadGoods 载人 ILoadPerson (注意Java只能单继承,但可以多实现)
//载人接口
public interface ILoadPerson {
public void setPerson(int newPerson);
public int getPerson();
}
//载货接口
public interface ILoadGoods {
public void setGoods(int newGoods);
public int getGoods();
}
3.创建三个子类 分别继承父类和实现相应接口
客车类 继承Car类,因为是客车,所以只需实现载人接口即可
public class PersonCar extends Car implements ILoadPerson {
private int person;//私有属性 载客量
//构造函数
public PersonCar(int newId, String newNmame, int newPrice, int newPerson) {
// TODO Auto-generated constructor stub
//设置属性
setProperties(newId, newNmame, newPrice);
//设置载客量
setPerson(newPerson);
}
@Override //覆盖接口中的抽象方法
public void setPerson(int newPerson) {
// TODO Auto-generated method stub
this.person = newPerson;
}
@Override//覆盖接口中的抽象方法
public int getPerson() {
// TODO Auto-generated method stub
return person;
}
@Override//覆盖父类中的抽象方法
public void setProperties(int newId, String newNmame, int newPrice) {
// TODO Auto-generated method stub
this.id = newId;
this.name = newNmame;
this.price = newPrice;
}
//此处注意要覆盖Object类中的toString 方法,方便打印实例对象时输出字符串而不是地址
public String toString(){
return id+". "+name+"\t"+price+"元/天 "+"载人:"+getPerson()+"人";
}
}
货车类 继承Car类,因为是货车,所以只需实现载货接口即可
public class GoodsCar extends Car implements ILoadGoods {
private int goods; //私有属性 载货量
//构造函数 创建实例对象初始化
public GoodsCar(int newId, String newNmame, int newPrice, int newGoods) {
// TODO Auto-generated constructor stub
setProperties(newId, newNmame, newPrice);
setGoods(newGoods);
}
@Override //覆盖接口中的抽象方法
public void setGoods(int newGoods) {
// TODO Auto-generated method stub
this.goods = newGoods;
}
@Override //覆盖接口中的抽象方法
public int getGoods() {
// TODO Auto-generated method stub
return goods;
}
@Override //覆盖父类中的抽象方法
public void setProperties(int newId, String newNmame, int newPrice) {
// TODO Auto-generated method stub
this.id = newId;
this.name = newNmame;
this.price = newPrice;
}
public String toString(){
return id+". "+name+"\t"+price+"元/天 "+"载货:"+getGoods()+" 吨";
}
}
皮卡类 继承Car类 因为是皮卡,所以既需要实现载人接口也需要载货接口
public class PickUpCar extends Car implements ILoadGoods, ILoadPerson {
private int person;//私有属性
private int goods;//私有属性
//构造函数
public PickUpCar(int newId, String newNmame, int newPrice, int newPerson, int newGoods) {
// TODO Auto-generated constructor stub
setProperties(newId, newNmame, newPrice);
setGoods(newGoods);
setPerson(newPerson);
}
@Override //覆盖接口中的抽象方法
public void setPerson(int newPerson) {
// TODO Auto-generated method stub
this.person = newPerson;
}
@Override //覆盖接口中的抽象方法
public int getPerson() {
// TODO Auto-generated method stub
return person;
}
@Override //覆盖接口中的抽象方法
public void setGoods(int newGoods) {
// TODO Auto-generated method stub
this.goods = newGoods;
}
@Override //覆盖接口中的抽象方法
public int getGoods() {
// TODO Auto-generated method stub
return goods;
}
@Override//覆盖父类中的抽象方法
public void setProperties(int newId, String newNmame, int newPrice) {
// TODO Auto-generated method stub
this.id = newId;
this.name = newNmame;
this.price = newPrice;
}
public String toString(){
return id+". "+name+"\t"+price+"元/天 "+"载人:"+getPerson()+"人"+" "+"载货:"+getGoods()+" 吨";
}
}
4.测试类 Users
import java.util.Scanner; //导入包,用于键盘录入
public class Users {
private static int rentDay,rentNum;//租车天数,租车数量
private static int allPerson;//所有载客量
private static int allGoods;//所有载货量
private static int allMoney;//所有租金
private static int[] idNum;//存储选择的车型序号
//创建各种车实例对象 要静态 因为后面要用 实例.属性 调用 否则还要在各类中写get方法(这里偷懒了)
private static Car[] cars = {new PersonCar(1,"奥迪A4",500, 4),
new PersonCar(2, "马自达6", 400, 4),
new PickUpCar(3, "皮卡雪6", 450, 4, 2),
new PersonCar(4, "金龙", 800, 20),
new GoodsCar(5, "松花江", 400, 4),
new GoodsCar(6, "依维柯", 1000, 20)};
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("欢迎使用答答租车系统!");
System.out.println("您是否要租车?(1是 0否)请选择:");
Scanner input = new Scanner(System.in);
int choice = input.nextInt();//调用键盘输入
if (choice != 1) {
System.out.println("欢迎再次光临");
System.exit(0);
}else{
//打印车辆信息
System.out.println("您可租车的类型及其价目表如下所示:");
System.out.println("序号 汽车类型 租金 容量");
for (Car car : cars){
System.out.println(car);
}
}
System.out.println("请输入您要租车的数量(1辆起租):");
rentNum = input.nextInt();
idNum = new int[rentNum];//创建一个租车数量长度的 id数组,存储输入的id
for (int i =1;i<=rentNum;i++){
System.out.println("请输入第"+i+"辆车的序号:");
idNum[i-1] = input.nextInt();
}
System.out.println("请输入租车天数:");
rentDay = input.nextInt();
input.close(); //关闭Scanner 不然会有警告(本人有强迫症)
//打印账单
new Users().PrintBill();
}
public void PrintBill(){
String strPerson = ""; //载人车型名称 必须要先初始化赋值 不然后面会报错
String strGoods = ""; //载货车型名称
for (int carId :idNum){
for (Car car : cars){
if(car.id ==carId){
//先计算租金,因为租金不受车型影响,照加不误
allMoney += car.price;
/*再逐个判断是哪种车型
*关键字instanceof 判断一个实例是否是某个类的对象 返回boolean量
*也可使用getClass()函数做判断 :if(car.getClass == PersonCar.class )
*每个Id 都只能执行其中一个if代码块
*/
if(car instanceof PersonCar){
strPerson = strPerson + car.name + " ";
allPerson += ((PersonCar) car).getPerson();//注意需要类型转换 ecli会自动帮你加上
}else if(car instanceof GoodsCar){
strGoods = strGoods + car.name + " ";
allGoods += ((GoodsCar) car).getGoods();
}else if(car instanceof PickUpCar){
strPerson = strPerson + car.name + " ";
strGoods = strGoods +car.name + " ";
allPerson += ((PickUpCar) car).getPerson();
allGoods += ((PickUpCar) car).getGoods();
}
}
}
}
System.out.println("您的账单如下:");
System.out.println("可载人的车型有:");
System.out.println(strPerson+"\t共可载人:"+allPerson+" 人");
System.out.println("可载货的车型有:");
System.out.println(strGoods+"\t共可载货:"+allGoods+" 吨");
System.out.println("您租车的总价格为:"+allMoney*rentDay+" 元\n 感谢您的使用");
}
}
点击查看更多内容
19人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦