动物乐园项目
1、覆盖技能点:
面向对象特性:封装、继承、多态
抽象类和接口的概念、语法、用处
手动抛出异常和捕获异常
2、需求说明
(1)系统概述:
以面向对象思想设计动物乐园
动物乐园包括的成员:猫、鸭子。属性:名称、腿;方法:叫
(2)开发思路。
第一,先设计猫和鸭类结构。
Animal父类:主要包含名称,腿两个属性,以及叫方法。
Cat和Duck子类:继承父类,重写方法。
测试类:Cat和Duck对象,并输出动物信息(名字,腿数,叫声)
第二,增加新成员海豚,鉴于其没有腿这一属性,重新设计类结构。
即将父类中的腿属性拿出,单独作为一个接口,在Cat和Duck子类中予以实现。
第三,实现修改数据功能。
使用户可以修改三种动物的信息,如果腿的条数不符合客观则手动抛出异常。
3、实现效果
界面如下:
演示效果如下:
4、最终代码如下
(1)父类和接口
Animal父类:
/**
* 这是动物乐园项目。
* 这是父类。
*/
package com.xtjy.nj.zoo.entity;
public abstract class Animal {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Animal() {
}
public Animal(String name) {
super();
this.name = name;
}
public abstract String shout();
@Override
public String toString() {
return "Animal [name=" + name + "]";
}
}
Leg接口:
/**
* 这是接口:是否是陆地上的动物,猫和鸭子实现该接口。
*/
package com.xtjy.nj.zoo.service;
public interface Territal {
int legNum();
int getLegNum();
}
(2)继承父类和实现接口
Cat子类:
package com.xtjy.nj.zoo.entity;
import com.xtjy.nj.zoo.service.Territal;
public class Cat extends Animal implements Territal{
private int legNum;
public int getLegNum() {
return legNum;
}
public void setLegNum(int legNum) {
this.legNum = legNum;
}
public String shout(){
return "喵喵";
}
public Cat() {
super();
// TODO Auto-generated constructor stub
}
public Cat(String name,int legNum) {
super(name);
this.legNum = legNum;
}
// public String toString(){
// return super.toString();
// }
@Override
public int legNum() {
// TODO Auto-generated method stub
return this.legNum;
}
}
Duck子类:
package com.xtjy.nj.zoo.entity;
import com.xtjy.nj.zoo.service.Territal;
public class Duck extends Animal implements Territal{
private int legNum;
public int getLegNum() {
return legNum;
}
public void setLegNum(int legNum) {
this.legNum = legNum;
}
@Override
public String shout() {
return "嘎嘎";
}
public Duck() {
super();
// TODO Auto-generated constructor stub
}
public Duck(String name,int legNum) {
super(name);
this.legNum = legNum;
// TODO Auto-generated constructor stub
}
@Override
public int legNum() {
return this.legNum;
}
}
Dolphine子类:
package com.xtjy.nj.zoo.entity;
public class Dolphine extends Animal {
@Override
public String shout() {
return "海豚音";
}
public Dolphine() {
super();
// TODO Auto-generated constructor stub
}
public Dolphine(String name) {
super(name);
// TODO Auto-generated constructor stub
}
}
(3)自定义异常
package com.xtjy.nj.zoo.utils;
public class ExceptionJudge extends Exception{
public ExceptionJudge(String message) {
super(message);
}
}
(4)使用组合
package com.xtjy.nj.zoo.controller;
import java.util.Scanner;
import com.xtjy.nj.zoo.entity.Animal;
import com.xtjy.nj.zoo.entity.Cat;
import com.xtjy.nj.zoo.entity.Dolphine;
import com.xtjy.nj.zoo.entity.Duck;
import com.xtjy.nj.zoo.service.Territal;
import com.xtjy.nj.zoo.utils.ExceptionJudge;
public class ZooManager {
Animal[] animals = new Animal[3];
//首先,初始化动物的信息
public void initial(){
Cat cat = new Cat("加菲猫",4);
Duck duck = new Duck("唐小鸭",2);
Dolphine dolp = new Dolphine("奇奇");
animals[0] = cat;
animals[1] = duck;
animals[2] = dolp;
}
/**
* 需求一:显示所有动物的信息
*/
public void showAnimals(){
System.out.println("动物名字\t动物的腿数\t动物的叫声");
for(Animal a:animals){
String name = a.getName();
int legNum = 0;
if(a instanceof Territal){
legNum = ((Territal) a).getLegNum();
}
String shout = a.shout();
String leg = (legNum==0)?"":(legNum+"");
System.out.println(name+"\t"+leg+"\t"+shout);
}
}
/**
* 需求二:修改动物的信息
*/
int choose;
Scanner sc = new Scanner(System.in);
public void remind(){
System.out.println("是否要修改动物的信息?输入0进入,其他退出。");
choose = sc.nextInt();
}
public void modifyAnimal() throws ExceptionJudge{
//记录用户输入的新动物的名字
String[] names = new String[3];
//记录用户输入的新动物的腿数
int[] nums = new int[3];
System.out.println("请输入猫咪的名称:");
names[0] = sc.next();
System.out.println("请输入小猫的腿数:");
nums[0] = sc.nextInt();
if(nums[0]!=4){
String message = "猫的腿数只能为4。";
throw new ExceptionJudge(message);
}
System.out.println("请输入鸭子的名称:");
names[1] = sc.next();
System.out.println("请输入鸭子的腿数:");
nums[1] = sc.nextInt();
if(nums[1]!=2){
String message = "鸭子的腿数只能为2。";
throw new ExceptionJudge(message);
}
System.out.println("请输入海豚的名称:");
names[2] = sc.next();
animals[0] = new Cat(names[0],nums[0]);
animals[1] = new Cat(names[1],nums[1]);
animals[2] = new Dolphine(names[2]);
}
}
(5)测试*
/**
* 测试ZooManger
* 效果:显示动物信息并询问是否修改——→输入0,表示进入修改——→进入修改,则获取用户的输入并更新动物信息;期间,做用户输入信息判断——→显示动物信息并询问是否修改,如此往复
* ——→输入0以外的其他任何数字,表示退出修改。
*/
package com.xtjy.nj.zoo.controller;
import com.xtjy.nj.zoo.utils.ExceptionJudge;
public class TestManager {
public static void main(String[] args) {
ZooManager zm = new ZooManager();
zm.initial();
boolean isExit;
do{
isExit = false;
zm.showAnimals();
zm.remind();
if(zm.choose!=0){
isExit=true;
}else{
try {
zm.modifyAnimal();
} catch (ExceptionJudge e) {
e.getMessage();
e.printStackTrace();
}
}
}while(!isExit);
System.out.println("退出程序。");
}
}