1.多态的概念
多态:在完成某个行为的时候,不同的对象去完成的时候会产生不同的结果。
举个现实生活的例子,同样是吃潮汕生腌,有的人吃完后没啥事,有的人吃完会严重腹泻。
总的来说:同一件事情,发生在不同的对象上,产生不同的结果。
2.重写
在介绍多态之前我们需要认识重写
重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定
于自己的行为。 也就是说子类能够根据需要实现父类的方法。
【方法重写的规则】
1.子类在重写父类的方法时,一般必须与父类方法原型一致: 返回值类型 方法名 (参数列表) 要完全一致
2.被重写的方法返回值类型可以不同,但是必须是具有父子关系的
3、访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类中重写该方法就不能声明为 protected
4.父类被static、private修饰的方法、构造方法都不能被重写。
5.重写的方法, 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验. 例如不小心将方法名字拼写错了 (比如写成 aet), 那么此时编译器就会发现父类中没有 aet 方法, 就会编译报错, 提示无法构成重写.
6.重写与重载的区别如下
3.多态的实现条件
1.必须在继承体系下
2.子类必须要对父类中的方法重写
3.通过父类的引用调用重写的方法
多态的体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法
public class TestAnimal
{
public static void eat(Animal a){
a.eat();
}
public static void main(String[] args) {
Cat cat=new Cat("阿花",2);
Dog dog=new Dog("阿财",5);
eat(cat);
eat(dog);
}
}
public class Cat extends Animal{
public Cat(String name,int age){
super(name,age);
}
public void eat(){
System.out.println(name+"吃小鱼干");
}
}
public class Dog extends Animal {
public Dog(String name,int age){
super(name,age);
}
public void eat(){
System.out.println(name+"吃小骨头");
}
}
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+"吃饭");
}
}
运行结果为
阿花在吃小鱼干
阿财在吃小骨头
当a在调用eat方法时,eat有不同的表现这种行为就被称为多态
4.向上转型与向下转型
向上转型的实质就是创建一个子类对象,将其当做父类对象使用
语法格式:父类类型 对象名=new 子类类型()
使用场景:
1.直接赋值
2.方法传参
3.方法返回
向上转型的优点:让代码的实现更加灵活,缺陷是不能调用子类特有的方法。
向下转型:将父类引用还原为子类对象
5.多态的优缺点
优点:
1.能有效降低代码的圈复杂度避免使用大量的if——else
2.可扩展能力强
缺陷:
代码的运行效率低