JAVA 面向对象 | 继承与多态 简单理解和实例

此博客介绍了如何使用面向对象编程实现不同动物的模拟,包括Cat、Dog、Cow和Goat类,每个类有自己的叫声方法。通过抽象类Animal统一了部分代码,实现了多态。此外,还设计了一个接口CatchMouse,让Cat和Dog类具备捕捉老鼠的能力。
摘要由CSDN通过智能技术生成

程序需求

1.编写一个 Cat 类,实现 1 个 shout()方法,该方法可以输出小猫的叫声“喵”

2.修改以上程序,为 Cat 类声明一个字段 name 和一个有参的构造函数,以便在实例化对象时,可以设置对象的名字;并使 shout()方法可以根据 name 的值输出对象的名字,如“我的名字叫…,喵”,同时实现默认构造函数。

3.修改以上程序, 自行设计一个有参构造函数并调用。

class Cat {
    private final String name;

    public Cat(String name) {
        this.name = name;
        cnt++;
    }

    public void shout() {
        System.out.println("My name is" + name + " Meow Meow Meow");
    }

}

4.修改以上程序,利用私有字段和 get/set 方法实现能够控制猫的叫声的功能,让它叫几声,它就叫几声,并且能够输出叫声,但是最多叫 10 声。

5.修改以上程序,设计一个静态变量和静态方法统计并显示生成的实例个数。

class Cat {
    static int cnt=0;
    private int n;
    private final String name;

    public Cat(String name) {
        this.name = name;
        cnt++;
    }
    public void shout() {//猫叫方法
        System.out.println("My name is" + name);
        for (int i = 0; i < Math.min(n,10); i++) {

            System.out.print("Meow ");
        }
    }

    public void setN(int n) {//设置猫的叫声数量
        this.n = n;
    }

    public int getCnt() {//返回实例个数
        return cnt;
    }
}

6.在上一堂课实现的程序基础上,仿照 Cat 类增加一个 Dog 类,也有 shout()方法,能够输出“我的名字叫…. 汪!汪!”等功能。

class Dog {
    static int cnt=0;
    private int n;
    private final String name;

    public Dog(String name) {
        this.name = name;
        cnt++;
    }

    public void shout() {//狗叫方法
        System.out.println("My name is" + name);
        for (int i = 0; i < Math.min(n,10); i++) {

            System.out.print("Woof ");
        }
    }

    public void setN(int n) {//设置狗的叫声数量
        this.n = n;
    }

    public int getCnt() {//返回实例个数
        return cnt;
    }
}

7.分析 Cat 和 Dog 类的程序,可以发现它们有非常相似的代码。请建立一个父类 Animal 类,把Cat 和 Dog 相同的代码尽量放到 Animal 类中。

8.分析以上程序,可以发现 Cat 和 Dog 类都有 shout()方法,只是叫的声音不同。请修改上述程序,为 Animal 类建立一个 shout()方法,然后让 Cat 和 Dog 去重写这个 shout()方法,实现多态。

9.在以上程序的基础上,增加牛和羊两种动物,而且都要叫出自己的声音。

class Animal {
    static int cnt = 0;
    public int n;
    public final String name;

    public Animal(String name) {
        this.name = name;
        cnt++;
    }
    public void shout(){
        
    }

    public void setN(int n) {//设置狗的叫声数量
        this.n = n;
    }

    public int getCnt() {//返回实例个数
        return cnt;
    }
}

class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }

    public void shout() {
        System.out.println("My name is" + name);
        for (int i = 0; i < Math.min(n, 10); i++) {

            System.out.print("Meow ");
        }
    }
}

class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }

    public void shout() {
        System.out.println("My name is" + name);
        for (int i = 0; i < Math.min(n, 10); i++) {

            System.out.print("Woof ");
        }
    }
}

class Cow extends Animal {
    public Cow(String name) {
        super(name);
    }

    public void shout() {
        System.out.println("My name is" + name);
        for (int i = 0; i < Math.min(n, 10); i++) {

            System.out.print("Mou ");
        }
    }
}

class Goat extends Animal {
    public Goat(String name) {
        super(name);
    }

    public void shout() {
        System.out.println("My name is" + name);
        for (int i = 0; i < Math.min(n, 10); i++) {

            System.out.print("Mie");
        }
    }
}

10.分析以上程序,可以发现四种动物的 shout()方法中,除了动物叫的声音不同外,几乎是相同的。请把该方法在 Animal 类中实现,但是由于各种动物的叫声不同,需要增加一个方法 getSound(),在子类中获得各种动物的叫声。经过重构,所有的重复都放到父类中,子类变得非常简洁,而且容易修改。

11.由于 Animal 类根本不可能实例化也不需要实例化,所以可以把实例化没有任何意义的父类改成抽象类。请在以上程序的基础上,将 Animal 类改为抽象类,同时 getSound()也应改为抽象方法。

abstract class Animal {
    static int cnt = 0;
    public int n;
    public final String name;
    public String Sound;

    public Animal(String name) {
        this.name = name;
        cnt++;
    }
     public void shout(){
        for (int i = 0; i < Math.min(n, 10); i++) {

            System.out.print(Sound+' ');
        }
    }
    abstract public void getSound();

    public void setN(int n) {//设置动物的叫声数量
        this.n = n;
    }
    public int getCnt() {//返回实例个数
        return cnt;
    }
}

class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }
    public void getSound(){
        Sound="Meow";
    }

}

class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }
    public void getSound(){
        Sound="Woof";
    }

}

class Cow extends Animal {
    public Cow(String name) {
        super(name);
    }
    public void getSound(){
        Sound="Mou";
    }

}

class Goat extends Animal {
    public Goat(String name) {
        super(name);
    }
    public void getSound(){
        Sound="Mie";
    }
}

11.在四种动物中,Cat 和 Dog 能捉老鼠,请将这个功能设计成接口,并分别由 Cat 和 Dog 两种动物继承实现。

interface CatchMouse{
    public void Catch();
}

abstract class Animal{
    static int cnt = 0;
    public int n;
    public final String name;
    public String Sound;

    public Animal(String name) {
        this.name = name;
        cnt++;
    }
     public void shout(){
        for (int i = 0; i < Math.min(n, 10); i++) {

            System.out.print(Sound+' ');
        }
    }
    abstract public void getSound();

    public void setN(int n) {//设置狗的叫声数量
        this.n = n;
    }
    public int getCnt() {//返回实例个数
        return cnt;
    }
}

class Cat extends Animal implements CatchMouse{
    public Cat(String name) {
        super(name);
    }
    public void getSound(){
        Sound="Meow";
    }
    public void Catch(){
        System.out.println(name+"as a cat caught a mouse");
    }

}

class Dog extends Animal implements CatchMouse{
    public Dog(String name) {
        super(name);
    }
    public void getSound(){
        Sound="Woof";
    }
    public void Catch(){
        System.out.println(name+"as a dog caught a mouse");
    }

}

class Cow extends Animal {
    public Cow(String name) {
        super(name);
    }
    public void getSound(){
        Sound="Mou";
    }
}

class Goat extends Animal {
    public Goat(String name) {
        super(name);
    }
    public void getSound(){
        Sound="Mie";
    }
}


UML类图

image-20210906204507440

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值