1、多态的概念
多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。
举个例子: 你的父母分别让你 和你姐姐/哥哥去跟亲戚聊天,你稍微有点内向,并不是很想一直聊下去,所以打一个招呼回屋了;而你的姐姐/哥哥很喜欢唠嗑,打招呼后一直和亲戚聊天。
总的来说:同一件事情,发生在不同对象身上,就会产生不同的结果。
1.1 多态实现条件
在java中要实现多态,必须要满足如下几个条件,缺一不可:
- 必须在继承体系下
- 子类必须要对父类中方法进行重写
- 通过父类的引用调用重写的方法
多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法。

不过要真正理解多态,还得熟悉 向上转型 方法重写
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引用的对象不一样,但是 调用的是同一个方法,此时表现出的现象不一样,此时这种思想,就叫做多态。
主要的讲完了,下面进行一些补充:
重写的注意事项:
- 不能是静态方法
- 被final修饰的方法不能重写
- 如果子类重写父类的方法 子类的权限要大于父类的权限
- 被private修饰的方法,是不能被重写的

- 构成父子类关系也是重写

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


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

----------------------------------------------------------------完--------------------------------------------------------------
1426

被折叠的 条评论
为什么被折叠?



