Java三大特性 —— 3、多态性

本文介绍了面向对象编程中的多态性,多态是指同一个方法在不同子类中表现出不同行为的能力,增强了代码的扩展性。通过实例展示了如何使用多态性,如创建Animal类和其子类Cat、Dog、Pig,通过父类引用调用重写的方法实现不同的效果。多态遵循开闭原则,提高了代码的灵活性,使得程序能更好地适应变化。
摘要由CSDN通过智能技术生成

多态跟属性无关,多态指的是方法的多态,而不是属性的多态。

总结:

1、先有父类,再有子类:--> 继承  

     先有子类,再抽取父类 ----> 泛化 

2、什么是多态:

多态就是多种状态:同一个行为,不同的子类表现出来不同的形态。

多态指的就是同一个方法调用,然后由于对象不同会产生不同的行为。 

3、多态的好处:

为了提高代码的扩展性,符合面向对象的设计原则:开闭原则。

开闭原则:指的就是扩展是 开放的,修改是关闭的。

注意:多态可以提高扩展性,但是扩展性没有达到最好,以后我们会学习 反射

4、多态的要素:

1)   继承:   Cat extends Animal  ,Pig extends Animal,   Dog extends Animal

2)重写:子类对父类的方法shout()重写

3)父类引用 指向子类对象:

Pig p = new Pig();

Animal an = p;

将上面的代码合为一句话:

Animal an = new Pig();

=左侧:编译期的类型

=右侧:运行期的类型

Animal an = new Pig();

g.play(an); 

  1. public void play(Animal an){//Animal an = an = new Pig();
  2.         an.shout();
  3.     }

        上面的代码,也是多态的一种非常常见的应用场合:父类当方法的形参,然后传入的是具体的子类的对象,然后调用同一个方法,根据传入的子类的不同展现出来的效果也不同,构成了多态。

代码示例:

package Package8_face_the_object.test_3_Polymorphism.test_test;
//把所有的类集结到一个程序中

 class Girl {
    //和猫玩
    public void play(Cat cat){
        cat.shout();
    }
    //和狗玩
    //上面play()方法的重载
    public void play(Dog dog){
        dog.shout();
    }

    //和小动物玩
    public void play(Animal an){
        an.shout();
    }
}

//父类:动物Animal
 class Animal {
    //shout()方法
    public void shout(){
        System.out.println("小动物可以喊叫哦!!!");
    }
}

class Cat extends Animal{
    //喊叫
    public void shout(){
        System.out.println("小猫喵喵喵!!!");
    }
    public void guard(){
        System.out.println("狗狗保护主人!!!");
    }
}

 class Dog extends Animal{
    //喊叫
    public void shout(){
        System.out.println("小狗汪汪汪!!!");
    }
}

 class Pig extends Animal{
    public void shout(){
        System.out.println("小猪哼哼哼!!!");
    }
}

public class Together {
    public static void main(String[] args) {
       /* //具体的猫 ——> 猫的对象
        Cat c = new Cat();
        //具体的小女孩 ——> 女孩的对象
        Girl g = new Girl();
        //具体的狗 ——> 狗的对象
        Dog d = new Dog();

        //小女孩跟猫玩耍
        g.play(c);
        //小女孩跟猫狗耍
        g.play(d);*/

        //向上抽取出一个父类Animal后,

        //具体的动物——>动物的对象
        //Animal an = new Animal();  //还是没有体现出具体的对象,因为世界上没有哪一个小动物叫小动物

        //下面我们让这个具体的小动物是——猫
        Girl g = new Girl();

        //Cat c = new Cat();
        Dog d = new Dog();
        //Animal an = c;
        Animal an = d;   //这样一来,代码的扩展性就会很好(再如下)
        //而且,Girl类中也只需要和小动物玩的函数即可,并且不需要更改
        Pig p = new Pig();
        Animal an2 = p;

        //跟小动物玩
        g.play(an);
        g.play(an2);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值