java基础,封装,继承,多态,集合的综合案例

       关于java基础中的封装、继承、多态和集合,写了一个简单地案例。对于不太懂这方面的新手希望会有助于你们理解,如果是大神可以提出改进意见,谢谢。关于这方面的概念性的东西我也解释不好,所以就不多说了。

       本案例没有用到和抽象类接口。简单介绍一下这个案例:《宠物商店》

        功能,宠物商店可以进购宠物,可以出售宠物。宠物具有吃东西和玩耍的能力,宠物主人可以在宠物商店购买宠物,可以给宠物起名字,可以陪宠物玩,喂宠物。主人每次与宠物有关的行为都会增加宠物与主人的亲密值。有些功能没有完善,也有些方法没有在测试类里实现,希望小伙伴们可以完善一下,也希望能多提一些改进意见。java~java~java~

        案例中用到的一些其他比较关键性知识:

                  instanceof 用于比较两个对象是否为同一类型或者是继承关系。

                  重写了equals方法和hashCode方法,防止向宠物的HashMap集合中行添加同一种对象。

                  重写了toString方法,便于打印宠物信息。

        下面是每一种类的简单介绍:

       1.Pet.java ,宠物类 ,有各种属性,其中重写了equals方法,hashCode方法,toString方法

                属性:private String id;            //id
                           private String strain;     //品种
                           private int loveNum;     //与主人的亲密值
                           private int num;            //数量
                           private String name;     //爱宠的名字
                           public static List<Pet> petSpecies;private String id;//存放宠物种类的集合

        2.Dog.java ,宠物狗类,继承了Pet.java,也就代表着继承了Pet.java中的equals等方法。重写了Pet.java中的eat()和play()方法。

        3.Cat.java,宠物猫类, 继承了Pet.java。重写了Pet.java中的eat()和play()方法。

        4.PetShop.java,宠物商店类, 拥有一个HashMap集合,名为pets,类似于宠物店中的笼子,存放着各种宠物供顾客购买。

        5.Master.java,主人类,宠物的主人,有一个ArrayList集合,名为myPets,用于保存自己所拥有的宠物的记录。

        6.Test.java,测试类,也可以说是实现类。

下面是完整的代码:

                   

import java.util.ArrayList;
import java.util.List;

public class Pet {
	private String id;
	private String strain;
	private int loveNum;
	private int num;
	private String name;
	public static List<Pet> petSpecies;

	static {         //静态代码块,只会在第一次执行构造方法的时候执行,初始化petSpecies集合
		petSpecies = new ArrayList<Pet>();
		petSpecies.add(new Pet("001","波斯猫",0,9999));
		petSpecies.add(new Pet("002","加菲猫",0,9999));
		petSpecies.add(new Pet("003","哈士奇",0,9999));
		petSpecies.add(new Pet("004","中华田园犬",0,9999));
		petSpecies.add(new Pet("005","中华田园猫",0,9999));
		petSpecies.add(new Pet("006","牧羊犬",0,9999));
		System.out.println("id\t品种");
		for(Pet pet:petSpecies) {
			System.out.println(pet);
		}
	}
	
	public Pet(String id,String strain, int loveNum,int num) {
		this.strain = strain;
		this.id = id;
		this.loveNum = loveNum;
		this.num = num;
	}

	public Pet(){
	
	}
	
	//商店进购宠时,根据商家所选的id和数量给商家返回宠物
	public static Pet givePetToShop(String petId,int petNum) {
		Pet pet = null;
		for(Pet p:petSpecies) {
			if(p.getId().equals(petId)) {
				pet = p;
				pet.setNum(petNum);
				return pet;
			}
		}
		return pet;
	}

	public void eat() {
		System.out.println(strain+"正在开心的吃东西");
	}
	
	@Override//重写toString方法
	public String toString() {
		return this.id+"\t" + this.strain +"\t";
	}
	
	@Override//重写hashCode方法
	public int hashCode() {
		return this.getId().hashCode();
	}
	
	@Override//重写equals方法
	public boolean equals(Object obj) {
		if(obj instanceof Pet) {//判断obj类是否为Pet类或Pet的子类
			Pet other  = (Pet)obj;
			if(this.getId().equals(other.getId())) {
				if(this.getStrain().equals(other.getStrain())) {
					return true;
				}
			}
		}
		return false;
	}
	
	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public String getName() {
		return name;
	}

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

	public String getId() {
		return id;
	}

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

	public String getStrain() {
		return strain;
	}

	public void setStrain(String strain) {
		this.strain = strain;
	}

	public int getLoveNum() {
		return loveNum;
	}

	public void setLoveNum(int loveNum) {
		this.loveNum = loveNum;
	}

	public void play() {
		System.out.println("父类的eat方法执行了");
	}
}
public class Dog extends Pet {
	private String name;
	public Dog() {

	}
	
	public Dog(String id,String strain,int loveNum,int num,String name) {
		super(id,strain,loveNum,num);//调用父类的有参数的构造方法
		this.name = name;
	}
	
	@Override//重写继承Pet类中的eat()方法
	public void eat() {
		System.out.println("宠物狗"+name + ":吃的好饱,亲密值加5哦!");
		this.setLoveNum(this.getLoveNum()+5);//亲密值加5
	}
	
	//玩游戏的方法//重写继承的play方法
	public void play() {
		System.out.println("宠物狗"+name+":玩的很开心,亲密值加10!");
		this.setLoveNum(this.getLoveNum()+10);//亲密值加10
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}
public class Cat extends Pet {
	private String name;
	public Cat() {
	}
	
	public Cat(String id,String strain,int loveNum,int num,String name) {
		super(id,strain,loveNum,num);
		this.name = name;
	}
	
	@Override//重写eat()方法
	public void eat() {
		System.out.println("宠物猫"+name + ":吃的好饱,亲密值加3哦!");
		this.setLoveNum(this.getLoveNum()+3);
	}

	//玩游戏的方法
	@Override
	public void play() {
		System.out.println("宠物猫"+name+":玩的很开心,亲密值加5!");
		this.setLoveNum(this.getLoveNum()+5);
	}

	public String getName() {
		return name;
	}

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

}
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 * 
* @ClassName: PetShop  
* @Description: 宠物商店,具有进购宠物、售卖宠物等功能(方法)
* @author yemao  
* @date 2019年3月20日  
*
 */
public class PetShop {
	private static String name;//店铺名称
	private static String address;//店铺地址
	private boolean isHasCustom;//判断是否有顾客前来
	private static HashMap<Pet,Integer> pets;//存放宠物的集合,键是Pet类,值是宠物的数量
	
	static{//静态代码块,初始化商店里的宠物,只会在第一次执行构造方法 的时候执行
		name = "好再来";
		address = "二七区海为科技园";
		System.out.println("---------"+name+"宠物店——"+address+"分店-------------");
		Cat boSiCat = new Cat("001","波斯猫",0,3,"");
		Cat coffeCat = new Cat("002","加菲猫",0,2,"");
		Dog haShiqi =  new Dog("003","哈士奇",0,2,"");
		Dog tianYuanQuan =  new Dog("004","中华田园犬",0,4,"");
		pets = new HashMap<Pet,Integer>();
		pets.put(boSiCat, boSiCat.getNum());
		pets.put(coffeCat,coffeCat.getNum());
		pets.put(haShiqi, haShiqi.getNum());
		pets.put(tianYuanQuan,tianYuanQuan.getNum());
	}
	
	public PetShop(String name, String address) {
		super();
		this.isHasCustom = false;
	}
	public PetShop() {
		this.isHasCustom = false;
	}
	/**
	 * 展示宠物
	 */
	public void showAllPet() {
		System.out.println("编号\t品种\t数量");
		Set<Map.Entry<Pet,Integer>> entry = pets.entrySet();
		Iterator it = entry.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
	}
	//依据id返回宠物
	public Pet getPetById(String id) {
		if(id != null) {
			for(Pet p:pets.keySet()) {
				if(p.getId().equals(id)) {
					return p;
				}
			}
		}
		return null;
	}
	
	/**
	 * 进购宠物,这里就用到了重写的equals方法和hashCode方法
	 */
	public boolean purchasePets(Pet pet) {
		Set<Map.Entry<Pet, Integer>> entry = pets.entrySet();
		Iterator it = entry.iterator();
		while(it.hasNext()) {
			if(it.next().equals(pet)) {//如果商店已经包含此宠物,只需更新此宠物的数量
				pets.put(pet, pets.get(pet)+pet.getNum());
				return true;
			}
		}
		pets.put(pet, pet.getNum());
		return true;
	}
	/**
	 * 	添加宠物,如果已经包含该宠物,则只更改宠物的数量
		此功能需要先重写hashCode()和equals()方法
	 */
	public boolean addPetToShop(Pet pet) {
		if(pet == null)
			return false;
		if(pets.containsKey(pet)) {
			pets.put(pet, pets.get(pet)+pet.getNum());
			return true;
		}else {
			pets.put(pet, pet.getNum());
			return true;
		}
	}
	
	/**
	 * 从商店出售宠物
	 */
	public boolean removePetFromShop(Pet pet) {
		if(pet == null)
			return false;
		for(Pet p:pets.keySet()) {
			if(p.equals(pet) && pets.get(p) == pet.getNum()) {
				pets.remove(p);
				return true;
			}
			if(p.equals(pet) && pets.get(p) > pet.getNum()) {
				pets.put(pet, pets.get(p) - pet.getNum());
				return true;
			}
			if(p.equals(pet) && pets.get(p) < pet.getNum()) {
				return false;
			}
		}	
		return false;
	}

	/**
	 * 判断是否有顾客前来
	 * @return
	 */
	public boolean isHasCustom() {
		return isHasCustom;
	}
	
	public void setHasCustom(boolean isHasCustom) {
		this.isHasCustom = isHasCustom;
	}
	public String getName() {
		return name;
	}

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

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}
	
	public HashMap<Pet,Integer> getPets() {
		return pets;
	}
	
}
import java.util.ArrayList;
import java.util.List;
/**
 * 
* @ClassName: Master  
* @Description:主人类,有购买宠物等行为(也就是方法)
* @author yemao  
* @date 2019年3月21日  
 */
public class Master {
	private String name;
	List<Pet> myPets;
	
	public Master() {
		myPets = new ArrayList<Pet>();
	}
	
	public Master(String name) {
		myPets = new ArrayList<Pet>();
		this.name = name;
	}
	
	//去宠物店的行为
	public boolean goPetShop(PetShop shop) {
		shop.setHasCustom(true);
		return true;
	}
	
	//浏览宠物行为
	public void scanPet(PetShop shop) {
		if(goPetShop(shop)) {
			shop.showAllPet();
		}else {
			System.out.println("暂时无法浏览宠物!");
		}
	}
	//离开商店的行为
	public void outShop(PetShop shop) {
		shop.setHasCustom(false);
	}
	
	//更新myPets中的宠物的信息
	public  boolean updateMyPets(Pet pet) {
		for(int i = 0;i < myPets.size();i++) {
			if(myPets.get(i).equals(pet)) {
				myPets.get(i).setName(pet.getName());
				myPets.get(i).setNum(pet.getNum());
				myPets.get(i).setLoveNum(pet.getLoveNum());
				return true;
			}
		}
		return false;
	}
	//给宠物命名并更新宠物
	public boolean setNameToPet(Pet pet,String name) {
		if(pet != null && name != null) { 
			pet = getPetStrain(pet);//获取宠物的种类
			pet.setName(name);//如果是Dog类,就执行Dog类的方法
			pet.setLoveNum(50);
			updateMyPets(pet);
			return true;
			}
		return false;
	}
	//购买宠物
	public boolean buyPet(Pet pet,PetShop shop) {
		if(pet != null) {
			pet.setNum(1);
			myPets.add(pet);
			shop.removePetFromShop(pet);//这里宠物商店里的宠物要减少一只
			return true;
		}
		else
			return false;
	}
	
	/**
	 * 给宠物喂食
	 */
	public boolean feedPet(Pet pet) {
		if(pet!= null) {
			 getPetStrain(pet).eat();
			 return true;
		}
		return false;
	}
	
	//陪宠物玩耍
	public boolean playWithPet(Pet pet) {
		if(pet!= null) {
			 getPetStrain(pet).play();
			 return true;
		}
		return false;
	}
	//查看所拥有的宠物信息
	public boolean scanMyPets() {
		if(myPets.size()==0) {
			return false;
		}
		System.out.println("id\t品种\t名字\t亲密值");
		for(Pet p:myPets) {
			System.out.print(p.getId()+"\t"+p.getStrain()+"\t"+p.getName()+"\t"+p.getLoveNum()+"\n");
		}
		return true;
	}
	
	//查看某个宠物的亲密值
	public void loveNumWithPet(String name) {
		Pet pet = getMyPetByName(name);
		System.out.println(pet.getName() + ":我们的亲密值为"+pet.getLoveNum());
	}
	
	//通过名字查找宠物
	public Pet getMyPetByName(String petName) {
		for(Pet pet:myPets) {
			if(pet.getName().equals(petName)) {
				return pet;
			}
		}
		return null;
	}
	
	//获取宠物的品种
	public Pet getPetStrain(Pet pet) {
		if(pet.getStrain().equals("波斯猫")||pet.getStrain().equals("加菲猫")) {
			return((Cat)(pet));
		}
		if(pet.getStrain().equals("哈士奇")||pet.getStrain().equals("中华田园犬")) {
			return((Dog)(pet));
		}
		return  null;
	}
	public String getName() {
		return name;
	}

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

	public List<Pet> getMyPets() {
		return myPets;
	}

	public void setMyPets(List<Pet> myPets) {
		this.myPets = myPets;
	}

}
import java.util.Scanner;

/**
 * @ClassName: Test
 * @Description: 测试类
 * @author yemao
 * @date 2019年3月20日
 * ArrayList在遍历的时候如果同时删除元素就会抛出java.util.ConcurrentModificationException异常
 */
public class Test {

	private static Scanner sc = new Scanner(System.in);// 实例化一个输入流对象

	public static void main(String[] args) {
		PetShop shop = new PetShop();
		Master master = new Master("明明");//实例化一个宠物主人,明明
		Pet pet = null;
		
		int circleNum = 0;// 表示while循环的次数
		int choiceNum = -1;// 操作数
		String petId = "";
		while(choiceNum == -1) {
			circleNum++;
			if(circleNum == 1) {
				System.out.println("**进购宠物**");
				new Pet();//初始化进购的宠物种类,为的是执行Pet.java里的静态代码块
			}
			System.out.println("选择操作:1、进购\t2、离开");
			choiceNum  = sc.nextInt();
			if(choiceNum == 1) {
				System.out.println("请输入要进购宠物的id和数量");
				pet = Pet.givePetToShop(sc.next(), sc.nextInt());
				if(pet != null) {
					shop.addPetToShop(pet);//商家进购此宠物
					System.out.println("进购成功!");
					choiceNum = -1;
				}else {//表示输入的id有误,没有此类宠物
					System.out.println("没有此类宠物!");
					choiceNum = -1;
				}
			}else if(choiceNum == 2) {
				choiceNum = -2;
			}else {
				System.out.println("输入有误!请重新选择!");
			}
		}
        circleNum = 0;
		master.goPetShop(shop);// 去宠物店
		while (shop.isHasCustom()) {
			circleNum++;
			if (circleNum == 1) {
				System.out.println(shop.getName() + ":欢迎" + master.getName() + "光临本店");
			} else {
				System.out.println(shop.getName() + ":请选择要进行的操作:1.浏览宠物\t2.离开本店");
				choiceNum = sc.nextInt();// 从键盘控制台接收一个整数
				if (choiceNum == 1) {
					master.scanPet(shop);// 明明浏览宠物
					System.out.println(shop.getName() + ":请输入编号来选择您想要的宠物:");
					petId = sc.next();
					pet = shop.getPetById(petId);// 通过id获得宠物
					if (pet == null) {
						System.out.println(shop.getName() + ":请输入正确的编号!");
					} else {
						System.out.println(shop.getName() + ":您选择了" + pet + ",是否确认购买?1.确认购买\t2.在考虑一下");
						choiceNum = sc.nextInt();
						if (choiceNum == 1) {
							master.buyPet(pet, shop);// 明明购买这个宠物
							System.out.println(shop.getName() + ":恭喜您获得新宠!");
						}
					}
				} else if (choiceNum == 2) {
					master.outShop(shop);// 离开商店
					System.out.println(shop.getName() + ":客官慢走,欢赢下次光临!");
					circleNum = 0;
				}
			}
		}
		System.out.println(master.getName()+ "离开了" + shop.getName() + "宠物店,正在回家的路上.......");
		String petName = null;
		while (true) {
			circleNum++;
			if (circleNum == 1) {
				System.out.println(master.getName() + "回到家了");
				System.out.println(master.getName() + ":给新买的宠物们起个名吧!嘻嘻!");
				for (Pet p : master.getMyPets()) {
					System.out.println("这只宠物是" + p.getStrain() + ",给他起个名字:");
					petName = sc.next();
					if (master.setNameToPet(pet, petName)) {// 给宠物起名字
						System.out.println(pet.getName() + ":有了新名字很开心!亲密值增加了" + pet.getLoveNum());
					}
				}
				System.out.println(master.getName() + ":所有的宠物都起好名字了,他们更喜欢我了!");
				System.out.println("请选择操作:1.陪宠物玩耍\t2.给宠物喂食\t3.获取所有的宠物信息\t4.退出:");
				choiceNum = sc.nextInt();
			}
			if (choiceNum > 4 || choiceNum < 1) {
				System.out.println("输入有误!");
			} else {
				while (choiceNum == 1) {
					System.out.println(master.getName() + ":和谁先玩呢?随便点名吧:");
					pet = master.getMyPetByName(sc.next());
					master.playWithPet(pet);
					System.out.println("请选择操作:1.陪宠物玩耍\t2.给宠物喂食\t3.获取所有的宠物信息\t4.退出:");
					choiceNum = sc.nextInt();
				}
				while (choiceNum == 2) {
					System.out.println(master.getName() + ":先喂给谁呢?随便点名吧!");
					pet = master.getMyPetByName(sc.next());
					master.feedPet(pet);
					System.out.println("请选择操作:1.陪宠物玩耍\t2.给宠物喂食\t3.获取所有的宠物信息\t4.退出:");
					choiceNum = sc.nextInt();
				}
				while (choiceNum == 3) {
					master.scanMyPets();
					System.out.println("请选择操作:1.陪宠物玩耍\t2.给宠物喂食\t3.获取所有的宠物信息\t4.退出:");
					choiceNum = sc.nextInt();
				}
				if (choiceNum == 4)
					break;
			}
		}
		System.out.println("程序已退出!");
	}
}


    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值