实验报告
一. 实验名称
继承与多态
二. 实验目的及要求
1) 设计类之间的继承关系
2) 在子类重写从父类继承的方法
3) 理解什么是多态
4) 掌握继承的设计技巧
三. 实验环境
IntelliJ IDEA Community Edition 2019.2.2
四. 实验内容
对某动物园的动物进行面向对象建模,需要利用面向对象中的继承和多态来设计
类。 动物园包括的动物、动物类型以及他们的继承关系主要如下图所示:
(注意:这是一个简化的动物分类方法,详细的动物分类请使用维基百科搜索动物分类学)
图 4.1 动物类的继承关系
五. 实验过程及实验结果
1)创建一个动物(Animal)类
①给 animal 定义 name(姓名),age(年龄),gender(性别)三个属性;
②实现 equals 方法判断两个动物的 name、age 以及 gender 是否相同,并通过
hashCode 方法验证(当 equals 返回 true 时,则它们对应的 hashCode 必定相等);
③添加 getName、getAge、getGender 方法方便其他类的调用;
④添加三个抽象类方法,eat、drink 和 sleep;
代码如下:
import java.util.Objects;
public abstract class Animal {
private String name;
private int age;
public static final int FEMALE = 1;
public static final int MALE = 0;
public int gender; //性别
public Animal(String n, int a, int g) {
name = n;
age = a;
this.gender = g;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Animal)) return false;
Animal animal = (Animal) o;
return getAge () == animal.getAge () &&
getGender () == animal.getGender () &&
Objects.equals (getName (), animal.getName ());
}
@Override
public int hashCode() {
return Objects.hash (getName (), getAge (), getGender ());
}
public String getName() {
return name;
}
public int getAge(){
return age;
}
public static int getFEMALE() {
return FEMALE;
}
public static int getMALE() {
return MALE;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
public abstract void eat();
public abstract void drink();
public abstract void sleep();
}
2)创建一个哺乳动物(Mammalia)类,继承动物(Animal)类
①添加 toString 方法,返回哺乳动物的 name、age 以及 gender;
②哺乳动物都会分泌乳汁(lactate),添加新的方法 lactate;
③哺乳动物可以进行胎生(vivipation),添加新的方法 vivipation;
代码如下:
public abstract class Mammalia extends Animal { //哺乳动物
//如果父类Animal的构造函数进行了修改,这里也需要进行修改
public Mammalia(String n,int a,int g) {
super(n,a,g);
this.gender = g;
}
@Override
public String toString() {
if(gender == 1)
return "动物的名字是"+getName ()+",年龄" + getAge () +"岁"+
",性别是雌";
else
return "动物的名字是"+getName ()+",年龄" + getAge () +"岁"+
",性别是雄";
}
public void lactate() { //哺乳
if(gender==1) {
System.out.println (super.getName () + "正在分泌乳汁");
} else
System.out.println (super.getName () + "不分泌乳汁");
}
public void vivipation(){
//胎生
if(gender==1)
System.out.println (super.getName () + "可以胎生");
else
System.out.println (super.getName () + "不可以胎生");
}
}
3)创建一个爬行动物(Reptilia)类,继承动物(Animal)类
①添加 toString 方法,返回爬行动物的 name、age 以及 gender;
②爬行动物都用肺呼吸,添加新的方法(breath);
③爬行动物都是变温动物,添加新的方法(temperature);
代码如下:
public abstract class Reptilia extends Animal{
//爬行动物
public Reptilia(String n,int a,int g) {
super(n,a,g);
this.gender = g;
}
@Override
public String toString() {
if(gender == 1)
return "动物的名字是"+getName ()+",年龄" + getAge () +"岁"+
",性别是雌";
else
return "动物的名字是"+getName ()+",年龄" + getAge () +"岁"+
",性别是雄";
}
public void breath() { //哺乳
System.out.println (super.getName () + "用肺呼吸");
}
public void temperature() {
System.out.println (super.getName () + "是变温动物");
}
}
4)创建一个鸟类(Bird)类,继承动物(Animal)类
①添加 toString 方法,返回鸟类的 name、age 以及 gender;
②鸟类都有羽毛,添加新的方法(yumao);
③鸟类靠取食靠喙,添加新的方法(qushi);
代码如下:
public abstract class Bird extends Animal{
//鸟类
public Bird(String n,int a,int g) {
super(n,a,g);
this.gender = g;
}
@Override
public String toString() {
if(gender == 1)
return "动物的名字是"+getName ()+",年龄" + getAge () +"岁"+
",性别是雌";
else
return "动物的名字是"+getName ()+",年龄" + getAge () +"岁"+
",性别是雄";
}
public void yumao() {
//羽毛
System.out.println (super.getName () + "有羽毛");
}
public void qushi() {
//取食
System.out.println (super.getName () + "取食靠喙");
}
}
5)创建老虎(Tiger)类,继承哺乳动物(Mammalia)类
①覆盖 animal 的抽象方法(eat、drink、sleep);
②添加新的方法力量(strength)和是否成年(grow);
代码如下:
public class Tiger extends Mammalia {
//老虎
public Tiger(String n,int a,int g) {
super(n,a,g);
this.gender = g;
}
@Override
public void eat() {
System.out.println(super.getName () + "正在吃肉");
}
@Override
public void drink() {
System.out.println(super.getName() + "正在大口喝水");
}
@Override
public void sleep() {
System.out.println(super.getName() + "正在贪睡");
}
public void strength(){
if(gender==0)
System.out.println (super.getName () + "力量较大");
else
System.out.println (super.getName () + "力量较小");
}
public void grow(){
if(getAge ()>=3)
System.out.println (super.getName () + "已经成年");
else
System.out.println (super.getName () + "未成年");
}
}
6)创建熊猫(Panda)类,继承哺乳动物(Mammalia)类
①覆盖 animal 的抽象方法(eat、drink、sleep);
代码如下:
public class Panda extends Mammalia{
//熊猫
public Panda(String n,int a,int g) {
super(n,a,g);
this.gender = g;
}
@Override
public void eat() {
System.out.println(super.getName () + "正在吃竹子");
}
@Override
public void drink() {
System.out.println(super.getName() + "正在喝水");
}
@Override
public void sleep() {
System.out.println(super.getName() + "正在眯着黑眼圈睡觉");
}
}
7)创建河马(Hippopotamus)类,继承哺乳动物(Mammalia)类
①覆盖 animal 的抽象方法(eat、drink、sleep);
②实现接口游泳(swimmable)的具体方法;
代码如下:
public class Hippopotamus extends Mammalia implements Swimmable{ //河马
public Hippopotamus(String n,int a,int g) {
super(n,a,g);
this.gender = g;
}
@Override
public void eat() {
System.out.println(super.getName () + "正在吃水生草类");
}
@Override
public void drink() {
System.out.println(super.getName() + "正在吃水");
}
@Override
public void sleep() {
System.out.println(super.getName() + "正在浅水睡觉");
}
public void swimmable(){
System.out.println ("河马游泳");
}