多态....

1、多态的概念

多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态

举个例子: 你的父母分别让你 和你姐姐/哥哥去跟亲戚聊天,你稍微有点内向,并不是很想一直聊下去,所以打一个招呼回屋了;而你的姐姐/哥哥很喜欢唠嗑,打招呼后一直和亲戚聊天。

总的来说:同一件事情,发生在不同对象身上,就会产生不同的结果

 1.1 多态实现条件

在java中要实现多态,必须要满足如下几个条件,缺一不可:

  1. 必须在继承体系下
  2. 子类必须要对父类中方法进行重写
  3. 通过父类的引用调用重写的方法

多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法

不过要真正理解多态,还得熟悉 向上转型 方法重写

1.2向上转型

向上转型:实际就是创建一个子类对象,将其当成父类对象来使用。

语法格式:父类类型 对象名 = new 子类类型()

Animal animal =new Dog("旺财",3);
Animal animal =new Cat("月饼",2);

Animal是父类类型,但可以引用一个子类对象,因为是从小范围向大范围的转换。

有几种方法实现向上转型?

答:3种

一.直接赋值(就是上面的写法)

二.方法的传参

    public static void fun(Animal animal){

    }
    Cat cat=new Cat("月饼",2);
    fun(cat);

三.返回值

    public static Animal fun1(){
        Dog dog=new Dog("旺财",3);
        return dog;
    }
    Animal animal= fun1();

有什么需要注意的?

通过父类的引用 调用子类特有的方法无法直接调用,只能调用父类自己的,这是向上转型的缺点

1.3重写

什么是方法重写?

重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程 进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定 于自己的行为。 也就是说子类能够根据需要实现父类的方法。

通俗说就是 方法名字一样 参数列表一样 返回值一样

public class Animal {
    String name;
    int age;
    public Animal(String name, int age){
        this.name = name;
        this.age = age;
    }
    public void eat(){
        System.out.println(name + "吃饭");
    }
} 
public class Cat extends Animal{
        public Cat(String name, int age){
            super(name, age);
        }
        @Override
        public void eat(){
            System.out.println(name+"吃鱼~~~");
        }
    }

运行结果:
        月饼吃鱼~~~

为什么通过父类引用 调用的是子类的? ? ?

这要说到动态绑定静态绑定

1.4动态绑定

动态绑定:也称为后期绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体 调用那个类的方法。

程序在编译时 确实调用的是父类eat方法,当运行代码的时候,通过父类引用,调用了父类和子类重写的那个方法,最后实际调用子类的方法,此时 我们把这个情况叫做 动态绑定!

大前提:一定要在继承情况下! ! !

怎么判断方法被重写?

现在我们用动态绑定的例子理解多态

animal引用的对象不一样,但是 调用的是同一个方法,此时表现出的现象不一样,此时这种思想,就叫做多态。

主要的讲完了,下面进行一些补充:

重写的注意事项:

  1. 不能是静态方法
  2. 被final修饰的方法不能重写
  3. 如果子类重写父类的方法 子类的权限要大于父类的权限
  4. 被private修饰的方法,是不能被重写的
  5. 构成父子类关系也是重写

向下转型:

将一个子类对象经过向上转型之后当成父类方法使用,再无法调用子类的方法,但有时候可能需要调用子类特有的 方法,此时:将父类引用再还原为子类对象即可,即向下转换。

但不是所有都能成功

狗狗不会飞........

如果在父类的构造方法当中 调用子类和父类重写的方法,此时会发生动态绑定

----------------------------------------------------------------完--------------------------------------------------------------

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值