Java多态之向上转型

Java多态之向上转型

多态性是面向对象的第三大特征。ide

多态的优势

  • 改善代码的组织结构和可读性。
  • 可以建立可扩展的程序。(随时能够加入新功能
  • 消除类型之间的耦合关系。

说实话,做为小白的我,并不太可以理解上面三个优势。随着深刻学习,理解应该会愈来愈深吧,共勉。学习

向上转型

概念

Java容许把子类对象赋值给父类的引用变量,不用作任何强制转换,系统自动完成。向上转型来自于自下而上的继承关系,子类继承父类,子类是一种特殊的父类,因此向上转型的操做实际上是情理之中的。测试

下面依照简单的代码,来试着理解向上转型的概念与好处。code

package com.my.pac14;

/**
 * @auther Summerday
 */
public class DynamicBinding {
    //Object是全部类的超类,根据向上转型,该方法能够接受任何类型的对象
    public static void test(Object x) {
        System.out.println(x.toString());
    }

    public static void main(String[] args) {
        test(new PrimaryStudent());//Student
        test(new Student());//Student
        test(new Person());//Person
        test(new Object());//java.lang.Object@1b6d3586
    }
}

class Person extends Object {
    @Override
    public String toString() {
        return "Person";
    }
}

class Student extends Person {
    @Override
    public String toString() {
        return "Student";
    }
}

class PrimaryStudent extends Student {
}
  • 咱们能够看到,下面的方法接收一个Object类型的对象,并调用该对象的toString()方法。
public static void test(Object x) {
        System.out.println(x.toString());
    }
  • 下面是调用语句,除了第四句,其余的传入对象都看起来与形参类型不符,但固然是能够运行的,这里面就蕴含着咱们说的向上转型
public static void main(String[] args) {
    test(new PrimaryStudent());//Student
    test(new Student());//Student
    test(new Person());//Person
    test(new Object());//java.lang.Object@1b6d3586
}
  • 就拿传入Student类型的对象来讲吧,拆解一下,是如下的表达式:
Object x = new Student();
  • Object类是全部类的超类,上式中将建立的子类类型对象直接赋给父类类型的引用变量,这在Java中是容许的,这就是所谓的向上转型。可以实现的缘由,也是由于子类在向上转型的过程当中,也许会缩小接口,但至少不会比父类中有的接口还要窄

举个简单的例子,假设人类能够分为不少不少种,咱们能够说学生是人类的一种,却不能说人类是学生的一种。向上转型必定程度上容许子类扩展超类的部分丢失,经过父类引用变量只能调用父类中的方法来实现,咱们去操做人类的时候,只能在人类具备的行为属性中作选择,而不能直接以学生类的标准去操做它,由于咱们并不知道他是哪一类,万一不是学生呢,对吧,用人类总没错,由于我人类有的东西,你学生类必定有。这就是我所理解的向上转型。对象

向上转型好在哪

若是没有向上转型机制,咱们想要达到原来的效果,就须要增长许多重载的test方法,这样就显得过于繁琐。若是要增长相似test()的方法或者添加从Object导出的新类,还会作更多复杂的操做,不利于扩展,不可取不可取。继承

// 原来的状况:须要建立不少不少的测试方法。
    public static void test(Object x) {
        System.out.println(x.toString());
    }
    public static void test(Person x) {
        System.out.println(x.toString());
    }
    public static void test(Student x) {
        System.out.println(x.toString());
    }
    public static void test(PrimaryStudent x) {
        System.out.println(x.toString());
    }

多态的存在正好解决了这个棘手的问题,为了利于扩展,只须要写一个仅接收基类做为参数的简单方法,无论导出类如何,在运行时自动选择调用对应导出类的方法,真的就很舒服。接口

那么,编译器又是如何肯定应该调用哪一个方法呢?这就涉及到所谓的“绑定”啦,这个呢,咱们在下片总结。编译器

参考书籍:《Thinking in Java》it

相关文章
相关标签/搜索