1.概念
通俗来讲,就是有多种形态,完成某个行为,当不同的对象去完成是产生不同的状态就称之为多态.打个比方来说,动物都要吃粮食,对于猫这个对象来说,猫吃的是猫粮,而对于狗这个对象来说,吃的就是狗粮.
2.多态实现的条件
1.必须是在继承的条件下
2.子类必须要对父类的方法进行重写
3.通过父类的引用调用(向上转型)重写的方法
一个小例子体会一下多态的实现:
//定义一个Animal父类
class Animal1 {
//定义两个成员变量
public String name;
public int age;
//Animal的构造方法
public Animal1(String name, int age) {
this.name = name;
this.age = age;
}
//定义 eat()成员方法
public void eat(){
System.out.println(name+"吃饭");
}
}
//定义一个继承Animal1的class dog
class Dog extends Animal1{
//定义构造方法并且帮助父类构造
public Dog(String name, int age) {
super(name, age);
}
//重写父类的方法
@Override
public void eat() {
System.out.println(name+"吃狗粮");
}
}
//定义一个继承Animal1的class cat
class Cat extends Animal1{
//定义构造方法并且帮助父类构造
public Cat(String name, int age) {
super(name, age);
}
//重写父类的方法
@Override
public void eat() {
System.out.println(name+"吃猫粮");
}
}
public class Animal{
//在此发生了向上转型,用父类的对象来接收,传的是子类的对象
public static void eat(Animal1 animal1){
animal1.eat();
}
public static void main(String[] args) {
//实例化两个对象
Cat cat=new Cat("小猫",10);
Dog dog=new Dog("小狗",12);
//调用eat()方法
eat(cat);
eat(dog);
}
}
到这里可能大家有很多疑问,为什么这就是多态呢??? 请大家看到多态的实现条件,如果还是不理解我给大家画个图理解一下:
多态的实现条件不仅要在继承条件,还要对父类的方法进行重写,现在我们就一起来看看重写.
3.重写
定义:是子类对父类非静态,非private修饰,非final修饰,非构造方法等的实现过程进行重新编写,返回值和参数都不能改变.简单来说就是外壳不变,核心重写.
重写的规则:
- 子类在重写父类的方法时,一般要于父类的方法原型一致:返回值类型,方法名,参数列表要完全一致.
- 被重写的方法返回值类型可以不同,但必须有父子关系.
- 访问权限不能比父类中被重写的方法的访问权限更低.
- 方法的重写可以使用注解来帮我们校验
前段时间我们还学习了方法的重载,大家私下可以去对比一下方法的重载与重写的区别
在重写这一块,我们还需要了解一下静态绑定和动态绑定.
静态绑定:也叫做早期绑定,在编译时,根据用户所传递类型就确定了具体调用了那个方法.典型代表方法重载.
动态绑定:也叫做后期绑定,在编译时,不能确定方法的行为,需要等到程序的运行时,才能确定具体调用那个类的方法.
多态的实现条件不仅要在继承条件,还要对父类的方法进行重写,然后还需要用父类的引用调用(向上转型)重写方法.
4.向上转型
定义:就是创建一个子类对象,将其当成父类对象来使用
语法格式:
发生向上转型的三种方式:
1.直接赋值:子类对象赋值给父类对象
2.方法传参: 形参作为父类的引用,可以接收任意子类的对象
3.作为返回值:返回任意子类对象
尽管用的很多向上转型,肯定是有一些优点的,但不免也会有缺陷.向上转型的优点是让代码实现更简单灵活.
缺陷是不能调用子类特有的方法.
5.多态的优缺点
优点:1 .类调用者对类的使用成本进一步降低。
2 .可扩展能力更强
缺点:代码的运行效率降低`
以上就是我对多态的理解,希望对大家有所帮助,如有错误希望大家帮忙指出.