目录
多态的概念
通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。
多态的实现条件
1. 必须在继承体系下
2. 子类必须要对父类中方法进行重写
3. 通过父类的引用调用重写的方法
多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法。
重写
什么是方法重写
1.函数名相同
2.形参列表相同(类型,个数)
3.返回值相同
重写的注意事项
1.被final修饰的方法叫做密封方法,代表当前方法是不能够i被重写的
2.被static修饰的方法是不可以被重写的
3.被private修饰的方法,也是不可以被重写的
4.子类的访问修饰权限要大于等于父类的访问修饰权限
方法重写来实现多态的例子
class Animal{
public String name;
public void eat(){
System.out.println("Animal::eat");
}
}
class Dog extends Animal{
public void eat(){
System.out.println("Dog::eat");
}
}
class Bird extends Animal{
public void eat(){
System.out.println("Bird::eat");
}
public void fly(){
System.out.println("Bird::fly");
}
}
public class TestDemo {
public static void main(String[] args) {
Animal animal1 = new Bird();
animal1.eat();
Bird bird = (Bird)animal1;
bird.fly();
}
public static void func(Animal animal){
animal.eat();
}
}
向上转型
什么是向上转型
实际就是创建一个子类对象,将其当成父类对象来使用。
其语法格式如下:
Animal animal = new Cat("元宝",2);
animal是父类类型,但可以引用一个子类对象,因为:子类对象是一个父类对象,即可以将一个子类对象当成父类对象来应用。
因此:向上转型是安全的,因为是从小范围向大范围的转换。
向上转型发生的时机
1.直接赋值
2.函数传参
3.函数的返回值
public class TestAnimal {
// 2. 方法传参:形参为父类型引用,可以接收任意子类的对象
public static void eatFood(Animal a){
a.eat();
}
// 3. 作返回值:返回任意子类对象
public static Animal buyAnimal(String var){
if("狗" == var){
return new Dog("狗狗",1);
}else if("猫" == var){
return new Cat("猫猫", 1);
}else{
return null;
}
}
public static void main(String[] args) {
Animal cat = new Cat("元宝",2); // 1. 直接赋值:子类对象赋值给父类对象
Dog dog = new Dog("小七", 1);
eatFood(cat);
eatFood(dog);
Animal animal = buyAnimal("狗");
animal.eat();
animal = buyAnimal("猫");
animal.eat();
}
}
多态的优缺点
优点
1. 能够降低代码的 "圈复杂度", 避免使用大量的 if - else
什么叫 "圈复杂度" ?
圈复杂度是一种描述一段代码复杂程度的方式. 一段代码如果平铺直叙, 那么就比较简单容易理解. 而如果有很多的条件分支或者循环语句, 就认为理解起来更复杂.
因此我们可以简单粗暴的计算一段代码中条件语句和循环语句出现的个数, 这个个数就称为 "圈复杂度".
如果一个方法的圈复杂度太高, 就需要考虑重构.
不同公司对于代码的圈复杂度的规范不一样. 一般不会超过 10
2. 可扩展能力更强
缺陷
1.多态缺陷:代码的运行效率降低。
以上就是Java面对对象的三大特性之一,多态的全部内容了。