问题描述:
狗生活在陆地上(是一种陆生动物),既是哺乳类的也是肉食性的。狗通常的时候和人打招呼会通过“摇摇尾巴”,在被抚摸感到舒服的时候,会“旺旺叫”,而在受到惊吓情绪烦躁时,会发出“呜呜”声;
猫也生活在陆地上(是一种陆生动物),既是哺乳类的也是肉食性的。猫通常的时候和人打招呼会发出“喵~”的声音,在被抚摸情绪很好时,会发出“咕噜咕噜”声,而在受到惊吓时,会发出“嘶嘶”声;
青蛙是一种两栖动物(既是水生动物也是陆生动物),既不是哺乳类的也不是肉食性的,属于卵生。当青蛙情绪好的时候,会在岸边“呱呱呱”的唱歌,而在受到惊吓时,会“扑通一声跳入水中”;
问题分析:
首先需要抽取问题描述中对象
分析每个对象所具有的特征
分析每个对象所发出的动作
从这些对象的特征中,抽取类的属性和方法
分析类之间的关系,画出类结构图
难点分析:
抽取对象的基本的方法:找出句子中所使用的名词
例如:在句子“小猫喵喵叫”中,我们能够确定一个对象:猫;
确定对象发出的行为动作的基本的方法:找出句子中的动词
例如:“旺旺叫”、“喵喵叫”都属于对象发出的动作;
确定对象的属性或者特征的基本的方法:找出句子中的形容词
例如:“哺乳性的”、“肉食性的”、“卵生的”等等;
“是”的关系一般抽象为继承
例如:狗是一种动物,意味着:“狗”类 继承自“动物”类;
“有”的关系一般抽象为类的属性
例如:动物都有情绪,意味着:“情绪”是“动物”类的一个属性;
类关系图:
阶段划分:
第一阶段(35分钟):不考虑情绪影响动物打招呼的方式
第二阶段(25分钟):考虑情绪影响动物打招呼的方式
第三阶段(40分钟):考虑陆生动物和水生动物
第一阶段:
不考虑情绪影响动物打招呼的方式
编写Animal类,没有mood属性,只有一种SayHello方法;
编写Dog类、Cat 类和 Frog 类,分别继承自Animal类,实现与Animal类不同的功能;
编写main方法,分别实例化以上三个类的三个对象,测试类方法实现的正确性;
package work03; //在work03包里,有包的可以在自己的工作栏修改包名,没有的可以直接删掉
import java.util.Scanner; //自动生成,不用打出来
/*java封装与继承-动物园
* @Zivid
* @2020.3.31
*/
abstract class Animal{//父类animal
protected boolean mammal = true;//判断是否为哺乳动物
protected boolean carnivorous = true;//判断是否为肉食动物
public boolean isMammal(){//是哺乳
return (mammal);
}
public boolean isCarniborous(){//是肉食
return (carnivorous);
}
abstract String sayHello();//打招呼
}
class Dog extends Animal{ //在父类animal下继承为子类dog
String name = "dog";
public String sayHello() {
return "摇摇尾巴";
}
}
class Cat extends Animal{//在父类animal下继承为子类cat
String name = "cat";
public String sayHello() {
return "喵喵叫";
}
}
class Frog extends Animal{//在父类animal下继承为子类frog
String name = "frog";
public String sayHello() {
return "呱呱呱";
}
}
public class MyZoo_1 {
public static void main(String[] args) {
Dog dog = new Dog();//实例化一个Dog的对象
Cat cat = new Cat();
Frog frog = new Frog();
System.out.println(" **************Welcom to MyZoo**************\n");
System.out.println("Please Enter 'dog/cat/frog' for run and 'exit' for out");
for(;;){ //循环进行
String name = new String();
@SuppressWarnings("resource") //SuppressWarnings可抑制下列sc的resource警告
Scanner sc = new Scanner(System.in);//输入一个name
name = sc.next();
if(true){ //输入成功时进入
//或者name != "dog"||name != "cat"||name == "frog"||name =="exit"
switch(name){
case "dog":
System.out.println("狗通常的时候和人打招呼:"+ dog.sayHello());
break;
case "cat":
System.out.println("猫通常的时候和人打招呼:"+ cat.sayHello());
break;
case "frog":
System.out.println("青蛙情绪好的时候会在岸边::"+ frog.sayHello());
break;
case "exit":
System.out.println("See You");
System.exit(0); //退出
default:
System.out.println("Error,Enter again!");
}
System.out.println("Please Enter Again,'dog/cat/frog' for run and 'exit' for out");
}
}
}
}
第二阶段:
考虑情绪影响动物打招呼的方式
扩充Animal类、Dog类、Cat类和Frog类,增加Animal类的mood属性,并实现 sayHello 方法的多态性
扩充main方法;
第三阶段:
考虑陆生动物和水生动物
定义LandAnimal接口和WaterAnimal接口;
扩充Dog类、Cat类和Frog类,使其实现相应的接口;
扩充main方法;
运行效果:
总结:
通过本次项目案例练习了面向对象的Java实现,基本囊括了面向对象的三大特征:封装、继承、多态
巩固的知识点:
Java基本的程序结构;
类和对象、构造方法。this关键字;
类的封装,包括修饰符的使用:private/public/ protected
特殊修饰符:static、 final、abstract
类的继承(extends、super关键字);
接口的定义和实现(interface、implements关键字);
多态:方法重载和方法重写