0
点赞
收藏
分享

微信扫一扫

Java之多态详解

水沐由之 2022-03-30 阅读 95
javaidea

文章目录

写在前面

博客写到这里,我们可以说对Java语法有了初步的了解了,多态是三大特点里面最抽象的形式.我们需要一点点来了解.

向上转型

我们不是要学习多态吗?,向上转型是什么玩意儿,这是我们学习多态的基础.向上转型就是父类引用子类的对象.

在谈这之前,我们需要知道什么是上,什么是下.

image-20220327155228942

用代码来表示就是

## 发生向上转型的方式

发生向上转型的方式有以下三种方式

  1. 直接赋值
  2. 函数传参
  3. 作为函数的返回值

下面我们一一举例

直接赋值

函数传参

返回值

向上转型的注意事项

父类引用子类的对象后,只能够使用父类里面的字段和方法,我们要注意这一点

image-20220327173305697

image-20220327180820652

向上转型的作用

出现一个事物肯定是这个有用,我们来说说向上转型的作用,我们看看下面的代码

我们可以很容易的得出结果,很简单

image-20220327172227786

那要是下面的代码呢?我们就很疑惑了

image-20220327172525598

动态绑定

说到动态绑定,我还是更喜欢叫他运行时绑定,我们对于上面现象可能会感觉到新奇,多态的出现大大优化了我们使用代码的能力.

使用动态绑定需要满足一下条件

  1. 父类引用子类的对象
  2. 子类中存在重写的方法

重写

我记得不久前我们看过函数的重载,这里的重写的形式一样,但是内含完全不一样,所谓的重写就是我们重新在子类中再次些父类中的方法,上面的eat方法就是重写

重写也要满足一定的要求

  1. 父类和子类都有
  2. 方法名相同
  3. 参数类型和数量一样
  4. 返回类型也相同,但是要是返回类型构成协变类型,也可以有那么稍稍不同,注意一下就可以了
  5. 子类中的访问修饰限定符 的权限>= 父类的
  6. private 修饰方法不能重写,final修饰的也不能重写

为何叫动态绑定

我们为何取这个名字,为啥不叫阿猫阿狗,这是有原因的,我们反编译一下(如何编译不用了解)

image-20220327175034637

存在静态绑定吗

存在的,我们之前学的函数重载就是静态绑定

向下转型

抱歉,有向上转型,那就有向下转型,就是子类对父类的引用,不过我们并不建议这么做,会出现一定的风险

image-20220327183635686

理解多态

到这里,我们就可以很容易理解多态了,我们使用多态就要依赖动态绑定和重写方法

class Shape {
    public void draw() {

    }
}
class Triangle extends Shape {
    @Override
    public void draw() {
        System.out.println("打印一个🔺");
    }
}
class Round extends Shape {
    @Override
    public void draw() {
        System.out.println("打印一个⚪");
    }
}

public class TestDemo {
    public static void main(String[] args) {
        Shape shape1 = new Triangle();
        shape1.draw();

        Shape shape2 = new Round();
        shape2.draw();
    }
}

image-20220327185036550

下面的代码就可以很好的表示多态的优点

public class TestDemo {
    public static void drawMap(Shape shape) {
        shape.draw();
    }
    public static void main(String[] args) {

        drawMap(new Triangle());
        drawMap(new Round());

    }
}

image-20220327185334161

  1. 封装使得代码的安全性提高
  2. 多态的核心都是让调用者不必关注对象的具体类型 ,这是降低用户使用成本的一种重要方式

378910375)]

下面的代码就可以很好的表示多态的优点

public class TestDemo {
    public static void drawMap(Shape shape) {
        shape.draw();
    }
    public static void main(String[] args) {

        drawMap(new Triangle());
        drawMap(new Round());

    }
}

[外链图片转存中…(img-3Kd0YqXw-1648378910375)]

  1. 封装使得代码的安全性提高
  2. 多态的核心都是让调用者不必关注对象的具体类型 ,这是降低用户使用成本的一种重要方式
举报

相关推荐

0 条评论