多态的概念
当父类的引用所指向的对象不同的时候,表现出的行为是不一样的!
满足多态的条件
1.继承
父类:
Dog子类:
Brid子类:
2.向上转型(发生多态的前提)
把子类对象给父类
向上转型三种方式;
1.
父类引用子类对象,此时父类animal这个引用指向了Dog这个对象.
这个方式把子类dog引用传递给func1这个函数并用父类animal形参引用接收,这个过程发生了向上转型,
在main方法中调用了func2函数并用父类animal引用接收其函数的返回值,这个过程发生了向上转型
前提:一定是在继承关系上才能向上转型!!
当发生向上转型后,父类的引用只能访问父类自己的成员,不能直接访问子类特有的成员!!!
如:
3.重写
子类重写父类的方法
父类的:
Dog子类重写父类的eat方法:
Bird子类重写父类的eat方法:
@Override:这个是重写的注解,表示这个方法被重写了,(可加可不加),加上注解可以让代码多一层校验
重写需要注意的:
1.重写的方法的 返回类型,方法名,参数 一致
2.重写的方法需是:非Static 非final 非private 修饰的方法
3,重写的方法的访问权限要大于等于父类方法的访问权限 :
private < 默认权限 < protected < public
最后执行 main方法:
此时站在我的funcTion方法中的形参animal角度来说是不知道将来要引用的是那个对象,但可以确定的是当父类引用不同对象的时候所表现的行为是不一样的!!!
最后输出的结果:
动态绑定(多态的基础):
把子类对象传给funcTion方法时用父类引用接收(向上转型),然后调用父类的eat方法,但是当我们看到运行结果的时候,发现调用的是子类重写父类的eat方法!!!
此时这里发生了动态绑定也就是说:在程序运行的过程中父类引用调用了子类重写父类的方法!!
一些边边角角的知识点:
重写与重载的区别:
向下转型(不安全)
把父类对象给子类
结果为:
在画红框的代码中发生了向下转型(强制类型转换成Dog类),并用dog引用接收
当代码发生下面变化:
当运行代码是会发现代码报错了:
这表示Dog类不能转换为Bird类型
观察上面代码发现animal引用已经引用了Dog类,而Dog类是不能转换成Bird类的
此时可以这样写:
为了提高向下转型的安全性可以使用 instanceof 关键字
这行代码可以理解为:animal 这个引用是不是引用了Bird这个类的对象,如果为ture将执行下面的代码,如果为false则不执行.