java学习|房屋出租小项目

87 阅读6分钟

昨天写了个房屋出租小项目,跟着韩老师写的,先是了解了怎么使用工具类,然后看了他分析的房屋租赁程序框架图,类与类之间的调用关系。

然后写了睡,睡醒了做饭吃,吃完了继续写,困了又继续睡,一直写到现在才写完,存在这以后可以在看一下。

我觉得我是真的菜,厉害的人几分钟就能写完了。。。反正视频里的弹幕各个都是人才,人外有人天外有天。

就是先自己尝试着写,写不出来就看讲解,看了又继续写,感觉还是存在一些小瑕疵,感兴趣的可以借鉴一下,又问题的可以直接私信我一起讨论学习啊。

HouseView.java <=>类[界面] 1.显示界面 2.接收用户的输入 3.调用HouseService完成对房屋信息的各种操作

package view;

import domain.House;
import service.HouseService;
import utils.Utilty;

import java.util.Scanner;

public class HouseView{
    boolean loop = true;
    private char key = ' ';
    //修改房屋信息
    public void update(){
        String details = "---------------------------修改房屋信息----------------------------";
        System.out.println("请输入要修改的id号");
        int updateId = Utilty.readInt();
        if (updateId == -1){
            System.out.println("放弃修改");
            return;
        }
        //根据输入的updateId查找对象
        //返回的是引用类型,即数组的元素
        //在后面对house.setxxx(),就会修改houseService中houses数组的元素
        House house = houseService.check(updateId);
        if(house == null){
            System.out.println("找不到要修改的对象");
            return;
        }
        System.out.println("姓名(" + house.getName()+ "):");
        String name = Utilty.readString(3,"");
        if(!"".equals(name)){//修改
            house.setName(name);//
        }
        System.out.println("电话(" + house.getPhone()+ "):");
        String phone = Utilty.readString(3,"");
        if(!"".equals(phone)){//修改
            house.setPhone(phone);
        }
        System.out.println("地址(" + house.getAddress()+ "):");
        String address = Utilty.readString(3,"");
        if(!"".equals(address)){//修改
            house.setAddress(address);
        }
        System.out.println("房租("+ house.getRent()+ "):");
        int rent = Utilty.readInt(-1);
        if(rent != -1){//修改
            house.setRent(rent);
        }
        System.out.println("状态(" + house.getState()+ "):");
        String state = Utilty.readString(3,"");
        if(!"".equals(state)){//修改
            house.setState(state);
        }
    }
    //查找房屋信息
    public void checkHouse(){
        String details = "---------------------------查找房屋信息----------------------------";
        System.out.println("请输入要查找的id号");
        int checkId = Utilty.readInt();
        //调用方法
        House house = houseService.check(checkId);
        if(house != null){
            System.out.println(house);
        }else {
            System.out.println("查找不到");
        }
    }
    //完成退出确认
    public void exit(){
        char c = Utilty.readConfirmSelection();
        if(c == 'Y'){
            loop = false;
            System.out.println("退出成功");
        }
    }
    //显示房屋列表
    private HouseService houseService = new HouseService(10);//设置数组大小10
    //删除房屋信息
    public void delHouse(){
        String details = "---------------------------删除房屋----------------------------";
        System.out.println("请选择待删除房屋编号(-1退出)");
        int delId = Utilty.readInt();
        if(delId == -1){
            System.out.println("放弃删除房屋信息");
            return;
        }
        //注意该方法本身就有判断循环的逻辑,必须h输出Y/N
        char choice = Utilty.readConfirmSelection();
        if(choice == 'Y'){//真的删除
            //调用方法
            if(houseService.del(delId)){
                System.out.println("==================删除房屋成功======================");
            }else {
                System.out.println("==================房屋编号不存在删除失败======================");
            }
        }else {
            System.out.println("放弃删除房屋信息");
        }
    }
    //新增房屋信息
    public void addHouse(){
        String details = "---------------------------添加房屋----------------------------";
        System.out.println("姓名");
        String name = Utilty.readString(8);
        System.out.println("电话");
        String phone = Utilty.readString(5);
        System.out.println("地址");
        String address = Utilty.readString(6);
        System.out.println("房租");
        int rent = Utilty.readInt(5);
        System.out.println("状态");
        String state = Utilty.readString(5);
        //创建一个新的House对象,注意id是系统分配的
        House newHouse = new House(0,name,phone,address,rent,state);
        if(houseService.add(newHouse)){
            System.out.println("==================添加房屋成功======================");
        }else {
            System.out.println("==================添加房屋失败======================");
        }
    }
    //定义listHouse()显示列表
    public void listHouse(){
        System.out.println("---------------------------房屋列表-------------------------");
        System.out.println("编号\t\t房主\t\t电话\t\t地址\t\t月租\t\t状态(未出租/已出租)");

        House[] houses = houseService.list();//得到房屋的所有信息
        for (int i = 0; i < houses.length; i++) {
            if(houses[i] == null){
                break;//如果为null,不用再显示了
            }
            System.out.println(houses[i]);
        }
        System.out.println("---------------------------房屋列表完成-------------------------\n");
    }
    //定义mainMenu()显示菜单
    public void mainMenu(){
        do{
            System.out.println("\n==================房屋出租系统菜单===================");
            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("请输入密度选择(1-6)");
            key = Utilty.readChar();//

            switch (key){
                case '1':
                    addHouse();
                break;
                case '2':
                    checkHouse();
                    break;
                case '3':
                    delHouse();
                    break;
                case '4':
                    update();
                    break;
                case '5':
                    listHouse();
                    break;
                case '6':
                    exit();
                    break;
            }
        }while(loop);
    }
}

HouseService.java<=>类[业务层] /定义House[] ,保存House对象 1.响应HouseView的调用 2.完成对房屋信息的各种操作(增删改查)

package service;

import domain.House;
import utils.Utilty;

public class HouseService {
    private House[] houses;//保存houses对象
    private int houseNum = 1;//记录当前有多少个房屋信息
    private int idCounter = 1;//记录当前的id增长到哪个值

    //构造器
    public HouseService(int size) {
        //new houses
        houses = new House[size];//当创建HouseService对象,指定数组大小
        //为了配合测试列表信息,这里初始化一个House对象
        houses[0] = new House(1,"kjkl","422","hkjh",245,"出租");
    }
    //check(),根据id查找,返回House对象或null
    public House check(int checkId){
        for (int i = 0; i < houseNum; i++) {
            if(checkId == houses[i].getId()){
               return houses[i];
            }
        }
        return null;
    }
    //del(),删除房屋信息,返回boolean
    public boolean del(int delId) {
        //应先找到要删除的房屋信息对应的下标,下标和房屋的编号不是同一回事
        int index = -1;
        for (int i = 0; i < houseNum; i++) {
            if(delId == houses[i].getId()){//要删除的房屋id,是数组下标为i的元素
                index = i;//就用index记录i
            }
        }
        if(index == -1){//说明delId再数组中不存在
            return false;
        }
        //如果找到
        for (int i = 0; i < houseNum-1; i++) {
            houses[i] = houses[i+1];
        }
        houses[houseNum-1] = null;//把当前存在的房屋信息的最后一个设置null
        houseNum--;
        return true;
    }
    //add(),添加新对象,返回boolean
    public boolean add(House newHouse) {
        //判断是否还可以继续添加(不考虑数组扩容的问题)=>加入扩容机制??
        if (houseNum == houses.length) {
            System.out.println("数组已满,不能再添加");
            return false;
        }
        //把newHouse对象加入到,新增加了一个房屋
        houses[houseNum++] = newHouse;
//        houseNum++;//新增加了一个房屋
        //需要设计一个id自增长的机制,然后更新newHouse的id
//        idCounter++;
        newHouse.setId(++idCounter);
        return true;
    }
    //列表 list方法,返回houses
    public House[] list() {
        return houses;
    }
}

House.java <=>类[domain/model/数据层]1. 一个House对象表示一 个房屋信息2. House类有哪些属性,可以通过给出的界面分析得到

package domain;

public class House {
    //一个House对象表示一个房屋信息
    private int id;
    private String name;
    private String phone;
    private String address;
    private int rent;
    private String state;

    public House(int id, String name, String phone, String address, int rent, String state) {
        this.id = id;
        this.name = name;
        this.phone = phone;
        this.address = address;
        this.rent = rent;
        this.state = state;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public int getRent() {
        return rent;
    }

    public void setRent(int rent) {
        this.rent = rent;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    //为了方便输出信息,实现toString
    @Override
    public String toString() {
        return id +
                "\t\t" + name +
                "\t" + phone +
                "\t\t" + address +
                "\t" + rent +
                "\t\t" + state;
    }
}

HouseRentApp.java main() {/程序入口 //创建HouseView对象 //调用该对象,显示主菜单

package domain;

import view.HouseView;

public class HouseRentApp {
    public static void main(String[] args) {
//        HouseView houseView = new HouseView();
        new HouseView().mainMenu();
        System.out.println("你已退出房屋出租系统");
    }
}

什么是多态,多态具体体现有哪些?

多态:方法或对象具有多种形态,是OOP的第三大特征,是建立在封装和继承基础之上多态具体体现

1.方法多态 (1)重载体现多态(2)重写体现多态

2.对象多态 (1)对象的编译类型和运行类型可以不一致,编译类型在定义时,就确定,不能变化 (2)对象的运行类型是可以变化的,可以通过getClasss()来查看运行类型 (3)编译类型看定时时=号的左边,运行类型看=号右边

1.当调用对象的方法时,该方法会和对象的内存地址/运行类型绑定 2.当调用对象的属性时,没有动态绑定机制,哪里声明,那里使用