昨天写了个房屋出租小项目,跟着韩老师写的,先是了解了怎么使用工具类,然后看了他分析的房屋租赁程序框架图,类与类之间的调用关系。
然后写了睡,睡醒了做饭吃,吃完了继续写,困了又继续睡,一直写到现在才写完,存在这以后可以在看一下。
我觉得我是真的菜,厉害的人几分钟就能写完了。。。反正视频里的弹幕各个都是人才,人外有人天外有天。
就是先自己尝试着写,写不出来就看讲解,看了又继续写,感觉还是存在一些小瑕疵,感兴趣的可以借鉴一下,又问题的可以直接私信我一起讨论学习啊。
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.当调用对象的属性时,没有动态绑定机制,哪里声明,那里使用