多态,抽象,接口, 解释以及案例

多态

:

1 概念:一种行为的多种实现方式,就是多态;
(一个对象的多种形态)
2 代码形式:父类类型变量保存了子类类型对象;就是多态的形态;
3 特点::不能使用子类特有的内容;
4 好处:可以让我们面向父类,操作所有的子类共性的内容;
提升了程序的扩展性;

抽象:

1 抽象方法:没有方法体的方法就是抽象方法;
2 抽象类:包含抽象方法的类一定是抽象类;
3 代码格式:抽象类格式:
public abstract class 类名{}
抽象方法格式:
public abstract 返回值类型 方法名(参数列表);
4 特点

1 抽象类不能直接创建对象;(语法规定)

2 抽象类中,可以有构造方法;(构造方法的作用,仅仅是给子类调用,或给本类的成员变量赋值)

3 如果一个子类,继承抽象类的时候,不能重写所有的抽象方法,那么这个子类也必须是抽象类;

(此时,子类必须还要继续有子类,才可以创建对象)

4 抽象类中可以不写抽象方法;(即使没有写抽象方法,也是无法直接创建抽象类的对象的!);

接口:

1 概念 就是一套规范;
2 格式 interface 接口名{
成员;
}
3 成员

1 JDK7及以前的版本时,接口中仅有两部分成员:分别是:抽象方法,常量;
常量的格式: public static final 数据类型 常量名 = 数据值;
2 JDK8,9之后的版本成员以后再说;

4 特点
接口无法直接创建对象;

2:接口中没有构造方法;

3:接口与接口之间允许多继承;

4:接口与类之间,只能是类实现接口;

5 :类与接口的关系:
只能是类实现接口,使用implements关键字表示;

6:抽象类与接口的对比
相同点:
1:都不能直接创建对象;
2:都可以包含抽象方法;
3:都是父亲的角色;(都是位于继承体系的顶端)

不同点:
1抽象类属于类的范畴,只能是单继承;而接口可以多实现;
2:抽象类包含构造方法,而接口的成员都是固定的形式(修饰符省略了,java会自动添加上去);

结论:
如果使用抽象类和接口都可以满足需求,优先考虑使用接口;

案例

分析以下需求,并用代码实现
(1)动物类:
a.属性:年龄
b.行为:喝水,吃东西(吃什么不确定)
(2)游泳接口:
a.行为:游泳方法
(3)狗类:
a.行为:吃饭(啃骨头)和 游泳(狗刨)
(4)羊类:
a.行为:吃饭(羊啃草)
(5)青蛙类:
a.行为:吃饭(吃虫子)和 游泳(蛙泳)
(6)饲养员类:
a.行为:饲养动物:包括吃饭和喝水
(7)测试类:
a.创建饲养员对象,饲养员调用三次饲养方法:饲养狗,饲养羊,饲养青蛙
(8)要求:
a.子类重写父类中的吃东西方法
b.要求给狗和青蛙添加游泳的方法(实现游泳接口)
c.饲养员类中定义一个方法,传入动物类对象(父类),使用instanceof转换成子类,
调用吃饭方法,如果有游泳方法也需进行测试
(9)打印如下格式的结果:
a.狗喝水
b.狗啃骨头
c.狗会狗刨游泳
d.青蛙喝水
e.青蛙吃小虫
f.青蛙会蛙泳
g.羊喝水
h.羊啃草

    一共要建八个界面,有点多哈哈哈哈

游泳接口

public interface youyong {
    void yyong();
}

动物类(父类)

public abstract class Animal {
    public int age;



    public abstract void drink();
    public abstract void eat();

}

狗类(子类)

public class dog  extends Animal implements youyong {
    @Override
    public void eat() {
        System.out.println("狗啃骨头");
    }


    @Override
    public void yyong() {
        System.out.println("狗会狗刨");
    }
    public void drink(){
        System.out.println("狗会喝水");
    }


}

羊类(子类)

public class goat extends Animal {
    @Override
    public void eat() {
        System.out.println("羊吃草");
    }

    @Override
    public void drink() {
        System.out.println("羊喝水");
    }
}

青蛙类(子类)

public class qingwa extends Animal implements youyong {
    @Override
    public void eat() {
        System.out.println("吃虫子");
    }

    @Override
    public void yyong() {
        System.out.println("蛙泳");
    }

    @Override
    public void drink() {
        System.out.println("青蛙会喝水");
    }
}

工人类(子类)

public class worker {
    public void siyang(Animal aml){
        aml.eat();
        aml.drink();
        if (aml instanceof dog){
            ((dog) aml).yyong();
        }
        if (aml instanceof qingwa){
            ((qingwa) aml).yyong();
        }
    }
}

测试类

public class demo {
    public static void main(String[] args) {
        worker wk = new worker();
        wk.siyang(new dog());
        wk.siyang(new goat());
        wk.siyang(new qingwa());

    }
}

打印结果
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值