对JAVA中多态的粗浅理解

2024-10-09 15:26:27 浏览数 (1)

一.向上转移和向下转型及优缺点:

1 . 向上转移 :实际就是创建一个子类对象,将其当成父类对象来使用。或者这样理解 (父类的引用引用了子类的对象)。

向上转移共有三种形式:

1. 直接赋值:语法格式:父类类型 对象名 = new 子类类型()

2. 方法传参

3. 方法返回

如下代码:这里父类是Animal,子类是Dog.

代码语言:javascript复制
/* public static void func(Animal animal) {
   2.方法的传参
        animal.voice();
    }*/

    /*public static Animal func1() {
    3.方法的返回值
        Dog dog = new Dog("wangcai", 4);
        return dog;
    }*/

下面是main方法当中:

代码语言:javascript复制
//向上转型
        //1.直接赋值
        Animal animal = new Dog("wangcai", 2);

        Dog dog = new Dog("wangcai", 4);
        //2.方法的传参
        func(dog);

        //3.方法的返回值
        Animal animal2 = func1();
        System.out.println(animal2);

优缺点:

向上转型的优点:让代码实现更简单灵活。

向上转型的缺陷:不能调用到子类特有的方法。 (当子类重写了,父类方法会发生动态绑定)这个马上后面会讲。

2.向下转型: 向下转型用的比较少,而且不安全,万一转换失败,运行时就会抛异常。这里举个简单例子就可以了,其实就是反过来。通俗理解:就是把父类给子类。

代码如下: 这里同样,父类是Animal,子类是Dog.

代码语言:javascript复制
public class Test {
    public static void main(String[] args) {
     
        Animal animal = new Dog("wangcai", 2);
        Dog dog = (Dog) animal;
        dog.eat();
    }
}

二.重写:

重载重写区别:

1.重写 (override) :也称为覆盖。重写是子类对父类非静态、非 private 修饰,非 final 修饰,非构造方法等的实现过程 进行重新编写, 返回值和形参都不能改变(也有一种特殊情况)

2. 方法重写的规则:

(1)子类在重写父类的方法时,一般必须与父类方法原型一致: 返回值类型 方法名 (参数列表) 要完一致

(2)被重写的方法返回值类型可以不同,但是必须是具有父子关系的(种特殊情况)如图:

(3) 访问权限 不能 比父类中被重写的方法的访问权限更低

(4)父类被static、private修饰的方法、构造方法都不能被重写。

(5) 重写的方法 , 可以使用 @Override 注解来显式指定 . 有了这个注解能帮我们进行一些合法性校验

3. 静态绑定 :也称为前期绑定 ( 早绑定 ) ,即在编译时,根据用户所传递实参类型就确定了具体调用那个方法。典型代表函数重载

动态绑定 :也称为后期绑定 ( 晚绑定 ) ,即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体调用那个类的方法。

动态绑定发生条件:(要发生 继承 关系,要发生 重写 ,要发生 向上转行 下面给个例子如图:

​​​​​​​

运行结果:不是吃东西而是吃猫粮

3.原理解释:这里可以反汇编查看,这个animal的调用。其实是父类的Animal调用了重写的方法。

以上就是动态绑定。是理解多态的关键。

我随手画了个草图,也可以这样理解动态绑定如图:

三.多态的概念 :要理解多态,就要先理解前面的动态绑定,和向上转型。

1. 多态的概念:通俗来说,就是多种形态, 具体点就是去完成某个行为,当不同的对象去完成时会产生出不同 的状 态。

四.多态实现条件:

1. 必须在继承体系下

2. 子类必须要对父类中方法进行重写

3. 通过父类的引用调用重写的方法

多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法。

多态代码例子呈现:这里有 两个对象 dog ,和 cat 都调用了同一个方法,呈现出不同的结果,这就是多态。

不同的运行结果:

五.多态的优缺点:

优点:1.能够降低代码的 "圈复杂度" , 避免使用大量的 if - else

什么叫 "圈复杂度" ?

圈复杂度是一种描述一段代码复杂程度的方式. 一段代码如果平铺直叙, 那么就比较简单容易理解. 而如果有很多的条件分支或者循环语句, 就认为理解起来更复杂.因此我们可以简单粗暴的计算一段代码中条件语句和循环语句出现的个数, 这个个数就称为 "圈复杂度".

如果一个方法的圈复杂度太高, 就需要考虑重构.

不同公司对于代码的圈复杂度的规范不一样. 一般不会超过 10

2. 可扩展能力更强

多态缺陷:代码的运行效率降低

0 人点赞