美文网首页
java-多态的理解

java-多态的理解

作者: 有腹肌的豌豆Z | 来源:发表于2020-09-01 08:00 被阅读0次

什么是多态

  • 面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。
  • 多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)。
  • 实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
  • 多态的作用:消除类型之间的耦合关系。
  • 现实中,关于多态的例子不胜枚举。比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。
  • 多态存在的三个必要条件 1、要有继承; 2、要有重写; 3、父类引用指向子类对象。

上菜

public class A {

    public String show(D obj) {              //方法一
        return ("A and D");
    }

    public String show(A obj) {              //方法二
        return ("A and A");
    }

    static class B extends A {

        public String show(B obj) {              //方法三
            return ("B and B");
        }

        public String show(A obj) {              //方法四
            return ("B and A");
        }
    }

    static class C extends B {

    }

    static class D extends B {

    }


    public static void main(String[] args) {
        A a2 = new B();

        A a1 = new A();
        B b = new B();
        C c = new C();
        D d = new D();

        System.out.println("1--" + a1.show(b));
        System.out.println("2--" + a1.show(c));
        System.out.println("3--" + a1.show(d));

        // 创建了B对象 类型是A ,调用超类函数,子类重写了 调用子类的
        System.out.println("4--" + a2.show(b));
        System.out.println("5--" + a2.show(c));
        System.out.println("6--" + a2.show(d));

        // 子类没有 去找超类
        System.out.println("7--" + b.show(b));
        System.out.println("8--" + b.show(c));
        System.out.println("9--" + b.show(d));
        
        System.out.println("10--" + d.show(d));

    }

}

实验结果

1--A and A
2--A and A
3--A and D
4--B and A
5--B and A
6--A and D
7--B and B
8--B and B
9--A and D
10--A and D

让我们分析一下,理清其中各个类的继承关系

  • 那我们开始分析输出A a1 = new A();这是普通的创建对象,故a1拥有调用方法一和方法二的能力。那么究竟调用哪个方法呢,这里面涉及方法的重载。其实,在编译的时候,编译器已经进行了前期绑定,即把show();方法与类中的方法主体2进行绑定。就是说,在编译时,系统就已经知道应该调用哪个方法,即使你有方法的重载。
  • 故 a1.show(b)会与方法二绑定;a1.show(c)会与方法二绑定;a1.show(d)会与方法一绑定。且都在编译时完成绑定。
  • 但A a2 = new B();就涉及了多态 了,B实现了向上转型。创建了一个父类引用,指向子类对象。这样的做法很常见,因为这样不仅增加了灵活性(父类引用可以随时指向任意子类对象),也提高了扩展性。但要知道的是,向上转型的缺点,就是不能调用子类中有而父类没有的方法
  • 故A a2 = new B();中,方法四对方法二进行了重写,所以a2拥有调用方法一和方法四的能力,而方法三不能调用(由上一段可知)。所以,在编译时, a2.show(b)会与方法四绑定; a2.show(c)会与方法四绑定; a2.show(d)会与方法一绑定。
  • B b = new B();这是普通的创建子类对象,B继承于A,且方法四重写了方法二,所以b拥有调用方法一,方法三,方法四的能力。所以b.show(b)会与方法三绑定,b.show(c)会与方法三绑定,b.show(d)会与方法一绑定。

相关文章

  • java-多态的理解

    什么是多态 面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一...

  • Java-多态

    面向对象的程序设计语言的三大特征是:抽象、继承、多态 封装通过合并特征和行为来创建新的数据类型。实现隐藏则通过将私...

  • Java-基础-多态

    在继承关系中,子类如果定义了一个与父类方法签名完全相同的方法,被称为覆写(Override)Person类 Stu...

  • JAVA面向对象学习(多态性)

    多态性的理解和应用 1.1. 多态性的理解 多态性:在Java中,多态性是它的一大特性,可以理解成为是事物的多种形...

  • Java-面向对象-多态

    多态 体现 好处 提高了程序的扩展性。 弊端 前提 子类的特有方法如何调用呢? 向下转型的注意事项 转型总结 多态...

  • Java- 继承和多态

    Java- 继承和多态 可以从现有的类派生出新类。这称为类的继承。新类称为次类、子类或派生类。现有的类称为超类、父...

  • [Java]重学Java-多态

    从一个例子理解多态 对于一个不同特征的对象,使用接口可以隐藏子类的行为,对外暴露同一个接口,从而实现编程的解耦. ...

  • 多态的理解

    多态的概念和作用(深入理解) - 流寂 - 博客园

  • 多态的理解

    定义 指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就...

  • 多态的理解

    多态就是把不同对象抽象出共性但还保留之前的属性。

网友评论

      本文标题:java-多态的理解

      本文链接:https://www.haomeiwen.com/subject/zriojktx.html